Added more CanvasOps for various drawing commands
Added the following:
--DrawPaint
--DrawRoundRect
--DrawCircle
--DrawOval
--DrawArc
Test: Added tests to CanvasOpTest
Change-Id: I784db16c7c1d7d886d93e77f6bfb36d3070304bc
diff --git a/libs/hwui/canvas/CanvasOpTypes.h b/libs/hwui/canvas/CanvasOpTypes.h
index 2d4f2f5..c8a21f6 100644
--- a/libs/hwui/canvas/CanvasOpTypes.h
+++ b/libs/hwui/canvas/CanvasOpTypes.h
@@ -37,6 +37,12 @@
// 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 a31a91c..27eca21 100644
--- a/libs/hwui/canvas/CanvasOps.h
+++ b/libs/hwui/canvas/CanvasOps.h
@@ -112,6 +112,13 @@
};
template <>
+struct CanvasOp<CanvasOpType::DrawPaint> {
+ SkPaint paint;
+ void draw(SkCanvas* canvas) const { canvas->drawPaint(paint); }
+ ASSERT_DRAWABLE()
+};
+
+template <>
struct CanvasOp<CanvasOpType::DrawRect> {
SkRect rect;
SkPaint paint;
@@ -119,6 +126,53 @@
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
diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp
index 0815d15..c90d1a4 100644
--- a/libs/hwui/tests/unit/CanvasOpTests.cpp
+++ b/libs/hwui/tests/unit/CanvasOpTests.cpp
@@ -193,6 +193,73 @@
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>();