Added support for more CanvasOps
Added support for DrawRoundRectProperty and
DrawCircleProperty canvas APIs
Test: Added tests to CanvasOpTests
Change-Id: I71bae13796c3e77f28f723339f3d06fb059cf27a
diff --git a/libs/hwui/canvas/CanvasOpTypes.h b/libs/hwui/canvas/CanvasOpTypes.h
index c8a21f6..895c6d0 100644
--- a/libs/hwui/canvas/CanvasOpTypes.h
+++ b/libs/hwui/canvas/CanvasOpTypes.h
@@ -38,6 +38,8 @@
DrawColor,
DrawRect,
DrawRoundRect,
+ DrawRoundRectProperty,
+ DrawCircleProperty,
DrawCircle,
DrawOval,
DrawArc,
diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h
index 27eca21..afd88c0 100644
--- a/libs/hwui/canvas/CanvasOps.h
+++ b/libs/hwui/canvas/CanvasOps.h
@@ -20,6 +20,7 @@
#include <SkCanvas.h>
#include <SkPath.h>
#include <log/log.h>
+#include "CanvasProperty.h"
#include "CanvasOpTypes.h"
@@ -103,6 +104,36 @@
// Drawing Ops
// ---------------------------------------------
+template<>
+struct CanvasOp<CanvasOpType::DrawRoundRectProperty> {
+ sp<uirenderer::CanvasPropertyPrimitive> left;
+ sp<uirenderer::CanvasPropertyPrimitive> top;
+ sp<uirenderer::CanvasPropertyPrimitive> right;
+ sp<uirenderer::CanvasPropertyPrimitive> bottom;
+ sp<uirenderer::CanvasPropertyPrimitive> rx;
+ sp<uirenderer::CanvasPropertyPrimitive> ry;
+ sp<uirenderer::CanvasPropertyPaint> 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<CanvasOpType::DrawCircleProperty> {
+ sp<uirenderer::CanvasPropertyPrimitive> x;
+ sp<uirenderer::CanvasPropertyPrimitive> y;
+ sp<uirenderer::CanvasPropertyPrimitive> radius;
+ sp<uirenderer::CanvasPropertyPaint> paint;
+
+ void draw(SkCanvas* canvas) const {
+ canvas->drawCircle(x->value, y->value, radius->value, paint->value);
+ }
+ ASSERT_DRAWABLE()
+};
+
template <>
struct CanvasOp<CanvasOpType::DrawColor> {
SkColor4f color;
diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp
index c90d1a4..2311924 100644
--- a/libs/hwui/tests/unit/CanvasOpTests.cpp
+++ b/libs/hwui/tests/unit/CanvasOpTests.cpp
@@ -22,6 +22,9 @@
#include <tests/common/CallCountingCanvas.h>
+#include "SkColor.h"
+#include "pipeline/skia/AnimatedDrawables.h"
+
using namespace android;
using namespace android::uirenderer;
using namespace android::uirenderer::test;
@@ -178,6 +181,21 @@
EXPECT_EQ(buffer.size(), 0);
}
+TEST(CanvasOp, simpleDrawPaint) {
+ CanvasOpBuffer buffer;
+ EXPECT_EQ(buffer.size(), 0);
+ buffer.push(CanvasOp<Op::DrawColor> {
+ .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 @@
EXPECT_EQ(1, canvas.sumTotalDrawCalls());
}
+TEST(CanvasOp, simpleDrawRoundRectProperty) {
+ CanvasOpBuffer buffer;
+ EXPECT_EQ(buffer.size(), 0);
+
+ auto left = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(1));
+ auto top = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(2));
+ auto right = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(3));
+ auto bottom = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(4));
+ auto radiusX = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(5));
+ auto radiusY = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(6));
+ auto propertyPaint =
+ sp<uirenderer::CanvasPropertyPaint>(new uirenderer::CanvasPropertyPaint(SkPaint{}));
+
+ buffer.push(CanvasOp<Op::DrawRoundRectProperty> {
+ .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<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(1));
+ auto y = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(2));
+ auto radius = sp<CanvasPropertyPrimitive>(new uirenderer::CanvasPropertyPrimitive(5));
+ auto propertyPaint =
+ sp<uirenderer::CanvasPropertyPaint>(new uirenderer::CanvasPropertyPaint(SkPaint{}));
+
+ buffer.push(CanvasOp<Op::DrawCircleProperty> {
+ .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<CallCountingCanvas>();