Loading libs/hwui/ClipArea.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -263,10 +263,11 @@ 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) { if (op == SkRegion::kReplace_Op && transform->rectToRect()) { mClipRect = r; transform->mapRect(mClipRect); return true; } else if (op != SkRegion::kIntersect_Op) { enterRegionMode(); return regionModeClipRectWithTransform(r, transform, op); } Loading libs/hwui/ClipArea.h +2 −0 Original line number Diff line number Diff line Loading @@ -153,6 +153,8 @@ private: } void regionFromPath(const SkPath& path, SkRegion& pathAsRegion) { // TODO: this should not mask every path to the viewport - this makes it impossible to use // paths to clip to larger areas (which is valid e.g. with SkRegion::kReplace_Op) pathAsRegion.setPath(path, createViewportRegion()); } Loading libs/hwui/unit_tests/ClipAreaTests.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -112,5 +112,16 @@ TEST(ClipArea, paths) { regionBounds.set(skRect); EXPECT_EQ(expected, regionBounds); } TEST(ClipArea, replaceNegative) { ClipArea area(createClipArea()); area.setClip(0, 0, 100, 100); Matrix4 transform; transform.loadIdentity(); Rect expected(-50, -50, 50, 50); area.clipRectWithTransform(expected, &transform, SkRegion::kReplace_Op); EXPECT_EQ(expected, area.getClipRect()); } } } Loading
libs/hwui/ClipArea.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -263,10 +263,11 @@ 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) { if (op == SkRegion::kReplace_Op && transform->rectToRect()) { mClipRect = r; transform->mapRect(mClipRect); return true; } else if (op != SkRegion::kIntersect_Op) { enterRegionMode(); return regionModeClipRectWithTransform(r, transform, op); } Loading
libs/hwui/ClipArea.h +2 −0 Original line number Diff line number Diff line Loading @@ -153,6 +153,8 @@ private: } void regionFromPath(const SkPath& path, SkRegion& pathAsRegion) { // TODO: this should not mask every path to the viewport - this makes it impossible to use // paths to clip to larger areas (which is valid e.g. with SkRegion::kReplace_Op) pathAsRegion.setPath(path, createViewportRegion()); } Loading
libs/hwui/unit_tests/ClipAreaTests.cpp +11 −0 Original line number Diff line number Diff line Loading @@ -112,5 +112,16 @@ TEST(ClipArea, paths) { regionBounds.set(skRect); EXPECT_EQ(expected, regionBounds); } TEST(ClipArea, replaceNegative) { ClipArea area(createClipArea()); area.setClip(0, 0, 100, 100); Matrix4 transform; transform.loadIdentity(); Rect expected(-50, -50, 50, 50); area.clipRectWithTransform(expected, &transform, SkRegion::kReplace_Op); EXPECT_EQ(expected, area.getClipRect()); } } }