diff options
author | Tom Hudson <tomhudson@google.com> | 2015-03-31 11:58:09 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-03-31 11:58:10 +0000 |
commit | f6967e686b8eba2719cff21485194b0156e4415b (patch) | |
tree | 30f56747c080d2af965e65385453905ccc5cdfad /libs | |
parent | 80d4bd84ede57b1a3c1e8738fb6380c667c13865 (diff) | |
parent | e30b53cec5eb6eaa5d24231feb3207b917c1baab (diff) | |
download | frameworks_base-f6967e686b8eba2719cff21485194b0156e4415b.zip frameworks_base-f6967e686b8eba2719cff21485194b0156e4415b.tar.gz frameworks_base-f6967e686b8eba2719cff21485194b0156e4415b.tar.bz2 |
Merge "Enter RectangleMode when the clip region is a rectangle"
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/ClipArea.cpp | 19 | ||||
-rw-r--r-- | libs/hwui/ClipArea.h | 2 |
2 files changed, 13 insertions, 8 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(); diff --git a/libs/hwui/ClipArea.h b/libs/hwui/ClipArea.h index 16e6df9..e284af0 100644 --- a/libs/hwui/ClipArea.h +++ b/libs/hwui/ClipArea.h @@ -144,7 +144,7 @@ private: float bottom, const mat4* transform, SkRegion::Op op); void ensureClipRegion(); - void setClipRectToRegionBounds(); + void onClipRegionUpdated(); bool clipRegionOp(float left, float top, float right, float bottom, SkRegion::Op op); |