Merge "Fix possible rendering issue when drawing a path."
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 88f6d43..c558632 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -126,7 +126,7 @@
     private boolean mRectIsDirty;   // internal state
     private boolean mMutated;
     private Path mRingPath;
-    private boolean mPathIsDirty;
+    private boolean mPathIsDirty = true;
 
     /**
      * Controls how the gradient is oriented relative to the drawable's bounds
@@ -179,6 +179,7 @@
      */
     public void setCornerRadii(float[] radii) {
         mGradientState.setCornerRadii(radii);
+        mPathIsDirty = true;
     }
     
     /**
@@ -187,6 +188,7 @@
      */
     public void setCornerRadius(float radius) {
         mGradientState.setCornerRadius(radius);
+        mPathIsDirty = true;
     }
     
     /**
@@ -215,11 +217,13 @@
     }
     
     public void setSize(int width, int height) {
-        mGradientState.setSize(width, height); 
+        mGradientState.setSize(width, height);
+        mPathIsDirty = true;
     }
     
     public void setShape(int shape) {
         mRingPath = null;
+        mPathIsDirty = true;
         mGradientState.setShape(shape);
     }
 
@@ -312,8 +316,11 @@
         switch (st.mShape) {
             case RECTANGLE:
                 if (st.mRadiusArray != null) {
-                    mPath.reset();
-                    mPath.addRoundRect(mRect, st.mRadiusArray, Path.Direction.CW);
+                    if (mPathIsDirty || mRectIsDirty) {
+                        mPath.reset();
+                        mPath.addRoundRect(mRect, st.mRadiusArray, Path.Direction.CW);
+                        mPathIsDirty = mRectIsDirty = false;
+                    }
                     canvas.drawPath(mPath, mFillPaint);
                     if (haveStroke) {
                         canvas.drawPath(mPath, mStrokePaint);
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index 377727b..b58785a 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -173,9 +173,15 @@
     bitmap.allocPixels();
     bitmap.eraseColor(0);
 
+    SkPaint pathPaint(*paint);
+    if (!pathPaint.getXfermode()) {
+        SkXfermode* mode = SkXfermode::Create(SkXfermode::kSrc_Mode);
+        pathPaint.setXfermode(mode)->safeUnref();
+    }
+
     SkCanvas canvas(bitmap);
     canvas.translate(-bounds.fLeft + offset, -bounds.fTop + offset);
-    canvas.drawPath(*path, *paint);
+    canvas.drawPath(*path, pathPaint);
 
     generateTexture(bitmap, texture);