Loading libs/hwui/ClipArea.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,7 @@ void ClipArea::setClip(float left, float top, float right, float bottom) { void ClipArea::clipRectWithTransform(const Rect& r, const mat4* transform, SkRegion::Op op) { if (!mPostViewportClipObserved && op == SkRegion::kIntersect_Op) op = SkRegion::kReplace_Op; onClipUpdated(); switch (mMode) { case ClipMode::Rectangle: Loading @@ -228,6 +229,7 @@ void ClipArea::clipRectWithTransform(const Rect& r, const mat4* transform, } void ClipArea::clipRegion(const SkRegion& region, SkRegion::Op op) { if (!mPostViewportClipObserved && op == SkRegion::kIntersect_Op) op = SkRegion::kReplace_Op; onClipUpdated(); enterRegionMode(); mClipRegion.op(region, op); Loading @@ -236,6 +238,7 @@ void ClipArea::clipRegion(const SkRegion& region, SkRegion::Op op) { void ClipArea::clipPathWithTransform(const SkPath& path, const mat4* transform, SkRegion::Op op) { if (!mPostViewportClipObserved && op == SkRegion::kIntersect_Op) op = SkRegion::kReplace_Op; onClipUpdated(); SkMatrix skTransform; transform->copyTo(skTransform); Loading libs/hwui/FrameBuilder.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,9 @@ void FrameBuilder::deferNodePropsAndOps(RenderNode& node) { mCanvasState.setClippingOutline(mAllocator, &(properties.getOutline())); } if (!mCanvasState.quickRejectConservative(0, 0, width, height)) { bool quickRejected = properties.getClipToBounds() && mCanvasState.quickRejectConservative(0, 0, width, height); if (!quickRejected) { // not rejected, so defer render as either Layer, or direct (possibly wrapped in saveLayer) if (node.getLayer()) { // HW layer Loading libs/hwui/tests/unit/RecordingCanvasTests.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -455,6 +455,23 @@ TEST(RecordingCanvas, drawRenderNode_projection) { } } TEST(RecordingCanvas, firstClipWillReplace) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { canvas.save(SaveFlags::MatrixClip); // since no explicit clip set on canvas, this should be the one observed on op: canvas.clipRect(-100, -100, 300, 300, SkRegion::kIntersect_Op); SkPaint paint; paint.setColor(SK_ColorWHITE); canvas.drawRect(0, 0, 100, 100, paint); canvas.restore(); }); ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op"; // first clip must be preserved, even if it extends beyond canvas bounds EXPECT_CLIP_RECT(Rect(-100, -100, 300, 300), dl->getOps()[0]->localClip); } TEST(RecordingCanvas, insertReorderBarrier) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { canvas.drawRect(0, 0, 400, 400, SkPaint()); Loading Loading
libs/hwui/ClipArea.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,7 @@ void ClipArea::setClip(float left, float top, float right, float bottom) { void ClipArea::clipRectWithTransform(const Rect& r, const mat4* transform, SkRegion::Op op) { if (!mPostViewportClipObserved && op == SkRegion::kIntersect_Op) op = SkRegion::kReplace_Op; onClipUpdated(); switch (mMode) { case ClipMode::Rectangle: Loading @@ -228,6 +229,7 @@ void ClipArea::clipRectWithTransform(const Rect& r, const mat4* transform, } void ClipArea::clipRegion(const SkRegion& region, SkRegion::Op op) { if (!mPostViewportClipObserved && op == SkRegion::kIntersect_Op) op = SkRegion::kReplace_Op; onClipUpdated(); enterRegionMode(); mClipRegion.op(region, op); Loading @@ -236,6 +238,7 @@ void ClipArea::clipRegion(const SkRegion& region, SkRegion::Op op) { void ClipArea::clipPathWithTransform(const SkPath& path, const mat4* transform, SkRegion::Op op) { if (!mPostViewportClipObserved && op == SkRegion::kIntersect_Op) op = SkRegion::kReplace_Op; onClipUpdated(); SkMatrix skTransform; transform->copyTo(skTransform); Loading
libs/hwui/FrameBuilder.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -203,7 +203,9 @@ void FrameBuilder::deferNodePropsAndOps(RenderNode& node) { mCanvasState.setClippingOutline(mAllocator, &(properties.getOutline())); } if (!mCanvasState.quickRejectConservative(0, 0, width, height)) { bool quickRejected = properties.getClipToBounds() && mCanvasState.quickRejectConservative(0, 0, width, height); if (!quickRejected) { // not rejected, so defer render as either Layer, or direct (possibly wrapped in saveLayer) if (node.getLayer()) { // HW layer Loading
libs/hwui/tests/unit/RecordingCanvasTests.cpp +17 −0 Original line number Diff line number Diff line Loading @@ -455,6 +455,23 @@ TEST(RecordingCanvas, drawRenderNode_projection) { } } TEST(RecordingCanvas, firstClipWillReplace) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { canvas.save(SaveFlags::MatrixClip); // since no explicit clip set on canvas, this should be the one observed on op: canvas.clipRect(-100, -100, 300, 300, SkRegion::kIntersect_Op); SkPaint paint; paint.setColor(SK_ColorWHITE); canvas.drawRect(0, 0, 100, 100, paint); canvas.restore(); }); ASSERT_EQ(1u, dl->getOps().size()) << "Must have one op"; // first clip must be preserved, even if it extends beyond canvas bounds EXPECT_CLIP_RECT(Rect(-100, -100, 300, 300), dl->getOps()[0]->localClip); } TEST(RecordingCanvas, insertReorderBarrier) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { canvas.drawRect(0, 0, 400, 400, SkPaint()); Loading