Fix paths rendering issues.

See ApiDemos, PathEffect and PathFillTypes.

Change-Id: I9f9593c1da33d0d013b5b89c86bc5bd71128a192
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index 868290b..f2f983f 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -95,10 +95,6 @@
         delete mPaths.itemAt(i);
     }
     mPaths.clear();
-    for (size_t i = 0; i < mOriginalPaths.size(); i++) {
-        caches.resourceCache.decrementRefcount(mOriginalPaths.itemAt(i));
-    }
-    mOriginalPaths.clear();
 
     for (size_t i = 0; i < mMatrices.size(); i++) {
         delete mMatrices.itemAt(i);
@@ -150,13 +146,6 @@
         mPaths.add(paths.itemAt(i));
     }
 
-    const Vector<SkPath*> &originalPaths = recorder.getOriginalPaths();
-    for (size_t i = 0; i < originalPaths.size(); i++) {
-        SkPath* path = originalPaths.itemAt(i);
-        mOriginalPaths.add(path);
-        caches.resourceCache.incrementRefcount(path);
-    }
-
     const Vector<SkMatrix*> &matrices = recorder.getMatrices();
     for (size_t i = 0; i < matrices.size(); i++) {
         mMatrices.add(matrices.itemAt(i));
@@ -533,12 +522,6 @@
     }
     mBitmapResources.clear();
 
-    for (size_t i = 0; i < mOriginalPaths.size(); i++) {
-        SkPath* resource = mOriginalPaths.itemAt(i);
-        caches.resourceCache.decrementRefcount(resource);
-    }
-    mOriginalPaths.clear();
-
     for (size_t i = 0; i < mShaders.size(); i++) {
        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
     }
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index 6fc315c..8773cb5 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -193,7 +193,6 @@
 
     Vector<SkPaint*> mPaints;
     Vector<SkPath*> mPaths;
-    Vector<SkPath*> mOriginalPaths;
     Vector<SkMatrix*> mMatrices;
     Vector<SkiaShader*> mShaders;
 
@@ -298,10 +297,6 @@
         return mPaths;
     }
 
-    const Vector<SkPath*>& getOriginalPaths() const {
-        return mOriginalPaths;
-    }
-
     const Vector<SkMatrix*>& getMatrices() const {
         return mMatrices;
     }
@@ -383,16 +378,9 @@
 
         SkPath* pathCopy = mPathMap.valueFor(path);
         if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
-            if (pathCopy == NULL) {
-                pathCopy = path;
-                mOriginalPaths.add(path);
-                Caches& caches = Caches::getInstance();
-                caches.resourceCache.incrementRefcount(path);
-            } else {
-                pathCopy = new SkPath(*path);
-                mPaths.add(pathCopy);
-            }
+            pathCopy = new SkPath(*path);
             mPathMap.add(path, pathCopy);
+            mPaths.add(pathCopy);
         }
 
         addInt((int) pathCopy);
@@ -469,7 +457,6 @@
     Vector<SkPaint*> mPaints;
     DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
 
-    Vector<SkPath*> mOriginalPaths;
     Vector<SkPath*> mPaths;
     DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
 
diff --git a/libs/hwui/PathCache.h b/libs/hwui/PathCache.h
index dc67e16..7ff8b74 100644
--- a/libs/hwui/PathCache.h
+++ b/libs/hwui/PathCache.h
@@ -41,8 +41,7 @@
         path = NULL;
     }
 
-    PathCacheEntry(const PathCacheEntry& entry):
-            ShapeCacheEntry(entry) {
+    PathCacheEntry(const PathCacheEntry& entry): ShapeCacheEntry(entry) {
         path = entry.path;
     }
 
@@ -55,6 +54,7 @@
     }
 
     SkPath* path;
+
 }; // PathCacheEntry
 
 /**
diff --git a/libs/hwui/ShapeCache.h b/libs/hwui/ShapeCache.h
index 4c626dd..859e503 100644
--- a/libs/hwui/ShapeCache.h
+++ b/libs/hwui/ShapeCache.h
@@ -96,7 +96,7 @@
     ShapeCacheEntry(const ShapeCacheEntry& entry):
         shapeType(entry.shapeType), join(entry.join), cap(entry.cap),
         style(entry.style), miter(entry.miter),
-        strokeWidth(entry.strokeWidth) {
+        strokeWidth(entry.strokeWidth), pathEffect(entry.pathEffect) {
     }
 
     ShapeCacheEntry(ShapeType type, SkPaint* paint) {
@@ -108,18 +108,19 @@
         v = paint->getStrokeWidth();
         strokeWidth = *(uint32_t*) &v;
         style = paint->getStyle();
+        pathEffect = paint->getPathEffect();
     }
 
     virtual ~ShapeCacheEntry() {
     }
 
-    // shapeType must be checked in subclasses operator<
     ShapeType shapeType;
     SkPaint::Join join;
     SkPaint::Cap cap;
     SkPaint::Style style;
     uint32_t miter;
     uint32_t strokeWidth;
+    SkPathEffect* pathEffect;
 
     bool operator<(const ShapeCacheEntry& rhs) const {
         LTE_INT(shapeType) {
@@ -128,7 +129,9 @@
                     LTE_INT(style) {
                         LTE_INT(miter) {
                             LTE_INT(strokeWidth) {
-                                return lessThan(rhs);
+                                LTE_INT(pathEffect) {
+                                    return lessThan(rhs);
+                                }
                             }
                         }
                     }