Merge "Remove Path based outline clipping"
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 4715c26..e45a901 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -119,7 +119,6 @@
         jint right, jint bottom, jfloat radius) {
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
     renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius);
-    renderNode->mutateStagingProperties().updateClipPath();
 }
 
 static void android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
@@ -127,21 +126,18 @@
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
     SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
     renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath);
-    renderNode->mutateStagingProperties().updateClipPath();
 }
 
 static void android_view_RenderNode_setOutlineEmpty(JNIEnv* env,
         jobject clazz, jlong renderNodePtr) {
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
     renderNode->mutateStagingProperties().mutableOutline().setEmpty();
-    renderNode->mutateStagingProperties().updateClipPath();
 }
 
 static void android_view_RenderNode_setClipToOutline(JNIEnv* env,
         jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
     renderNode->mutateStagingProperties().mutableOutline().setShouldClip(clipToOutline);
-    renderNode->mutateStagingProperties().updateClipPath();
 }
 
 static void android_view_RenderNode_setRevealClip(JNIEnv* env,
@@ -150,7 +146,6 @@
     RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
     renderNode->mutateStagingProperties().mutableRevealClip().set(
             shouldClip, inverseClip, x, y, radius);
-    renderNode->mutateStagingProperties().updateClipPath();
 }
 
 static void android_view_RenderNode_setAlpha(JNIEnv* env,
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 9902ff1..fba482d 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -238,9 +238,8 @@
     }
 
     if (CC_UNLIKELY(properties().hasClippingPath())) {
-        // TODO: optimize for round rect/circle clipping
-        const SkPath* path = properties().getClippingPath();
-        ClipPathOp* op = new (handler.allocator()) ClipPathOp(path, SkRegion::kIntersect_Op);
+        ClipPathOp* op = new (handler.allocator()) ClipPathOp(
+                properties().getClippingPath(), properties().getClippingPathOp());
         handler(op, PROPERTY_SAVECOUNT, properties().getClipToBounds());
     }
 }
diff --git a/libs/hwui/RenderProperties.cpp b/libs/hwui/RenderProperties.cpp
index 99de1fc..5f7d4e3 100644
--- a/libs/hwui/RenderProperties.cpp
+++ b/libs/hwui/RenderProperties.cpp
@@ -50,14 +50,11 @@
 }
 
 RenderProperties::ComputedFields::ComputedFields()
-        : mTransformMatrix(NULL)
-        , mClipPath(NULL)
-        , mClipPathOp(SkRegion::kIntersect_Op) {
+        : mTransformMatrix(NULL) {
 }
 
 RenderProperties::ComputedFields::~ComputedFields() {
     delete mTransformMatrix;
-    delete mClipPath;
 }
 
 RenderProperties::RenderProperties()
@@ -77,9 +74,6 @@
         setAnimationMatrix(other.getAnimationMatrix());
         setCameraDistance(other.getCameraDistance());
 
-        // Update the computed clip path
-        updateClipPath();
-
         // Force recalculation of the matrix, since other's dirty bit may be clear
         mPrimitiveFields.mMatrixOrPivotDirty = true;
         updateMatrix();
@@ -166,39 +160,5 @@
     }
 }
 
-void RenderProperties::updateClipPath() {
-    const SkPath* outlineClipPath = mPrimitiveFields.mOutline.willClip()
-            ? mPrimitiveFields.mOutline.getPath() : NULL;
-    const SkPath* revealClipPath = mPrimitiveFields.mRevealClip.getPath();
-
-    if (!outlineClipPath && !revealClipPath) {
-        // mComputedFields.mClipPath doesn't need to be updated, since it won't be used
-        return;
-    }
-
-    if (mComputedFields.mClipPath == NULL) {
-        mComputedFields.mClipPath = new SkPath();
-    }
-    SkPath* clipPath = mComputedFields.mClipPath;
-    mComputedFields.mClipPathOp = SkRegion::kIntersect_Op;
-
-    if (outlineClipPath && revealClipPath) {
-        SkPathOp op = kIntersect_PathOp;
-        if (mPrimitiveFields.mRevealClip.isInverseClip()) {
-            op = kDifference_PathOp; // apply difference step in the Op below, instead of draw time
-        }
-
-        Op(*outlineClipPath, *revealClipPath, op, clipPath);
-    } else if (outlineClipPath) {
-        *clipPath = *outlineClipPath;
-    } else {
-        *clipPath = *revealClipPath;
-        if (mPrimitiveFields.mRevealClip.isInverseClip()) {
-            // apply difference step at draw time
-            mComputedFields.mClipPathOp = SkRegion::kDifference_Op;
-        }
-    }
-}
-
 } /* namespace uirenderer */
 } /* namespace android */
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 6fc8bce..c0e3ce7 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -437,19 +437,17 @@
 
     ANDROID_API void updateMatrix();
 
-    ANDROID_API void updateClipPath();
-
-    // signals that mComputedFields.mClipPath is up to date, and should be used for clipping
     bool hasClippingPath() const {
-        return mPrimitiveFields.mOutline.willClip() || mPrimitiveFields.mRevealClip.willClip();
+        return mPrimitiveFields.mRevealClip.willClip();
     }
 
     const SkPath* getClippingPath() const {
-        return hasClippingPath() ? mComputedFields.mClipPath : NULL;
+        return mPrimitiveFields.mRevealClip.getPath();
     }
 
     SkRegion::Op getClippingPathOp() const {
-        return mComputedFields.mClipPathOp;
+        return mPrimitiveFields.mRevealClip.isInverseClip()
+                ? SkRegion::kDifference_Op : SkRegion::kIntersect_Op;
     }
 
     Outline& mutableOutline() {
@@ -505,8 +503,6 @@
         SkMatrix* mTransformMatrix;
 
         Sk3DView mTransformCamera;
-        SkPath* mClipPath; // TODO: remove this, create new ops for efficient/special case clipping
-        SkRegion::Op mClipPathOp;
     } mComputedFields;
 };