Added support for more CanvasOps
Added support for DrawRoundRectProperty and DrawCircleProperty canvas APIs Test: Added tests to CanvasOpTests Change-Id: I71bae13796c3e77f28f723339f3d06fb059cf27a
This commit is contained in:
@@ -38,6 +38,8 @@ enum class CanvasOpType : int8_t {
|
||||
DrawColor,
|
||||
DrawRect,
|
||||
DrawRoundRect,
|
||||
DrawRoundRectProperty,
|
||||
DrawCircleProperty,
|
||||
DrawCircle,
|
||||
DrawOval,
|
||||
DrawArc,
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <SkCanvas.h>
|
||||
#include <SkPath.h>
|
||||
#include <log/log.h>
|
||||
#include "CanvasProperty.h"
|
||||
|
||||
#include "CanvasOpTypes.h"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 @@ 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);
|
||||
@@ -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>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user