зеркало из https://github.com/mozilla/gecko-dev.git
Bug 291636. nsTransform2D can't handle rotations, never could, and never will, so don't bother with them. r+sr=roc, patch by Hans-Andreas Engel
This commit is contained in:
Родитель
0cc63cb388
Коммит
2931cd5810
|
@ -45,24 +45,29 @@
|
|||
#define MG_2DIDENTITY 0
|
||||
#define MG_2DTRANSLATION 1
|
||||
#define MG_2DSCALE 2
|
||||
#define MG_2DGENERAL 4
|
||||
|
||||
class NS_GFX nsTransform2D
|
||||
{
|
||||
private:
|
||||
//accelerators
|
||||
/**
|
||||
* This represents the following matrix (note that the order of row/column
|
||||
* indices is opposite to usual notation)
|
||||
*
|
||||
* / m00 0 m20 \
|
||||
* M = | 0 m11 m21 |
|
||||
* \ 0 0 1 /
|
||||
*
|
||||
* Transformation of a coordinate (x, y) is obtained by setting
|
||||
* v = (x, y, 1)^T and evaluating M . v
|
||||
**/
|
||||
|
||||
float m00, m01, m10, m11, m20, m21;
|
||||
float m00, m11, m20, m21;
|
||||
PRUint16 type;
|
||||
|
||||
public:
|
||||
//constructors
|
||||
|
||||
nsTransform2D(void) { SetToIdentity(); }
|
||||
nsTransform2D(nsTransform2D *aTransform2D) { SetMatrix(aTransform2D); }
|
||||
|
||||
//destructor
|
||||
|
||||
~nsTransform2D(void) { }
|
||||
|
||||
/**
|
||||
|
@ -84,7 +89,7 @@ public:
|
|||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetToIdentity(void) { m01 = m10 = m20 = m21 = 0.0f; m00 = m11 = 1.0f; type = MG_2DIDENTITY; }
|
||||
void SetToIdentity(void) { m20 = m21 = 0.0f; m00 = m11 = 1.0f; type = MG_2DIDENTITY; }
|
||||
|
||||
/**
|
||||
* set this transform to a scale
|
||||
|
@ -95,7 +100,8 @@ public:
|
|||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetToScale(float sx, float sy);
|
||||
void SetToScale(float sx, float sy) { m00 = sx; m11 = sy; m20 = m21 = 0.0f; type = MG_2DSCALE; }
|
||||
|
||||
|
||||
/**
|
||||
* set this transform to a translation
|
||||
|
@ -106,7 +112,8 @@ public:
|
|||
* @author michaelp 09-25-97 1:56pm
|
||||
**/
|
||||
|
||||
void SetToTranslate(float tx, float ty);
|
||||
void SetToTranslate(float tx, float ty) { m00 = m11 = 1.0f; m20 = tx; m21 = ty; type = MG_2DTRANSLATION; }
|
||||
|
||||
|
||||
/**
|
||||
* get the translation portion of this transform
|
||||
|
|
|
@ -38,28 +38,9 @@
|
|||
|
||||
#include "nsTransform2D.h"
|
||||
|
||||
void nsTransform2D :: SetToScale(float sx, float sy)
|
||||
{
|
||||
m01 = m10 = m20 = m21 = 0.0f;
|
||||
m00 = sx;
|
||||
m11 = sy;
|
||||
type = MG_2DSCALE;
|
||||
}
|
||||
|
||||
void nsTransform2D :: SetToTranslate(float tx, float ty)
|
||||
{
|
||||
m01 = m10 = 0.0f;
|
||||
m00 = m11 = 1.0f;
|
||||
m20 = tx;
|
||||
m21 = ty;
|
||||
type = MG_2DTRANSLATION;
|
||||
}
|
||||
|
||||
void nsTransform2D :: SetMatrix(nsTransform2D *aTransform2D)
|
||||
{
|
||||
m00 = aTransform2D->m00;
|
||||
m01 = aTransform2D->m01;
|
||||
m10 = aTransform2D->m10;
|
||||
m11 = aTransform2D->m11;
|
||||
m20 = aTransform2D->m20;
|
||||
m21 = aTransform2D->m21;
|
||||
|
@ -68,28 +49,24 @@ void nsTransform2D :: SetMatrix(nsTransform2D *aTransform2D)
|
|||
|
||||
void nsTransform2D :: Concatenate(nsTransform2D *newxform)
|
||||
{
|
||||
float temp00, temp01, temp10, temp11;
|
||||
float new00, new01, new10, new11, new20, new21;
|
||||
PRUint16 newtype = newxform->type;
|
||||
|
||||
if (type == MG_2DIDENTITY)
|
||||
if (newtype == MG_2DIDENTITY)
|
||||
{
|
||||
//current matrix is identity
|
||||
|
||||
if (newtype != MG_2DIDENTITY)
|
||||
SetMatrix(newxform);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (newtype == MG_2DIDENTITY)
|
||||
else if (type == MG_2DIDENTITY)
|
||||
{
|
||||
SetMatrix(newxform);
|
||||
return;
|
||||
}
|
||||
else if ((type & MG_2DSCALE) != 0)
|
||||
{
|
||||
//current matrix is at least scale
|
||||
|
||||
if ((newtype & (MG_2DGENERAL | MG_2DSCALE)) != 0)
|
||||
if ((newtype & MG_2DSCALE) != 0)
|
||||
{
|
||||
//new matrix is general or scale
|
||||
//new matrix is scale
|
||||
|
||||
if ((newtype & MG_2DTRANSLATION) != 0)
|
||||
{
|
||||
|
@ -108,82 +85,13 @@ void nsTransform2D :: Concatenate(nsTransform2D *newxform)
|
|||
m21 += newxform->m21 * m11;
|
||||
}
|
||||
}
|
||||
else if ((type & MG_2DGENERAL) != 0)
|
||||
{
|
||||
//current matrix is at least general
|
||||
|
||||
if ((newtype & MG_2DGENERAL) != 0)
|
||||
{
|
||||
//new matrix is general - worst case
|
||||
|
||||
temp00 = m00;
|
||||
temp01 = m01;
|
||||
temp10 = m10;
|
||||
temp11 = m11;
|
||||
|
||||
new00 = newxform->m00;
|
||||
new01 = newxform->m01;
|
||||
new10 = newxform->m10;
|
||||
new11 = newxform->m11;
|
||||
|
||||
if ((newtype & MG_2DTRANSLATION) != 0)
|
||||
{
|
||||
new20 = newxform->m20;
|
||||
new21 = newxform->m21;
|
||||
|
||||
m20 += new20 * temp00 + new21 * temp10;
|
||||
m21 += new20 * temp01 + new21 * temp11;
|
||||
}
|
||||
|
||||
m00 = new00 * temp00 + new01 * temp10;
|
||||
m01 = new00 * temp01 + new01 * temp11;
|
||||
m10 = new10 * temp00 + new11 * temp10;
|
||||
m11 = new10 * temp01 + new11 * temp11;
|
||||
}
|
||||
else if ((newtype & MG_2DSCALE) != 0)
|
||||
{
|
||||
//new matrix is at least scale
|
||||
|
||||
temp00 = m00;
|
||||
temp01 = m01;
|
||||
temp10 = m10;
|
||||
temp11 = m11;
|
||||
|
||||
new00 = newxform->m00;
|
||||
new11 = newxform->m11;
|
||||
|
||||
if ((newtype & MG_2DTRANSLATION) != 0)
|
||||
{
|
||||
new20 = newxform->m20;
|
||||
new21 = newxform->m21;
|
||||
|
||||
m20 += new20 * temp00 + new21 * temp10;
|
||||
m21 += new20 * temp01 + new21 * temp11;
|
||||
}
|
||||
|
||||
m00 = new00 * temp00;
|
||||
m01 = new00 * temp01;
|
||||
m10 = new11 * temp10;
|
||||
m11 = new11 * temp11;
|
||||
}
|
||||
else
|
||||
{
|
||||
//new matrix must be translation only
|
||||
|
||||
new20 = newxform->m20;
|
||||
new21 = newxform->m21;
|
||||
|
||||
m20 += new20 * m00 + new21 * m10;
|
||||
m21 += new20 * m01 + new21 * m11;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//current matrix is translation only
|
||||
|
||||
if ((newtype & (MG_2DGENERAL | MG_2DSCALE)) != 0)
|
||||
if ((newtype & MG_2DSCALE) != 0)
|
||||
{
|
||||
//new matrix is general or scale
|
||||
//new matrix is scale
|
||||
|
||||
if ((newtype & MG_2DTRANSLATION) != 0)
|
||||
{
|
||||
|
@ -203,114 +111,35 @@ void nsTransform2D :: Concatenate(nsTransform2D *newxform)
|
|||
}
|
||||
}
|
||||
|
||||
/* temp00 = m00;
|
||||
temp01 = m01;
|
||||
temp10 = m10;
|
||||
temp11 = m11;
|
||||
temp20 = m20;
|
||||
temp21 = m21;
|
||||
|
||||
new00 = newxform.m00;
|
||||
new01 = newxform.m01;
|
||||
new10 = newxform.m10;
|
||||
new11 = newxform.m11;
|
||||
new20 = newxform.m20;
|
||||
new21 = newxform.m21;
|
||||
|
||||
m00 = new00 * temp00 + new01 * temp10; // + new02 * temp20 == 0
|
||||
m01 = new00 * temp01 + new01 * temp11; // + new02 * temp21 == 0
|
||||
// m02 += new00 * temp02 + new01 * temp12; // + new02 * temp22 == 0
|
||||
m10 = new10 * temp00 + new11 * temp10; // + new12 * temp20 == 0
|
||||
m11 = new10 * temp01 + new11 * temp11; // + new12 * temp21 == 0
|
||||
// m12 += new10 * temp02 + new11 * temp12; // + new12 * temp22 == 0
|
||||
m20 = new20 * temp00 + new21 * temp10 + temp20; // + new22 * temp20 == temp20
|
||||
m21 = new20 * temp01 + new21 * temp11 + temp21; // + new22 * temp21 == temp21
|
||||
// m22 += new20 * temp02 + new21 * temp12; // + new22 * temp22 == 1
|
||||
*/
|
||||
type |= newtype;
|
||||
}
|
||||
|
||||
void nsTransform2D :: PreConcatenate(nsTransform2D *newxform)
|
||||
{
|
||||
float temp00, temp01, temp10, temp11, temp20, temp21;
|
||||
float new00, new01, new10, new11;
|
||||
float new00 = newxform->m00;
|
||||
float new11 = newxform->m11;
|
||||
|
||||
//this is totally unoptimized MMP
|
||||
|
||||
temp00 = m00;
|
||||
temp01 = m01;
|
||||
temp10 = m10;
|
||||
temp11 = m11;
|
||||
temp20 = m20;
|
||||
temp21 = m21;
|
||||
|
||||
new00 = newxform->m00;
|
||||
new01 = newxform->m01;
|
||||
new10 = newxform->m10;
|
||||
new11 = newxform->m11;
|
||||
|
||||
m00 = temp00 * new00 + temp01 * new10; // + temp02 * new20 == 0
|
||||
m01 = temp00 * new01 + temp01 * new11; // + temp02 * new21 == 0
|
||||
// m02 += temp00 * new02 + temp01 * new12; // + temp02 * new22 == 0
|
||||
m10 = temp10 * new00 + temp11 * new10; // + temp12 * new20 == 0
|
||||
m11 = temp10 * new01 + temp11 * new11; // + temp12 * new21 == 0
|
||||
// m12 += temp10 * new02 + temp11 * new12; // + temp12 * new22 == 0
|
||||
m20 = temp20 * new00 + temp21 * temp10 + temp20; // + temp22 * new20 == new20
|
||||
m21 = temp20 * new01 + temp21 * new11 + temp21; // + temp22 * new21 == new21
|
||||
// m22 += temp20 * new02 + temp21 * new12; // + temp22 * new22 == 1
|
||||
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
|
||||
{
|
||||
float x, y;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
break;
|
||||
|
||||
case MG_2DSCALE:
|
||||
*ptX *= m00;
|
||||
*ptY *= m11;
|
||||
break;
|
||||
|
||||
default:
|
||||
case MG_2DGENERAL:
|
||||
x = *ptX;
|
||||
y = *ptY;
|
||||
|
||||
*ptX = x * m00 + y * m10;
|
||||
*ptY = x * m01 + y * m11;
|
||||
|
||||
break;
|
||||
if ((type & MG_2DSCALE) != 0) {
|
||||
*ptX *= m00;
|
||||
*ptY *= m11;
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformNoXLateCoord(nscoord *ptX, nscoord *ptY) const
|
||||
{
|
||||
float x, y;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
break;
|
||||
|
||||
case MG_2DSCALE:
|
||||
*ptX = NSToCoordRound(*ptX * m00);
|
||||
*ptY = NSToCoordRound(*ptY * m11);
|
||||
break;
|
||||
|
||||
default:
|
||||
case MG_2DGENERAL:
|
||||
x = (float)*ptX;
|
||||
y = (float)*ptY;
|
||||
|
||||
*ptX = NSToCoordRound(x * m00 + y * m10);
|
||||
*ptY = NSToCoordRound(x * m01 + y * m11);
|
||||
|
||||
break;
|
||||
if ((type & MG_2DSCALE) != 0) {
|
||||
*ptX = NSToCoordRound(*ptX * m00);
|
||||
*ptY = NSToCoordRound(*ptY * m11);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -360,8 +189,6 @@ const nscoord* end = aSrc + aNumCoords;
|
|||
|
||||
void nsTransform2D :: Transform(float *ptX, float *ptY) const
|
||||
{
|
||||
float x, y;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
|
@ -377,36 +204,19 @@ void nsTransform2D :: Transform(float *ptX, float *ptY) const
|
|||
*ptY *= m11;
|
||||
break;
|
||||
|
||||
case MG_2DGENERAL:
|
||||
x = *ptX;
|
||||
y = *ptY;
|
||||
|
||||
*ptX = x * m00 + y * m10;
|
||||
*ptY = x * m01 + y * m11;
|
||||
|
||||
break;
|
||||
|
||||
case MG_2DSCALE | MG_2DTRANSLATION:
|
||||
*ptX = *ptX * m00 + m20;
|
||||
*ptY = *ptY * m11 + m21;
|
||||
break;
|
||||
|
||||
default:
|
||||
case MG_2DGENERAL | MG_2DTRANSLATION:
|
||||
x = *ptX;
|
||||
y = *ptY;
|
||||
|
||||
*ptX = x * m00 + y * m10 + m20;
|
||||
*ptY = x * m01 + y * m11 + m21;
|
||||
|
||||
NS_ASSERTION(0, "illegal type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: TransformCoord(nscoord *ptX, nscoord *ptY) const
|
||||
{
|
||||
float x, y;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
|
@ -422,36 +232,19 @@ void nsTransform2D :: TransformCoord(nscoord *ptX, nscoord *ptY) const
|
|||
*ptY = NSToCoordRound(*ptY * m11);
|
||||
break;
|
||||
|
||||
case MG_2DGENERAL:
|
||||
x = (float)*ptX;
|
||||
y = (float)*ptY;
|
||||
|
||||
*ptX = NSToCoordRound(x * m00 + y * m10);
|
||||
*ptY = NSToCoordRound(x * m01 + y * m11);
|
||||
|
||||
break;
|
||||
|
||||
case MG_2DSCALE | MG_2DTRANSLATION:
|
||||
*ptX = NSToCoordRound(*ptX * m00 + m20);
|
||||
*ptY = NSToCoordRound(*ptY * m11 + m21);
|
||||
break;
|
||||
|
||||
default:
|
||||
case MG_2DGENERAL | MG_2DTRANSLATION:
|
||||
x = (float)*ptX;
|
||||
y = (float)*ptY;
|
||||
|
||||
*ptX = NSToCoordRound(x * m00 + y * m10 + m20);
|
||||
*ptY = NSToCoordRound(x * m01 + y * m11 + m21);
|
||||
|
||||
NS_ASSERTION(0, "illegal type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void nsTransform2D :: Transform(float *aX, float *aY, float *aWidth, float *aHeight) const
|
||||
{
|
||||
float x, y;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case MG_2DIDENTITY:
|
||||
|
@ -469,21 +262,6 @@ void nsTransform2D :: Transform(float *aX, float *aY, float *aWidth, float *aHei
|
|||
*aHeight *= m11;
|
||||
break;
|
||||
|
||||
case MG_2DGENERAL:
|
||||
x = *aX;
|
||||
y = *aY;
|
||||
|
||||
*aX = x * m00 + y * m10;
|
||||
*aY = x * m01 + y * m11;
|
||||
|
||||
x = *aWidth;
|
||||
y = *aHeight;
|
||||
|
||||
*aWidth = x * m00 + y * m10;
|
||||
*aHeight = x * m01 + y * m11;
|
||||
|
||||
break;
|
||||
|
||||
case MG_2DSCALE | MG_2DTRANSLATION:
|
||||
*aX = *aX * m00 + m20;
|
||||
*aY = *aY * m11 + m21;
|
||||
|
@ -492,19 +270,7 @@ void nsTransform2D :: Transform(float *aX, float *aY, float *aWidth, float *aHei
|
|||
break;
|
||||
|
||||
default:
|
||||
case MG_2DGENERAL | MG_2DTRANSLATION:
|
||||
x = *aX;
|
||||
y = *aY;
|
||||
|
||||
*aX = x * m00 + y * m10 + m20;
|
||||
*aY = x * m01 + y * m11 + m21;
|
||||
|
||||
x = *aWidth;
|
||||
y = *aHeight;
|
||||
|
||||
*aWidth = x * m00 + y * m10;
|
||||
*aHeight = x * m01 + y * m11;
|
||||
|
||||
NS_ASSERTION(0, "illegal type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -528,18 +294,9 @@ void nsTransform2D :: AddTranslation(float ptX, float ptY)
|
|||
}
|
||||
else if ((type & MG_2DSCALE) != 0)
|
||||
{
|
||||
//current matrix is at least scale
|
||||
|
||||
m20 += ptX * m00;
|
||||
m21 += ptY * m11;
|
||||
}
|
||||
else if ((type & MG_2DGENERAL) != 0)
|
||||
{
|
||||
//current matrix is at least general
|
||||
|
||||
m20 += ptX * m00 + ptY * m10;
|
||||
m21 += ptX * m01 + ptY * m11;
|
||||
}
|
||||
else
|
||||
{
|
||||
m20 += ptX;
|
||||
|
@ -556,22 +313,11 @@ void nsTransform2D :: AddScale(float ptX, float ptY)
|
|||
m00 = ptX;
|
||||
m11 = ptY;
|
||||
}
|
||||
else if ((type & MG_2DSCALE) != 0)
|
||||
else
|
||||
{
|
||||
//current matrix is at least scale
|
||||
|
||||
m00 *= ptX;
|
||||
m11 *= ptY;
|
||||
}
|
||||
else if ((type & MG_2DGENERAL) != 0)
|
||||
{
|
||||
//current matrix is at least general
|
||||
|
||||
m00 *= ptX;
|
||||
m01 *= ptX;
|
||||
m10 *= ptY;
|
||||
m11 *= ptY;
|
||||
}
|
||||
|
||||
type |= MG_2DSCALE;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче