示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
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;
}
示例#5
0
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;
}