Merge "Added more CanvasOps for various drawing commands"

This commit is contained in:
Nader Jawad
2020-11-06 22:37:58 +00:00
committed by Android (Google) Code Review
3 changed files with 127 additions and 0 deletions

View File

@@ -37,6 +37,12 @@ enum class CanvasOpType : int8_t {
// Drawing ops
DrawColor,
DrawRect,
DrawRoundRect,
DrawCircle,
DrawOval,
DrawArc,
DrawPaint,
// TODO: Rest

View File

@@ -111,6 +111,13 @@ struct CanvasOp<CanvasOpType::DrawColor> {
ASSERT_DRAWABLE()
};
template <>
struct CanvasOp<CanvasOpType::DrawPaint> {
SkPaint paint;
void draw(SkCanvas* canvas) const { canvas->drawPaint(paint); }
ASSERT_DRAWABLE()
};
template <>
struct CanvasOp<CanvasOpType::DrawRect> {
SkRect rect;
@@ -119,6 +126,53 @@ struct CanvasOp<CanvasOpType::DrawRect> {
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

View File

@@ -193,6 +193,73 @@ TEST(CanvasOp, simpleDrawRect) {
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>();