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);
-