diff options
Diffstat (limited to 'libs/hwui/ClipArea.cpp')
| -rw-r--r-- | libs/hwui/ClipArea.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/libs/hwui/ClipArea.cpp b/libs/hwui/ClipArea.cpp index 852204a..eb520b4 100644 --- a/libs/hwui/ClipArea.cpp +++ b/libs/hwui/ClipArea.cpp @@ -234,7 +234,7 @@ bool ClipArea::clipRectWithTransform(const Rect& r, const mat4* transform, bool ClipArea::clipRegion(const SkRegion& region, SkRegion::Op op) { enterRegionMode(); mClipRegion.op(region, op); - setClipRectToRegionBounds(); + onClipRegionUpdated(); return true; } @@ -263,6 +263,9 @@ void ClipArea::enterRectangleMode() { bool ClipArea::rectangleModeClipRectWithTransform(const Rect& r, const mat4* transform, SkRegion::Op op) { + // TODO: we should be able to handle kReplace_Op efficiently without + // going through RegionMode and later falling back into RectangleMode. + if (op != SkRegion::kIntersect_Op) { enterRegionMode(); return regionModeClipRectWithTransform(r, transform, op); @@ -324,15 +327,16 @@ bool ClipArea::rectangleListModeClipRectWithTransform(float left, float top, */ void ClipArea::enterRegionMode() { - if (mMode != kModeRegion) { - if (mMode == kModeRectangle) { + Mode oldMode = mMode; + mMode = kModeRegion; + if (oldMode != kModeRegion) { + if (oldMode == kModeRectangle) { mClipRegion.setRect(mClipRect.left, mClipRect.top, mClipRect.right, mClipRect.bottom); } else { mClipRegion = mRectangleList.convertToRegion(createViewportRegion()); - setClipRectToRegionBounds(); + onClipRegionUpdated(); } - mMode = kModeRegion; } } @@ -342,7 +346,7 @@ bool ClipArea::regionModeClipRectWithTransform(const Rect& r, SkRegion transformedRectRegion; regionFromPath(transformedRect, transformedRectRegion); mClipRegion.op(transformedRectRegion, op); - setClipRectToRegionBounds(); + onClipRegionUpdated(); return true; } @@ -352,12 +356,13 @@ bool ClipArea::regionModeClipRectWithTransform(float left, float top, transform, op); } -void ClipArea::setClipRectToRegionBounds() { +void ClipArea::onClipRegionUpdated() { if (!mClipRegion.isEmpty()) { mClipRect.set(mClipRegion.getBounds()); if (mClipRegion.isRect()) { mClipRegion.setEmpty(); + enterRectangleMode(); } } else { mClipRect.setEmpty(); |
