From de3ce84494b55c1119ef7753162923e3fe9557bf Mon Sep 17 00:00:00 2001 From: Nader Jawad Date: Fri, 6 Nov 2020 16:54:48 -0800 Subject: [PATCH] Added support for more CanvasOps Added support for DrawRoundRectProperty and DrawCircleProperty canvas APIs Test: Added tests to CanvasOpTests Change-Id: I71bae13796c3e77f28f723339f3d06fb059cf27a --- libs/hwui/canvas/CanvasOpTypes.h | 2 + libs/hwui/canvas/CanvasOps.h | 31 +++++++++++ libs/hwui/tests/unit/CanvasOpTests.cpp | 72 ++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) diff --git a/libs/hwui/canvas/CanvasOpTypes.h b/libs/hwui/canvas/CanvasOpTypes.h index c8a21f6e129d3..895c6d069bf7f 100644 --- a/libs/hwui/canvas/CanvasOpTypes.h +++ b/libs/hwui/canvas/CanvasOpTypes.h @@ -38,6 +38,8 @@ enum class CanvasOpType : int8_t { DrawColor, DrawRect, DrawRoundRect, + DrawRoundRectProperty, + DrawCircleProperty, DrawCircle, DrawOval, DrawArc, diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h index 27eca210a03d2..afd88c04a8580 100644 --- a/libs/hwui/canvas/CanvasOps.h +++ b/libs/hwui/canvas/CanvasOps.h @@ -20,6 +20,7 @@ #include #include #include +#include "CanvasProperty.h" #include "CanvasOpTypes.h" @@ -103,6 +104,36 @@ struct CanvasOp { // Drawing Ops // --------------------------------------------- +template<> +struct CanvasOp { + sp left; + sp top; + sp right; + sp bottom; + sp rx; + sp ry; + sp paint; + + void draw(SkCanvas* canvas) const { + SkRect rect = SkRect::MakeLTRB(left->value, top->value, right->value, bottom->value); + canvas->drawRoundRect(rect, rx->value, ry->value, paint->value); + } + ASSERT_DRAWABLE() +}; + +template<> +struct CanvasOp { + sp x; + sp y; + sp radius; + sp paint; + + void draw(SkCanvas* canvas) const { + canvas->drawCircle(x->value, y->value, radius->value, paint->value); + } + ASSERT_DRAWABLE() +}; + template <> struct CanvasOp { SkColor4f color; diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp index c90d1a4f8cda3..231192444caf8 100644 --- a/libs/hwui/tests/unit/CanvasOpTests.cpp +++ b/libs/hwui/tests/unit/CanvasOpTests.cpp @@ -22,6 +22,9 @@ #include +#include "SkColor.h" +#include "pipeline/skia/AnimatedDrawables.h" + using namespace android; using namespace android::uirenderer; using namespace android::uirenderer::test; @@ -178,6 +181,21 @@ TEST(CanvasOp, simplePush) { EXPECT_EQ(buffer.size(), 0); } +TEST(CanvasOp, simpleDrawPaint) { + CanvasOpBuffer buffer; + EXPECT_EQ(buffer.size(), 0); + buffer.push(CanvasOp { + .color = SkColor4f{1, 1, 1, 1}, + .mode = SkBlendMode::kSrcIn + }); + + CallCountingCanvas canvas; + EXPECT_EQ(0, canvas.sumTotalDrawCalls()); + rasterizeCanvasBuffer(buffer, &canvas); + EXPECT_EQ(1, canvas.drawPaintCount); + EXPECT_EQ(1, canvas.sumTotalDrawCalls()); +} + TEST(CanvasOp, simpleDrawRect) { CanvasOpBuffer buffer; EXPECT_EQ(buffer.size(), 0); @@ -260,6 +278,60 @@ TEST(CanvasOp, simpleDrawArc) { EXPECT_EQ(1, canvas.sumTotalDrawCalls()); } +TEST(CanvasOp, simpleDrawRoundRectProperty) { + CanvasOpBuffer buffer; + EXPECT_EQ(buffer.size(), 0); + + auto left = sp(new uirenderer::CanvasPropertyPrimitive(1)); + auto top = sp(new uirenderer::CanvasPropertyPrimitive(2)); + auto right = sp(new uirenderer::CanvasPropertyPrimitive(3)); + auto bottom = sp(new uirenderer::CanvasPropertyPrimitive(4)); + auto radiusX = sp(new uirenderer::CanvasPropertyPrimitive(5)); + auto radiusY = sp(new uirenderer::CanvasPropertyPrimitive(6)); + auto propertyPaint = + sp(new uirenderer::CanvasPropertyPaint(SkPaint{})); + + buffer.push(CanvasOp { + .left = left, + .top = top, + .right = right, + .bottom = bottom, + .rx = radiusX, + .ry = radiusY, + .paint = propertyPaint + }); + + CallCountingCanvas canvas; + EXPECT_EQ(0, canvas.sumTotalDrawCalls()); + rasterizeCanvasBuffer(buffer, &canvas); + EXPECT_EQ(1, canvas.drawRRectCount); + EXPECT_EQ(1, canvas.sumTotalDrawCalls()); +} + +TEST(CanvasOp, simpleDrawCircleProperty) { + CanvasOpBuffer buffer; + EXPECT_EQ(buffer.size(), 0); + + auto x = sp(new uirenderer::CanvasPropertyPrimitive(1)); + auto y = sp(new uirenderer::CanvasPropertyPrimitive(2)); + auto radius = sp(new uirenderer::CanvasPropertyPrimitive(5)); + auto propertyPaint = + sp(new uirenderer::CanvasPropertyPaint(SkPaint{})); + + buffer.push(CanvasOp { + .x = x, + .y = y, + .radius = radius, + .paint = propertyPaint + }); + + CallCountingCanvas canvas; + EXPECT_EQ(0, canvas.sumTotalDrawCalls()); + rasterizeCanvasBuffer(buffer, &canvas); + EXPECT_EQ(1, canvas.drawOvalCount); + EXPECT_EQ(1, canvas.sumTotalDrawCalls()); +} + TEST(CanvasOp, immediateRendering) { auto canvas = std::make_shared();