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>();