Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de3ce844 authored by Nader Jawad's avatar Nader Jawad
Browse files

Added support for more CanvasOps

Added support for DrawRoundRectProperty and
DrawCircleProperty canvas APIs

Test: Added tests to CanvasOpTests
Change-Id: I71bae13796c3e77f28f723339f3d06fb059cf27a
parent d5c2b6d2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ enum class CanvasOpType : int8_t {
    DrawColor,
    DrawRect,
    DrawRoundRect,
    DrawRoundRectProperty,
    DrawCircleProperty,
    DrawCircle,
    DrawOval,
    DrawArc,
+31 −0
Original line number Diff line number Diff line
@@ -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;
+72 −0
Original line number Diff line number Diff line
@@ -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>();