DOMMatrix* DOMMatrix::ScaleNonUniformSelf(double aScaleX, double aScaleY, double aScaleZ, double aOriginX, double aOriginY, double aOriginZ) { if (aScaleX == 1.0 && aScaleY == 1.0 && aScaleZ == 1.0) { return this; } TranslateSelf(aOriginX, aOriginY, aOriginZ); if (mMatrix3D || aScaleZ != 1.0 || aOriginZ != 0) { Ensure3DMatrix(); gfx::Matrix4x4 m; m._11 = aScaleX; m._22 = aScaleY; m._33 = aScaleZ; *mMatrix3D = m * *mMatrix3D; } else { gfx::Matrix m; m._11 = aScaleX; m._22 = aScaleY; *mMatrix2D = m * *mMatrix2D; } TranslateSelf(-aOriginX, -aOriginY, -aOriginZ); return this; }
DOMMatrix* DOMMatrix::RotateAxisAngleSelf(double aX, double aY, double aZ, double aAngle) { if (fmod(aAngle, 360) == 0) { return this; } aAngle *= radPerDegree; // sin(aAngle / 2) * cos(aAngle / 2) double sc = sin(aAngle) / 2; // pow(sin(aAngle / 2), 2) double sq = (1 - cos(aAngle)) / 2; Ensure3DMatrix(); gfx::Matrix4x4 m; m._11 = 1 - 2 * (aY * aY + aZ * aZ) * sq; m._12 = 2 * (aX * aY * sq + aZ * sc); m._13 = 2 * (aX * aZ * sq - aY * sc); m._21 = 2 * (aX * aY * sq - aZ * sc); m._22 = 1 - 2 * (aX * aX + aZ * aZ) * sq; m._23 = 2 * (aY * aZ * sq + aX * sc); m._31 = 2 * (aX * aZ * sq + aY * sc); m._32 = 2 * (aY * aZ * sq - aX * sc); m._33 = 1 - 2 * (aX * aX + aY * aY) * sq; *mMatrix3D = m * *mMatrix3D; return this; }
DOMMatrix* DOMMatrix::RotateAxisAngleSelf(double aX, double aY, double aZ, double aAngle) { if (fmod(aAngle, 360) == 0) { return this; } aAngle *= radPerDegree; Ensure3DMatrix(); gfx::Matrix4x4 m; m.SetRotateAxisAngle(aX, aY, aZ, aAngle); *mMatrix3D = m * *mMatrix3D; return this; }
DOMMatrix* DOMMatrix::TranslateSelf(double aTx, double aTy, double aTz) { if (aTx == 0 && aTy == 0 && aTz == 0) { return this; } if (mMatrix3D || aTz != 0) { Ensure3DMatrix(); mMatrix3D->PreTranslate(aTx, aTy, aTz); } else { mMatrix2D->PreTranslate(aTx, aTy); } return this; }
DOMMatrix* DOMMatrix::PreMultiplySelf(const DOMMatrix& aOther) { if (aOther.Identity()) { return this; } if (aOther.Is2D()) { if (mMatrix3D) { *mMatrix3D = *mMatrix3D * gfx::Matrix4x4::From2D(*aOther.mMatrix2D); } else { *mMatrix2D = *mMatrix2D * *aOther.mMatrix2D; } } else { Ensure3DMatrix(); *mMatrix3D = *mMatrix3D * *aOther.mMatrix3D; } return this; }