Loading libs/hwui/canvas/CanvasOpTypes.h +2 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ enum class CanvasOpType : int8_t { DrawColor, DrawRect, DrawRoundRect, DrawRoundRectProperty, DrawCircleProperty, DrawCircle, DrawOval, DrawArc, Loading libs/hwui/canvas/CanvasOps.h +31 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <SkCanvas.h> #include <SkPath.h> #include <log/log.h> #include "CanvasProperty.h" #include "CanvasOpTypes.h" Loading Loading @@ -103,6 +104,36 @@ struct CanvasOp<CanvasOpType::ClipPath> { // 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; Loading libs/hwui/tests/unit/CanvasOpTests.cpp +72 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<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); Loading Loading @@ -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<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>(); Loading Loading
libs/hwui/canvas/CanvasOpTypes.h +2 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,8 @@ enum class CanvasOpType : int8_t { DrawColor, DrawRect, DrawRoundRect, DrawRoundRectProperty, DrawCircleProperty, DrawCircle, DrawOval, DrawArc, Loading
libs/hwui/canvas/CanvasOps.h +31 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <SkCanvas.h> #include <SkPath.h> #include <log/log.h> #include "CanvasProperty.h" #include "CanvasOpTypes.h" Loading Loading @@ -103,6 +104,36 @@ struct CanvasOp<CanvasOpType::ClipPath> { // 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; Loading
libs/hwui/tests/unit/CanvasOpTests.cpp +72 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<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); Loading Loading @@ -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<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>(); Loading