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

Commit 563c5d36 authored by Stan Iliev's avatar Stan Iliev Committed by android-build-merger
Browse files

Merge "Fix pop-up shadow drawn in the wrong place with Skia pipeline" into oc-dev

am: a5c6ba34

Change-Id: If6f000705c2d7ca63ea8397a26242ef986e34e39
parents 7ef7398d a5c6ba34
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ void EndReorderBarrierDrawable::drawShadow(SkCanvas* canvas, RenderNodeDrawable*
    SkAutoCanvasRestore acr(canvas, true);

    SkMatrix shadowMatrix;
    mat4 hwuiMatrix(caster->getRecordedMatrix());
    mat4 hwuiMatrix;
    // TODO we don't pass the optional boolean to treat it as a 4x4 matrix
    caster->getRenderNode()->applyViewPropertyTransforms(hwuiMatrix);
    hwuiMatrix.copyTo(shadowMatrix);
+64 −0
Original line number Diff line number Diff line
@@ -941,3 +941,67 @@ TEST(RenderNodeDrawable, renderNode) {
    EXPECT_EQ(2, canvas.mDrawCounter);
}


TEST(ReorderBarrierDrawable, testShadowMatrix) {
    static const int CANVAS_WIDTH = 100;
    static const int CANVAS_HEIGHT = 100;
    static const float TRANSLATE_X = 11.0f;
    static const float TRANSLATE_Y = 22.0f;
    static const float CASTER_X = 40.0f;
    static const float CASTER_Y = 40.0f;
    static const float CASTER_WIDTH = 20.0f;
    static const float CASTER_HEIGHT = 20.0f;


    class ShadowTestCanvas : public SkCanvas {
    public:
        ShadowTestCanvas(int width, int height) : SkCanvas(width, height) {}
        int getIndex() { return mDrawCounter; }

        virtual void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override {
            // expect to draw 2 RenderNodeDrawable, 1 StartReorderBarrierDrawable,
            // 1 EndReorderBarrierDrawable
            mDrawCounter++;
            SkCanvas::onDrawDrawable(drawable, matrix);
        }

        virtual void didTranslate(SkScalar dx, SkScalar dy) override {
            mDrawCounter++;
            EXPECT_EQ(dx, TRANSLATE_X);
            EXPECT_EQ(dy, TRANSLATE_Y);
        }

        virtual void didConcat(const SkMatrix& matrix) override {
            // This function is invoked by EndReorderBarrierDrawable::drawShadow to apply shadow
            // matrix.
            mDrawCounter++;
            EXPECT_EQ(SkMatrix::MakeTrans(CASTER_X, CASTER_Y), matrix);
            EXPECT_EQ(SkMatrix::MakeTrans(CASTER_X+TRANSLATE_X, CASTER_Y+TRANSLATE_Y),
                    getTotalMatrix());
        }
    protected:
        int mDrawCounter = 0;
    };

    auto parent = TestUtils::createSkiaNode(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT,
            [](RenderProperties& props, SkiaRecordingCanvas& canvas) {
        canvas.translate(TRANSLATE_X, TRANSLATE_Y);
        canvas.insertReorderBarrier(true);

        auto node = TestUtils::createSkiaNode(CASTER_X, CASTER_Y, CASTER_X + CASTER_WIDTH,
                CASTER_Y + CASTER_HEIGHT,
                [](RenderProperties& props, SkiaRecordingCanvas& canvas) {
                    props.setElevation(42);
                    props.mutableOutline().setRoundRect(0, 0, 20, 20, 5, 1);
                    props.mutableOutline().setShouldClip(true);
                });
        canvas.drawRenderNode(node.get());
        canvas.insertReorderBarrier(false);
    });

    //create a canvas not backed by any device/pixels, but with dimensions to avoid quick rejection
    ShadowTestCanvas canvas(CANVAS_WIDTH, CANVAS_HEIGHT);
    RenderNodeDrawable drawable(parent.get(), &canvas, false);
    canvas.drawDrawable(&drawable);
    EXPECT_EQ(6, canvas.getIndex());
}
 No newline at end of file