You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-commits@xmlgraphics.apache.org by ca...@apache.org on 2007/03/06 22:15:58 UTC

svn commit: r515307 - /xmlgraphics/batik/trunk/sources/org/apache/batik/anim/values/AnimatableTransformListValue.java

Author: cam
Date: Tue Mar  6 13:15:58 2007
New Revision: 515307

URL: http://svn.apache.org/viewvc?view=rev&rev=515307
Log:
Fixed repeated NPEs for animateTransforms by-animations.

Modified:
    xmlgraphics/batik/trunk/sources/org/apache/batik/anim/values/AnimatableTransformListValue.java

Modified: xmlgraphics/batik/trunk/sources/org/apache/batik/anim/values/AnimatableTransformListValue.java
URL: http://svn.apache.org/viewvc/xmlgraphics/batik/trunk/sources/org/apache/batik/anim/values/AnimatableTransformListValue.java?view=diff&rev=515307&r1=515306&r2=515307
==============================================================================
--- xmlgraphics/batik/trunk/sources/org/apache/batik/anim/values/AnimatableTransformListValue.java (original)
+++ xmlgraphics/batik/trunk/sources/org/apache/batik/anim/values/AnimatableTransformListValue.java Tue Mar  6 13:15:58 2007
@@ -38,6 +38,39 @@
 public class AnimatableTransformListValue extends AnimatableValue {
 
     /**
+     * Identity transform value of type 'skewX'.
+     */
+    protected static SVGOMTransform IDENTITY_SKEWX = new SVGOMTransform();
+
+    /**
+     * Identity transform value of type 'skewY'.
+     */
+    protected static SVGOMTransform IDENTITY_SKEWY = new SVGOMTransform();
+
+    /**
+     * Identity transform value of type 'scale'.
+     */
+    protected static SVGOMTransform IDENTITY_SCALE = new SVGOMTransform();
+
+    /**
+     * Identity transform value of type 'rotate'.
+     */
+    protected static SVGOMTransform IDENTITY_ROTATE = new SVGOMTransform();
+
+    /**
+     * Identity transform value of type 'translate'.
+     */
+    protected static SVGOMTransform IDENTITY_TRANSLATE = new SVGOMTransform();
+
+    static {
+        IDENTITY_SKEWX.setSkewX(0f);
+        IDENTITY_SKEWY.setSkewY(0f);
+        IDENTITY_SCALE.setScale(0f, 0f);
+        IDENTITY_ROTATE.setRotate(0f, 0f, 0f);
+        IDENTITY_TRANSLATE.setTranslate(0f, 0f);
+    }
+
+    /**
      * List of transforms.
      */
     protected Vector transforms;
@@ -114,15 +147,46 @@
         }
 
         if (to != null) {
-            AbstractSVGTransform ft = (AbstractSVGTransform) transforms.lastElement();
-            int type = ft.getType();
-            AbstractSVGTransform tt = (AbstractSVGTransform) toTransformList.transforms.lastElement();
+            AbstractSVGTransform tt =
+                (AbstractSVGTransform) toTransformList.transforms.lastElement();
+            AbstractSVGTransform ft = null;
+            int type;
+            if (transforms.isEmpty()) {
+                // For the case of an additive animation with an underlying
+                // transform list of zero elements.
+                type = tt.getType();
+                switch (type) {
+                    case SVGTransform.SVG_TRANSFORM_SKEWX:
+                        ft = IDENTITY_SKEWX;
+                        break;
+                    case SVGTransform.SVG_TRANSFORM_SKEWY:
+                        ft = IDENTITY_SKEWY;
+                        break;
+                    case SVGTransform.SVG_TRANSFORM_SCALE:
+                        ft = IDENTITY_SCALE;
+                        break;
+                    case SVGTransform.SVG_TRANSFORM_ROTATE:
+                        ft = IDENTITY_ROTATE;
+                        break;
+                    case SVGTransform.SVG_TRANSFORM_TRANSLATE:
+                        ft = IDENTITY_TRANSLATE;
+                        break;
+                }
+            } else {
+                ft = (AbstractSVGTransform) transforms.lastElement();
+                type = ft.getType();
+            }
             if (type == tt.getType()) {
-                AbstractSVGTransform t =
-                    (AbstractSVGTransform) res.transforms.elementAt(index);
-                if (t == null) {
+                AbstractSVGTransform t;
+                if (res.transforms.isEmpty()) {
                     t = new SVGOMTransform();
-                    res.transforms.setElementAt(t, index);
+                    res.transforms.add(t);
+                } else {
+                    t = (AbstractSVGTransform) res.transforms.elementAt(index);
+                    if (t == null) {
+                        t = new SVGOMTransform();
+                        res.transforms.setElementAt(t, index);
+                    }
                 }
                 float x, y, r = 0;
                 switch (type) {