Bug 602759 part 8 - Move nsSVGSMILTransform to SVGTransform; r=jwatt
authorBrian Birtles <birtles@gmail.com>
Sun, 25 Sep 2011 22:04:31 +0100
changeset 77552 04d244bc338f88010ef3e62fab0eed230b124d50
parent 77551 e5e2d6577aa6d1938213dc267bb54788c97e518f
child 77553 e23063321ceefa8a2065a479807c7d6b54435b53
push id3
push userfelipc@gmail.com
push dateFri, 30 Sep 2011 20:09:13 +0000
reviewersjwatt
bugs602759
milestone9.0a1
Bug 602759 part 8 - Move nsSVGSMILTransform to SVGTransform; r=jwatt
content/svg/content/src/SVGTransform.cpp
content/svg/content/src/SVGTransform.h
content/svg/content/src/nsSVGSMILTransform.h
--- a/content/svg/content/src/SVGTransform.cpp
+++ b/content/svg/content/src/SVGTransform.cpp
@@ -177,9 +177,99 @@ SVGTransform::SetSkewY(float aAngle)
   mMatrix.Reset();
   mMatrix.yx = ta;
   mAngle   = aAngle;
   mOriginX = 0.f;
   mOriginY = 0.f;
   return NS_OK;
 }
 
+SVGTransformSMILData::SVGTransformSMILData(const SVGTransform& aTransform)
+  : mTransformType(aTransform.Type())
+{
+  NS_ABORT_IF_FALSE(
+    mTransformType >= nsIDOMSVGTransform::SVG_TRANSFORM_MATRIX &&
+    mTransformType <= nsIDOMSVGTransform::SVG_TRANSFORM_SKEWY,
+    "Unexpected transform type");
+
+  for (PRUint32 i = 0; i < NUM_STORED_PARAMS; ++i) {
+    mParams[i] = 0.f;
+  }
+
+  switch (mTransformType) {
+    case nsIDOMSVGTransform::SVG_TRANSFORM_MATRIX: {
+      const gfxMatrix& mx = aTransform.Matrix();
+      mParams[0] = static_cast<float>(mx.xx);
+      mParams[1] = static_cast<float>(mx.yx);
+      mParams[2] = static_cast<float>(mx.xy);
+      mParams[3] = static_cast<float>(mx.yy);
+      mParams[4] = static_cast<float>(mx.x0);
+      mParams[5] = static_cast<float>(mx.y0);
+      break;
+    }
+    case nsIDOMSVGTransform::SVG_TRANSFORM_TRANSLATE: {
+      const gfxMatrix& mx = aTransform.Matrix();
+      mParams[0] = static_cast<float>(mx.x0);
+      mParams[1] = static_cast<float>(mx.y0);
+      break;
+    }
+    case nsIDOMSVGTransform::SVG_TRANSFORM_SCALE: {
+      const gfxMatrix& mx = aTransform.Matrix();
+      mParams[0] = static_cast<float>(mx.xx);
+      mParams[1] = static_cast<float>(mx.yy);
+      break;
+    }
+    case nsIDOMSVGTransform::SVG_TRANSFORM_ROTATE:
+      mParams[0] = aTransform.Angle();
+      aTransform.GetRotationOrigin(mParams[1], mParams[2]);
+      break;
+
+    case nsIDOMSVGTransform::SVG_TRANSFORM_SKEWX:
+    case nsIDOMSVGTransform::SVG_TRANSFORM_SKEWY:
+      mParams[0] = aTransform.Angle();
+      break;
+
+    default:
+      NS_NOTREACHED("Unexpected transform type");
+      break;
+  }
+}
+
+SVGTransform
+SVGTransformSMILData::ToSVGTransform() const
+{
+  SVGTransform result;
+
+  switch (mTransformType) {
+    case nsIDOMSVGTransform::SVG_TRANSFORM_MATRIX:
+      result.SetMatrix(gfxMatrix(mParams[0], mParams[1],
+                                 mParams[2], mParams[3],
+                                 mParams[4], mParams[5]));
+      break;
+
+    case nsIDOMSVGTransform::SVG_TRANSFORM_TRANSLATE:
+      result.SetTranslate(mParams[0], mParams[1]);
+      break;
+
+    case nsIDOMSVGTransform::SVG_TRANSFORM_SCALE:
+      result.SetScale(mParams[0], mParams[1]);
+      break;
+
+    case nsIDOMSVGTransform::SVG_TRANSFORM_ROTATE:
+      result.SetRotate(mParams[0], mParams[1], mParams[2]);
+      break;
+
+    case nsIDOMSVGTransform::SVG_TRANSFORM_SKEWX:
+      result.SetSkewX(mParams[0]);
+      break;
+
+    case nsIDOMSVGTransform::SVG_TRANSFORM_SKEWY:
+      result.SetSkewY(mParams[0]);
+      break;
+
+    default:
+      NS_NOTREACHED("Unexpected transform type");
+      break;
+  }
+  return result;
+}
+
 } // namespace mozilla
--- a/content/svg/content/src/SVGTransform.h
+++ b/content/svg/content/src/SVGTransform.h
@@ -107,11 +107,97 @@ protected:
            a.y0 == b.y0;
   }
 
   gfxMatrix mMatrix;
   float mAngle, mOriginX, mOriginY;
   PRUint16 mType;
 };
 
+/*
+ * A slightly more light-weight version of SVGTransform for SMIL animation.
+ *
+ * Storing the parameters in an array (rather than a matrix) also allows simpler
+ * (transform type-agnostic) interpolation and addition.
+ *
+ * The meaning of the mParams array depends on the transform type as follows:
+ *
+ * Type                | mParams[0], mParams[1], mParams[2], ...
+ * --------------------+-----------------------------------------
+ * translate           | tx, ty
+ * scale               | sx, sy
+ * rotate              | rotation-angle (in degrees), cx, cy
+ * skewX               | skew-angle (in degrees)
+ * skewY               | skew-angle (in degrees)
+ * matrix              | a, b, c, d, e, f
+ *
+ * The matrix type is never generated by animation code (it is only produced
+ * when the user inserts one via the DOM) and often requires special handling
+ * when we do encounter it. Therefore many users of this class are only
+ * interested in the first three parameters and so we provide a special
+ * constructor for setting those parameters only.
+ */
+class SVGTransformSMILData
+{
+public:
+  // Number of float-params required in constructor, if constructing one of the
+  // 'simple' transform types (all but matrix type)
+  static const PRUint32 NUM_SIMPLE_PARAMS = 3;
+
+  // Number of float-params required in constructor for matrix type.
+  // This is also the number of params we actually store, regardless of type.
+  static const PRUint32 NUM_STORED_PARAMS = 6;
+
+  explicit SVGTransformSMILData(PRUint16 aType)
+  : mTransformType(aType)
+  {
+    NS_ABORT_IF_FALSE(aType >= nsIDOMSVGTransform::SVG_TRANSFORM_MATRIX &&
+                      aType <= nsIDOMSVGTransform::SVG_TRANSFORM_SKEWY,
+                      "Unexpected transform type");
+    for (PRUint32 i = 0; i < NUM_STORED_PARAMS; ++i) {
+      mParams[i] = 0.f;
+    }
+  }
+
+  SVGTransformSMILData(PRUint16 aType, float (&aParams)[NUM_SIMPLE_PARAMS])
+  : mTransformType(aType)
+  {
+    NS_ABORT_IF_FALSE(aType >= nsIDOMSVGTransform::SVG_TRANSFORM_TRANSLATE &&
+                      aType <= nsIDOMSVGTransform::SVG_TRANSFORM_SKEWY,
+                      "Expected 'simple' transform type");
+    for (PRUint32 i = 0; i < NUM_SIMPLE_PARAMS; ++i) {
+      mParams[i] = aParams[i];
+    }
+    for (PRUint32 i = NUM_SIMPLE_PARAMS; i < NUM_STORED_PARAMS; ++i) {
+      mParams[i] = 0.f;
+    }
+  }
+
+  // Conversion to/from a fully-fledged SVGTransform
+  SVGTransformSMILData(const SVGTransform& aTransform);
+  SVGTransform ToSVGTransform() const;
+
+  PRBool operator==(const SVGTransformSMILData& aOther) const
+  {
+    if (mTransformType != aOther.mTransformType)
+      return PR_FALSE;
+
+    for (PRUint32 i = 0; i < NUM_STORED_PARAMS; ++i) {
+      if (mParams[i] != aOther.mParams[i]) {
+        return PR_FALSE;
+      }
+    }
+
+    return PR_TRUE;
+  }
+
+  PRBool operator!=(const SVGTransformSMILData& aOther) const
+  {
+    return !(*this == aOther);
+  }
+
+  PRUint16 mTransformType;
+  float    mParams[NUM_STORED_PARAMS];
+};
+
 } // namespace mozilla
 
 #endif // MOZILLA_SVGTRANSFORM_H__
deleted file mode 100644
--- a/content/svg/content/src/nsSVGSMILTransform.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Mozilla SVG project.
- *
- * The Initial Developer of the Original Code is Brian Birtles.
- * Portions created by the Initial Developer are Copyright (C) 2008
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Brian Birtles <birtles@gmail.com>
- *
- * 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"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef NS_SVGSMILTRANSFORM_H_
-#define NS_SVGSMILTRANSFORM_H_
-
-////////////////////////////////////////////////////////////////////////
-// nsSVGSMILTransform
-//
-// A pared-down representation of an SVG transform used in SMIL animation. We
-// just store the most basic facts about the transform such that we can add the
-// transform parameters together and later reconstruct a full SVG transform from
-// this information.
-//
-// The meaning of the mParams array depends on the transform type as follows:
-//
-// Type                | mParams[0], mParams[1], mParams[2], ...
-// --------------------+-----------------------------------------
-// TRANSFORM_TRANSLATE | tx, ty
-// TRANSFORM_SCALE     | sx, sy
-// TRANSFORM_ROTATE    | rotation-angle (in degrees), cx, cy
-// TRANSFORM_SKEWX     | skew-angle (in degrees)
-// TRANSFORM_SKEWY     | skew-angle (in degrees)
-// TRANSFORM_MATRIX    | a, b, c, d, e, f
-//
-// TRANSFORM_MATRIX is never generated by animation code (it is only produced
-// when the user inserts one via the DOM) and often requires special handling
-// when we do encounter it. Therefore many users of this class are only
-// interested in the first three parameters and so we provide a special
-// constructor for setting those parameters only.
-class nsSVGSMILTransform
-{
-public:
-  enum TransformType
-  {
-    TRANSFORM_TRANSLATE,
-    TRANSFORM_SCALE,
-    TRANSFORM_ROTATE,
-    TRANSFORM_SKEWX,
-    TRANSFORM_SKEWY,
-    TRANSFORM_MATRIX
-  };
-
-  // Number of float-params required in constructor, if constructing one of the
-  // 'simple' transform types (all but TRANSFORM_MATRIX)
-  static const PRUint32 NUM_SIMPLE_PARAMS = 3;
-
-  // Number of float-params required in constructor for TRANSFORM_MATRIX type.
-  // This is also the number of params we actually store, regardless of type.
-  static const PRUint32 NUM_STORED_PARAMS = 6;
-
-  explicit nsSVGSMILTransform(TransformType aType)
-  : mTransformType(aType)
-  {
-    for (PRUint32 i = 0; i < NUM_STORED_PARAMS; ++i) {
-      mParams[i] = 0;
-    }
-  }
-
-  nsSVGSMILTransform(TransformType aType, float (&aParams)[NUM_SIMPLE_PARAMS])
-  : mTransformType(aType)
-  {
-    for (PRUint32 i = 0; i < NUM_SIMPLE_PARAMS; ++i) {
-      mParams[i] = aParams[i];
-    }
-    for (PRUint32 i = NUM_SIMPLE_PARAMS; i < NUM_STORED_PARAMS; ++i) {
-      mParams[i] = 0;
-    }
-  }
-
-  explicit nsSVGSMILTransform(float (&aParams)[NUM_STORED_PARAMS])
-  : mTransformType(TRANSFORM_MATRIX)
-  {
-    for (PRUint32 i = 0; i < NUM_STORED_PARAMS; ++i) {
-      mParams[i] = aParams[i];
-    }
-  }
-
-  PRBool operator==(const nsSVGSMILTransform& aOther) const
-  {
-    if (mTransformType != aOther.mTransformType)
-      return PR_FALSE;
-
-    for (PRUint32 i = 0; i < NUM_STORED_PARAMS; ++i) {
-      if (mParams[i] != aOther.mParams[i]) {
-        return PR_FALSE;
-      }
-    }
-
-    // Found no differences.
-    return PR_TRUE;
-  }
-
-  PRBool operator!=(const nsSVGSMILTransform& aOther) const
-  {
-    return !(*this == aOther);
-  }
-
-  TransformType mTransformType;
-
-  float mParams[NUM_STORED_PARAMS];
-};
-
-#endif // NS_SVGSMILTRANSFORM_H_