Merge "Added support for more CanvasOps"

This commit is contained in:
Nader Jawad
2020-11-10 22:09:31 +00:00
committed by Android (Google) Code Review
3 changed files with 105 additions and 0 deletions

View File

@@ -38,6 +38,8 @@ enum class CanvasOpType : int8_t {
DrawColor,
DrawRect,
DrawRoundRect,
DrawRoundRectProperty,
DrawCircleProperty,
DrawCircle,
DrawOval,
DrawArc,

View File

@@ -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;

View File

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