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

Commit 55f479f4 authored by Nader Jawad's avatar Nader Jawad Committed by Automerger Merge Worker
Browse files

Merge "Added more CanvasOps for various drawing commands" am: 2cbfea01

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13001444

Change-Id: If14149adeabd853bba059810cc78bd81e1e0d165
parents ade0d4e8 2cbfea01
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -37,6 +37,12 @@ enum class CanvasOpType : int8_t {
    // Drawing ops
    DrawColor,
    DrawRect,
    DrawRoundRect,
    DrawCircle,
    DrawOval,
    DrawArc,
    DrawPaint,


    // TODO: Rest

+54 −0
Original line number Diff line number Diff line
@@ -111,6 +111,13 @@ struct CanvasOp<CanvasOpType::DrawColor> {
    ASSERT_DRAWABLE()
};

template <>
struct CanvasOp<CanvasOpType::DrawPaint> {
    SkPaint paint;
    void draw(SkCanvas* canvas) const { canvas->drawPaint(paint); }
    ASSERT_DRAWABLE()
};

template <>
struct CanvasOp<CanvasOpType::DrawRect> {
    SkRect rect;
@@ -119,6 +126,53 @@ struct CanvasOp<CanvasOpType::DrawRect> {
    ASSERT_DRAWABLE()
};

template<>
struct CanvasOp<CanvasOpType::DrawRoundRect> {
    SkRect rect;
    SkScalar rx;
    SkScalar ry;
    SkPaint paint;
    void draw(SkCanvas* canvas) const {
        canvas->drawRoundRect(rect, rx, ry, paint);
    }
    ASSERT_DRAWABLE()
};

template<>
struct CanvasOp<CanvasOpType::DrawCircle> {
    SkScalar cx;
    SkScalar cy;
    SkScalar radius;
    SkPaint paint;
    void draw(SkCanvas* canvas) const {
        canvas->drawCircle(cx, cy, radius, paint);
    }
    ASSERT_DRAWABLE()
};

template<>
struct CanvasOp<CanvasOpType::DrawOval> {
    SkRect oval;
    SkPaint paint;
    void draw(SkCanvas* canvas) const {
        canvas->drawOval(oval, paint);
    }
    ASSERT_DRAWABLE()
};

template<>
struct CanvasOp<CanvasOpType::DrawArc> {
    SkRect oval;
    SkScalar startAngle;
    SkScalar sweepAngle;
    bool useCenter;
    SkPaint paint;

    void draw(SkCanvas* canvas) const {
        canvas->drawArc(oval, startAngle, sweepAngle, useCenter, paint);
    }
    ASSERT_DRAWABLE()
};

// cleanup our macros
#undef ASSERT_DRAWABLE
+67 −0
Original line number Diff line number Diff line
@@ -193,6 +193,73 @@ TEST(CanvasOp, simpleDrawRect) {
    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
}

TEST(CanvasOp, simpleDrawRoundRect) {
    CanvasOpBuffer buffer;
    EXPECT_EQ(buffer.size(), 0);
    buffer.push(CanvasOp<Op::DrawRoundRect> {
        .paint = SkPaint{},
        .rect = SkRect::MakeEmpty(),
        .rx = 10,
        .ry = 10
    });

    CallCountingCanvas canvas;
    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
    rasterizeCanvasBuffer(buffer, &canvas);
    EXPECT_EQ(1, canvas.drawRRectCount);
    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
}

TEST(CanvasOp, simpleDrawCircle) {
    CanvasOpBuffer buffer;
    EXPECT_EQ(buffer.size(), 0);
    buffer.push(CanvasOp<Op::DrawCircle> {
        .cx = 5,
        .cy = 7,
        .radius = 10,
        .paint = SkPaint{}
    });

    CallCountingCanvas canvas;
    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
    rasterizeCanvasBuffer(buffer, &canvas);
    EXPECT_EQ(1, canvas.drawOvalCount);
    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
}

TEST(CanvasOp, simpleDrawOval) {
    CanvasOpBuffer buffer;
    EXPECT_EQ(buffer.size(), 0);
    buffer.push(CanvasOp<Op::DrawOval> {
        .oval = SkRect::MakeEmpty(),
        .paint = SkPaint{}
    });

    CallCountingCanvas canvas;
    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
    rasterizeCanvasBuffer(buffer, &canvas);
    EXPECT_EQ(1, canvas.drawOvalCount);
    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
}

TEST(CanvasOp, simpleDrawArc) {
    CanvasOpBuffer buffer;
    EXPECT_EQ(buffer.size(), 0);
    buffer.push(CanvasOp<Op::DrawArc> {
        .oval = SkRect::MakeWH(100, 100),
        .startAngle = 120,
        .sweepAngle = 70,
        .useCenter = true,
        .paint = SkPaint{}
    });

    CallCountingCanvas canvas;
    EXPECT_EQ(0, canvas.sumTotalDrawCalls());
    rasterizeCanvasBuffer(buffer, &canvas);
    EXPECT_EQ(1, canvas.drawArcCount);
    EXPECT_EQ(1, canvas.sumTotalDrawCalls());
}

TEST(CanvasOp, immediateRendering) {
    auto canvas = std::make_shared<CallCountingCanvas>();