зеркало из https://github.com/mozilla/pjs.git
Bug 410114 - "Simplify nsTransform2D" [p=alfredkayser@gmail.com (Alfred Kayser) r+sr=roc a1.9=damons]
This commit is contained in:
Родитель
df0a627cfc
Коммит
c6632d60fc
|
@ -20,6 +20,7 @@
|
|||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* michaelp 09-25-97 1:56pm
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
|
@ -41,10 +42,6 @@
|
|||
#include "gfxCore.h"
|
||||
#include "nsCoord.h"
|
||||
|
||||
#define MG_2DIDENTITY 0
|
||||
#define MG_2DTRANSLATION 1
|
||||
#define MG_2DSCALE 2
|
||||
|
||||
class NS_GFX nsTransform2D
|
||||
{
|
||||
private:
|
||||
|
@ -61,202 +58,59 @@ private:
|
|||
**/
|
||||
|
||||
float m00, m11, m20, m21;
|
||||
PRUint16 type;
|
||||
|
||||
public:
|
||||
nsTransform2D(void) { SetToIdentity(); }
|
||||
nsTransform2D(nsTransform2D *aTransform2D) { SetMatrix(aTransform2D); }
|
||||
nsTransform2D(void) { m20 = m21 = 0.0f; m00 = m11 = 1.0f; }
|
||||
nsTransform2D(nsTransform2D *aTransform2D) {
|
||||
m00 = aTransform2D->m00;
|
||||
m11 = aTransform2D->m11;
|
||||
m20 = aTransform2D->m20;
|
||||
m21 = aTransform2D->m21;
|
||||
}
|
||||
|
||||
~nsTransform2D(void) { }
|
||||
|
||||
/**
|
||||
* get the type of this transform
|
||||
*
|
||||
* @param
|
||||
* @return type from above set
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
PRUint16 GetType(void) const { return type; }
|
||||
|
||||
/**
|
||||
* set this transform to identity
|
||||
*
|
||||
* @param
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetToIdentity(void) { m20 = m21 = 0.0f; m00 = m11 = 1.0f; type = MG_2DIDENTITY; }
|
||||
|
||||
/**
|
||||
* set this transform to a scale
|
||||
*
|
||||
* @param sx, x scale
|
||||
* @param sy, y scale
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetToScale(float sx, float sy) { m00 = sx; m11 = sy; m20 = m21 = 0.0f; type = MG_2DSCALE; }
|
||||
|
||||
|
||||
/**
|
||||
* set this transform to a translation
|
||||
*
|
||||
* @param tx, x translation
|
||||
* @param ty, y translation
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetToTranslate(float tx, float ty) { m00 = m11 = 1.0f; m20 = tx; m21 = ty; type = MG_2DTRANSLATION; }
|
||||
void SetToTranslate(float tx, float ty) { m00 = m11 = 1.0f; m20 = tx; m21 = ty; }
|
||||
|
||||
|
||||
/**
|
||||
* get the translation portion of this transform
|
||||
*
|
||||
* @param pt, Point to return translation values in
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void GetTranslation(float *ptX, float *ptY) const { *ptX = m20; *ptY = m21; }
|
||||
void GetTranslationCoord(nscoord *ptX, nscoord *ptY) const { *ptX = NSToCoordRound(m20); *ptY = NSToCoordRound(m21); }
|
||||
|
||||
/**
|
||||
* set the translation portion of this transform
|
||||
*
|
||||
* @param tx, x translation
|
||||
* @param ty, y translation
|
||||
* @exception
|
||||
**/
|
||||
|
||||
void SetTranslation(float tX, float tY) {
|
||||
m20 = tX;
|
||||
m21 = tY;
|
||||
type |= MG_2DTRANSLATION;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the X translation portion of this transform
|
||||
*
|
||||
* @param
|
||||
* @returns x component of translation
|
||||
* @exception
|
||||
**/
|
||||
|
||||
float GetXTranslation(void) const { return m20; }
|
||||
nscoord GetXTranslationCoord(void) const { return NSToCoordRound(m20); }
|
||||
|
||||
/**
|
||||
* get the Y translation portion of this transform
|
||||
*
|
||||
* @param
|
||||
* @returns y component of translation
|
||||
* @exception
|
||||
**/
|
||||
|
||||
float GetYTranslation(void) const { return m21; }
|
||||
nscoord GetYTranslationCoord(void) const { return NSToCoordRound(m21); }
|
||||
|
||||
/**
|
||||
* set this matrix and type from another Transform2D
|
||||
*
|
||||
* @param aTransform2D is the Transform2D to be copied from
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetMatrix(nsTransform2D *aTransform2D);
|
||||
|
||||
/**
|
||||
* post-multiply a new Transform
|
||||
*
|
||||
* @param newxform new Transform2D
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void Concatenate(nsTransform2D *newxform);
|
||||
|
||||
/**
|
||||
* pre-multiply a new Transform
|
||||
*
|
||||
* @param newxform new Transform2D
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void PreConcatenate(nsTransform2D *newxform);
|
||||
|
||||
/**
|
||||
* apply nontranslation portion of matrix to vector
|
||||
*
|
||||
* @param pt Point to transform
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void TransformNoXLate(float *ptX, float *ptY) const;
|
||||
void TransformNoXLateCoord(nscoord *ptX, nscoord *ptY) const;
|
||||
|
||||
/**
|
||||
* apply matrix to vector
|
||||
*
|
||||
* @param pt Point to transform
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void Transform(float *ptX, float *ptY) const;
|
||||
void TransformCoord(nscoord *ptX, nscoord *ptY) const;
|
||||
|
||||
/**
|
||||
* apply matrix to rect
|
||||
*
|
||||
* @param rect Rect to transform
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void Transform(float *aX, float *aY, float *aWidth, float *aHeight) const;
|
||||
void TransformCoord(nscoord *aX, nscoord *aY, nscoord *aWidth, nscoord *aHeight) const;
|
||||
void TransformNoXLateCoord(nscoord *aX, nscoord *aY, nscoord *aWidth, nscoord *aHeight) const;
|
||||
|
||||
/**
|
||||
* Scale an array of X/Y coordinates by the X/Y scale factor in the
|
||||
* matrix. The scale is done as if the other coordinate were zero.
|
||||
*
|
||||
* @param aSrc Base of coordinate input array
|
||||
* @param aDst Base of coordinate output array
|
||||
* @param aNumCoords Number of coordinates to scale
|
||||
*/
|
||||
void ScaleXCoords(const nscoord* aSrc, PRUint32 aNumCoords, PRIntn* aDst) const;
|
||||
void ScaleYCoords(const nscoord* aSrc, PRUint32 aNumCoords, PRIntn* aDst) const;
|
||||
|
||||
/**
|
||||
* add a translation to a Transform via x, y pair
|
||||
*
|
||||
* @param ptX x value to add as x translation
|
||||
* @param ptY y value to add as y translation
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void AddTranslation(float ptX, float ptY);
|
||||
|
||||
/**
|
||||
* add a scale to a Transform via x, y pair
|
||||
*
|
||||
* @param ptX x value to add as x scale
|
||||
* @param ptY y value to add as y scale
|
||||
* @exception
|
||||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void AddScale(float ptX, float ptY);
|
||||
void AddScale(float ptX, float ptY) { m00 *= ptX; m11 *= ptY; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -38,241 +38,10 @@
|
|||
|
||||
#include "nsTransform2D.h"
|
||||
|
||||
void nsTransform2D :: SetMatrix(nsTransform2D *aTransform2D)
|
||||
{
|
||||
m00 = aTransform2D->m00;
|
||||
m11 = aTransform2D->m11;
|
||||
m20 = aTransform2D->m20;
|
||||
m21 = aTransform2D->m21;
|
||||
type = aTransform2D->type;
|
||||
}
|
||||
|
||||
void nsTransform2D :: Concatenate(nsTransform2D *newxform)
|
||||
{
|
||||
PRUint16 newtype = newxform->type;
|
||||
|
||||
if (newtype == MG_2DIDENTITY)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (type == MG_2DIDENTITY)
|
||||
{
|
||||
SetMatrix(newxform);
|
||||
return;
|
||||
}
|
||||
else if ((type & MG_2DSCALE) != 0)
|
||||
{
|
||||
//current matrix is at least scale
|
||||
|
||||
if ((newtype & MG_2DSCALE) != 0)
|
||||
{
|
||||
//new matrix is scale
|
||||
|
||||
if ((newtype & MG_2DTRANSLATION) != 0)
|
||||
{
|
||||
m20 += newxform->m20 * m00;
|
||||
m21 += newxform->m21 * m11;
|
||||
}
|
||||
|
||||
m00 *= newxform->m00;
|
||||
m11 *= newxform->m11;
|
||||
}
|
||||
else
|
||||
{
|
||||
//new matrix must be translation only
|
||||
|
||||
m20 += newxform->m20 * m00;
|
||||
m21 += newxform->m21 * m11;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//current matrix is translation only
|
||||
|
||||
if ((newtype & MG_2DSCALE) != 0)
|
||||
{
|
||||
//new matrix is scale
|
||||
|
||||
if ((newtype & MG_2DTRANSLATION) != 0)
|
||||
{
|
||||
m20 += newxform->m20;
|
||||
m21 += newxform->m21;
|
||||
}
|
||||
|
||||
m00 = newxform->m00;
|
||||
m11 = newxform->m11;
|
||||
}
|
||||
else
|
||||
{
|
||||
//new matrix must be translation only
|
||||
|
||||
m20 += newxform->m20;
|
||||
m21 += newxform->m21;
|
||||
}
|
||||
}
|
||||
|
||||
type |= newtype;
|
||||
}
|
||||
|
||||
void nsTransform2D :: PreConcatenate(nsTransform2D *newxform)
|
||||
{
|
||||
float new00 = newxform->m00;
|
||||
float new11 = newxform->m11;
|
||||
|
||||
m00 *= new00;
|
||||
m11 *= new11;
|
||||
m20 = m20 * new00 + newxform->m20;
|
||||
m21 = m21 * new11 + newxform->m21;
|
||||
|
||||
type |= newxform->type;
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformNoXLate(float *ptX, float *ptY) const
|
||||
{
|
||||
if ((type & MG_2DSCALE) != 0) {
|
||||
*ptX *= m00;
|
||||
*ptY *= m11;
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformNoXLateCoord(nscoord *ptX, nscoord *ptY) const
|
||||
{
|
||||
if ((type & MG_2DSCALE) != 0) {
|
||||
*ptX = NSToCoordRound(*ptX * m00);
|
||||
*ptY = NSToCoordRound(*ptY * m11);
|
||||
}
|
||||
}
|
||||
|
||||
inline PRIntn NSToIntNFloor(float aValue)
|
||||
{
|
||||
return PRIntn(floor(aValue));
|
||||
}
|
||||
|
||||
void nsTransform2D :: ScaleXCoords(const nscoord* aSrc,
|
||||
PRUint32 aNumCoords,
|
||||
PRIntn* aDst) const
|
||||
{
|
||||
const nscoord* end = aSrc + aNumCoords;
|
||||
|
||||
if (type == MG_2DIDENTITY){
|
||||
while (aSrc < end ) {
|
||||
*aDst++ = PRIntn(*aSrc++);
|
||||
}
|
||||
} else {
|
||||
float scale = m00;
|
||||
while (aSrc < end) {
|
||||
nscoord c = *aSrc++;
|
||||
*aDst++ = NSToIntNFloor(c * scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: ScaleYCoords(const nscoord* aSrc,
|
||||
PRUint32 aNumCoords,
|
||||
PRIntn* aDst) const
|
||||
{
|
||||
const nscoord* end = aSrc + aNumCoords;
|
||||
|
||||
if (type == MG_2DIDENTITY){
|
||||
while (aSrc < end ) {
|
||||
*aDst++ = PRIntn(*aSrc++);
|
||||
}
|
||||
} else {
|
||||
float scale = m11;
|
||||
while (aSrc < end) {
|
||||
nscoord c = *aSrc++;
|
||||
*aDst++ = NSToIntNFloor(c * scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void nsTransform2D :: Transform(float *ptX, float *ptY) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
break;
|
||||
|
||||
case MG_2DTRANSLATION:
|
||||
*ptX += m20;
|
||||
*ptY += m21;
|
||||
break;
|
||||
|
||||
case MG_2DSCALE:
|
||||
*ptX *= m00;
|
||||
*ptY *= m11;
|
||||
break;
|
||||
|
||||
case MG_2DSCALE | MG_2DTRANSLATION:
|
||||
*ptX = *ptX * m00 + m20;
|
||||
*ptY = *ptY * m11 + m21;
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_ASSERTION(0, "illegal type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformCoord(nscoord *ptX, nscoord *ptY) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
break;
|
||||
|
||||
case MG_2DTRANSLATION:
|
||||
*ptX += NSToCoordRound(m20);
|
||||
*ptY += NSToCoordRound(m21);
|
||||
break;
|
||||
|
||||
case MG_2DSCALE:
|
||||
*ptX = NSToCoordRound(*ptX * m00);
|
||||
*ptY = NSToCoordRound(*ptY * m11);
|
||||
break;
|
||||
|
||||
case MG_2DSCALE | MG_2DTRANSLATION:
|
||||
*ptX = NSToCoordRound(*ptX * m00 + m20);
|
||||
*ptY = NSToCoordRound(*ptY * m11 + m21);
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_ASSERTION(0, "illegal type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: Transform(float *aX, float *aY, float *aWidth, float *aHeight) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
break;
|
||||
|
||||
case MG_2DTRANSLATION:
|
||||
*aX += m20;
|
||||
*aY += m21;
|
||||
break;
|
||||
|
||||
case MG_2DSCALE:
|
||||
*aX *= m00;
|
||||
*aY *= m11;
|
||||
*aWidth *= m00;
|
||||
*aHeight *= m11;
|
||||
break;
|
||||
|
||||
case MG_2DSCALE | MG_2DTRANSLATION:
|
||||
*aX = *aX * m00 + m20;
|
||||
*aY = *aY * m11 + m21;
|
||||
*aWidth *= m00;
|
||||
*aHeight *= m11;
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_ASSERTION(0, "illegal type");
|
||||
break;
|
||||
}
|
||||
*ptX = NSToCoordRound(*ptX * m00 + m20);
|
||||
*ptY = NSToCoordRound(*ptY * m11 + m21);
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformCoord(nscoord *aX, nscoord *aY, nscoord *aWidth, nscoord *aHeight) const
|
||||
|
@ -284,50 +53,3 @@ void nsTransform2D :: TransformCoord(nscoord *aX, nscoord *aY, nscoord *aWidth,
|
|||
*aWidth = x2 - *aX;
|
||||
*aHeight = y2 - *aY;
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformNoXLateCoord(nscoord *aX, nscoord *aY, nscoord *aWidth, nscoord *aHeight) const
|
||||
{
|
||||
nscoord x2 = *aX + *aWidth;
|
||||
nscoord y2 = *aY + *aHeight;
|
||||
TransformNoXLateCoord(aX, aY);
|
||||
TransformNoXLateCoord(&x2, &y2);
|
||||
*aWidth = x2 - *aX;
|
||||
*aHeight = y2 - *aY;
|
||||
}
|
||||
|
||||
void nsTransform2D :: AddTranslation(float ptX, float ptY)
|
||||
{
|
||||
if (type == MG_2DIDENTITY)
|
||||
{
|
||||
m20 = ptX;
|
||||
m21 = ptY;
|
||||
}
|
||||
else if ((type & MG_2DSCALE) != 0)
|
||||
{
|
||||
m20 += ptX * m00;
|
||||
m21 += ptY * m11;
|
||||
}
|
||||
else
|
||||
{
|
||||
m20 += ptX;
|
||||
m21 += ptY;
|
||||
}
|
||||
|
||||
type |= MG_2DTRANSLATION;
|
||||
}
|
||||
|
||||
void nsTransform2D :: AddScale(float ptX, float ptY)
|
||||
{
|
||||
if ((type == MG_2DIDENTITY) || (type == MG_2DTRANSLATION))
|
||||
{
|
||||
m00 = ptX;
|
||||
m11 = ptY;
|
||||
}
|
||||
else
|
||||
{
|
||||
m00 *= ptX;
|
||||
m11 *= ptY;
|
||||
}
|
||||
|
||||
type |= MG_2DSCALE;
|
||||
}
|
||||
|
|
|
@ -1258,17 +1258,6 @@ nsBulletFrame::GetDesiredSize(nsPresContext* aCX,
|
|||
mComputedSize.width = mIntrinsicSize.width;
|
||||
mComputedSize.height = mIntrinsicSize.height;
|
||||
|
||||
#if 0 // don't do scaled images in bullets
|
||||
if (mComputedSize == mIntrinsicSize) {
|
||||
mTransform.SetToIdentity();
|
||||
} else {
|
||||
if (mComputedSize.width != 0 && mComputedSize.height != 0) {
|
||||
mTransform.SetToScale(float(mIntrinsicSize.width) / float(mComputedSize.width),
|
||||
float(mIntrinsicSize.height) / float(mComputedSize.height));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
aMetrics.width = mComputedSize.width;
|
||||
aMetrics.ascent = aMetrics.height = mComputedSize.height;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче