Fix to (two-point radial) gradient playback error in SkPictures that swapped
the X and Y coordinates of their centers.



git-svn-id: http://skia.googlecode.com/svn/trunk@1179 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp
index 5af0486..6aff4fc 100644
--- a/src/effects/SkGradientShader.cpp
+++ b/src/effects/SkGradientShader.cpp
@@ -50,6 +50,17 @@
 #endif
 
 ///////////////////////////////////////////////////////////////////////////////
+// Can't use a two-argument function with side effects like this in a
+// constructor's initializer's argument list because the order of
+// evaluations in that context is undefined (and backwards on linux/gcc).
+static SkPoint unflatten_point(SkReader32& buffer) {
+    SkPoint retval;
+    retval.fX = buffer.readScalar();
+    retval.fY = buffer.readScalar();
+    return retval;
+}
+
+///////////////////////////////////////////////////////////////////////////////
 
 typedef SkFixed (*TileProc)(SkFixed);
 
@@ -780,8 +791,8 @@
 protected:
     Linear_Gradient(SkFlattenableReadBuffer& buffer)
         : Gradient_Shader(buffer),
-          fStart(SkPoint::Make(buffer.readScalar(), buffer.readScalar())),
-          fEnd(SkPoint::Make(buffer.readScalar(), buffer.readScalar())) {
+          fStart(unflatten_point(buffer)),
+          fEnd(unflatten_point(buffer)) {
     }
     virtual Factory getFactory() { return CreateProc; }
 
@@ -1379,7 +1390,7 @@
 protected:
     Radial_Gradient(SkFlattenableReadBuffer& buffer)
         : Gradient_Shader(buffer),
-          fCenter(SkPoint::Make(buffer.readScalar(), buffer.readScalar())),
+          fCenter(unflatten_point(buffer)),
           fRadius(buffer.readScalar()) {
     }
     virtual Factory getFactory() { return CreateProc; }
@@ -1772,8 +1783,8 @@
 protected:
     Two_Point_Radial_Gradient(SkFlattenableReadBuffer& buffer)
             : Gradient_Shader(buffer),
-              fCenter1(SkPoint::Make(buffer.readScalar(), buffer.readScalar())),
-              fCenter2(SkPoint::Make(buffer.readScalar(), buffer.readScalar())),
+              fCenter1(unflatten_point(buffer)),
+              fCenter2(unflatten_point(buffer)),
               fRadius1(buffer.readScalar()),
               fRadius2(buffer.readScalar()) {
         init();
@@ -1857,7 +1868,7 @@
 protected:
     Sweep_Gradient(SkFlattenableReadBuffer& buffer)
         : Gradient_Shader(buffer),
-          fCenter(SkPoint::Make(buffer.readScalar(), buffer.readScalar())) {
+          fCenter(unflatten_point(buffer)) {
     }
 
     virtual Factory getFactory() { return CreateProc; }
@@ -2256,4 +2267,3 @@
 
 static SkFlattenable::Registrar gSweepGradientReg("Sweep_Gradient",
                                                    Sweep_Gradient::CreateProc);
-