summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorTom Hudson <tomhudson@google.com>2015-03-31 11:58:09 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-03-31 11:58:10 +0000
commitf6967e686b8eba2719cff21485194b0156e4415b (patch)
tree30f56747c080d2af965e65385453905ccc5cdfad /libs
parent80d4bd84ede57b1a3c1e8738fb6380c667c13865 (diff)
parente30b53cec5eb6eaa5d24231feb3207b917c1baab (diff)
downloadframeworks_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.cpp19
-rw-r--r--libs/hwui/ClipArea.h2
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);