Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b66b8bb4 authored by Stan Iliev's avatar Stan Iliev
Browse files

Ensure root render node clip cannot expand beyond dirty area

Use new Skia API to enfore clip restriction for root render node.
This brings Skia pipeline in line with HWUI. Unit test is
updated to reflect the new behaviour.

Test: Built and ran angler-eng, ran HWUI unit tests.

Change-Id: Iffce70fd37b6aff45eb6a23c8b1a64f45b5f1463
parent 6df179cd
Loading
Loading
Loading
Loading
+3 −4
Original line number Original line Diff line number Diff line
@@ -100,7 +100,7 @@ void SkiaPipeline::renderLayersImpl(const LayerUpdateQueue& layers, bool opaque)
            int saveCount = layerCanvas->save();
            int saveCount = layerCanvas->save();
            SkASSERT(saveCount == 1);
            SkASSERT(saveCount == 1);


            layerCanvas->clipRect(layerDamage.toSkRect(), SkClipOp::kReplace);
            layerCanvas->androidFramework_setDeviceClipRestriction(layerDamage.toSkIRect());


            auto savedLightCenter = mLightCenter;
            auto savedLightCenter = mLightCenter;
            // map current light center into RenderNode's coordinate space
            // map current light center into RenderNode's coordinate space
@@ -233,8 +233,8 @@ static Rect nodeBounds(RenderNode& node) {
void SkiaPipeline::renderFrameImpl(const LayerUpdateQueue& layers, const SkRect& clip,
void SkiaPipeline::renderFrameImpl(const LayerUpdateQueue& layers, const SkRect& clip,
        const std::vector<sp<RenderNode>>& nodes, bool opaque, const Rect &contentDrawBounds,
        const std::vector<sp<RenderNode>>& nodes, bool opaque, const Rect &contentDrawBounds,
        SkCanvas* canvas) {
        SkCanvas* canvas) {

    SkAutoCanvasRestore saver(canvas, true);
    canvas->clipRect(clip, SkClipOp::kReplace);
    canvas->androidFramework_setDeviceClipRestriction(clip.roundOut());


    if (!opaque) {
    if (!opaque) {
        canvas->clear(SK_ColorTRANSPARENT);
        canvas->clear(SK_ColorTRANSPARENT);
@@ -242,7 +242,6 @@ void SkiaPipeline::renderFrameImpl(const LayerUpdateQueue& layers, const SkRect&


    if (1 == nodes.size()) {
    if (1 == nodes.size()) {
        if (!nodes[0]->nothingToDraw()) {
        if (!nodes[0]->nothingToDraw()) {
            SkAutoCanvasRestore acr(canvas, true);
            RenderNodeDrawable root(nodes[0].get(), canvas);
            RenderNodeDrawable root(nodes[0].get(), canvas);
            root.draw(canvas);
            root.draw(canvas);
        }
        }
+2 −5
Original line number Original line Diff line number Diff line
@@ -324,11 +324,8 @@ RENDERTHREAD_TEST(SkiaPipeline, clip_replace) {
        }
        }
        void onDrawPaint(const SkPaint&) {
        void onDrawPaint(const SkPaint&) {
            EXPECT_EQ(0, mDrawCounter++);
            EXPECT_EQ(0, mDrawCounter++);
            //TODO: this unit test is failing on the commented check below, because of a missing
            EXPECT_EQ(SkRect::MakeLTRB(20, 10, 30, 40), TestUtils::getClipBounds(this))
            //feature. In Snapshot::applyClip HWUI is intersecting the clip with the clip root,
                    << "Expect resolved clip to be intersection of viewport clip and clip op";
            //even for kReplace_Op clips. We need to implement the same for Skia pipelines.
            //EXPECT_EQ(SkRect::MakeLTRB(20, 10, 30, 40), TestUtils::getClipBounds(this)) //got instead 20 0 30 50
            //        << "Expect resolved clip to be intersection of viewport clip and clip op";
        }
        }
        int mDrawCounter = 0;
        int mDrawCounter = 0;
    };
    };