From d5c2b6d223908c1006e44b2827e43127aff8f3b2 Mon Sep 17 00:00:00 2001 From: Nader Jawad Date: Thu, 5 Nov 2020 19:12:29 -0800 Subject: [PATCH] Added more CanvasOps for various drawing commands Added the following: --DrawPaint --DrawRoundRect --DrawCircle --DrawOval --DrawArc Test: Added tests to CanvasOpTest Change-Id: I784db16c7c1d7d886d93e77f6bfb36d3070304bc --- libs/hwui/canvas/CanvasOpTypes.h | 6 +++ libs/hwui/canvas/CanvasOps.h | 54 +++++++++++++++++++++ libs/hwui/tests/unit/CanvasOpTests.cpp | 67 ++++++++++++++++++++++++++ 3 files changed, 127 insertions(+) diff --git a/libs/hwui/canvas/CanvasOpTypes.h b/libs/hwui/canvas/CanvasOpTypes.h index 2d4f2f5797178..c8a21f6e129d3 100644 --- a/libs/hwui/canvas/CanvasOpTypes.h +++ b/libs/hwui/canvas/CanvasOpTypes.h @@ -37,6 +37,12 @@ enum class CanvasOpType : int8_t { // Drawing ops DrawColor, DrawRect, + DrawRoundRect, + DrawCircle, + DrawOval, + DrawArc, + DrawPaint, + // TODO: Rest diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h index a31a91c352686..27eca210a03d2 100644 --- a/libs/hwui/canvas/CanvasOps.h +++ b/libs/hwui/canvas/CanvasOps.h @@ -111,6 +111,13 @@ struct CanvasOp { ASSERT_DRAWABLE() }; +template <> +struct CanvasOp { + SkPaint paint; + void draw(SkCanvas* canvas) const { canvas->drawPaint(paint); } + ASSERT_DRAWABLE() +}; + template <> struct CanvasOp { SkRect rect; @@ -119,6 +126,53 @@ struct CanvasOp { ASSERT_DRAWABLE() }; +template<> +struct CanvasOp { + SkRect rect; + SkScalar rx; + SkScalar ry; + SkPaint paint; + void draw(SkCanvas* canvas) const { + canvas->drawRoundRect(rect, rx, ry, paint); + } + ASSERT_DRAWABLE() +}; + +template<> +struct CanvasOp { + SkScalar cx; + SkScalar cy; + SkScalar radius; + SkPaint paint; + void draw(SkCanvas* canvas) const { + canvas->drawCircle(cx, cy, radius, paint); + } + ASSERT_DRAWABLE() +}; + +template<> +struct CanvasOp { + SkRect oval; + SkPaint paint; + void draw(SkCanvas* canvas) const { + canvas->drawOval(oval, paint); + } + ASSERT_DRAWABLE() +}; + +template<> +struct CanvasOp { + 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 diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp index 0815d15d29f2c..c90d1a4f8cda3 100644 --- a/libs/hwui/tests/unit/CanvasOpTests.cpp +++ b/libs/hwui/tests/unit/CanvasOpTests.cpp @@ -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 { + .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 { + .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 { + .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 { + .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();