Bug 410114 - "Simplify nsTransform2D" [p=alfredkayser@gmail.com (Alfred Kayser) r+sr=roc a1.9=damons]

This commit is contained in:
reed@reedloden.com 2008-02-26 01:42:36 -08:00
parent 5026ea36ad
commit 70e372f1fb
3 changed files with 12 additions and 447 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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;