diff options
author | 2020-11-06 22:49:42 -0800 | |
---|---|---|
committer | 2020-12-04 12:22:45 -0800 | |
commit | 4285c8a3a0ce31dcfab5a609820d08a51e7090ee (patch) | |
tree | c9fd149c49b5989307c367e091c3c2b5cf365659 | |
parent | 27bb3d0cc123f5d22a66b5c0fb2cab79bdbff4e1 (diff) |
Add support for CanvasOps to draw multiple lines or
points in a single call
--DrawPoints
--DrawLines
Introduced wrapper Points class to
handle containing collections of SkPoints
that is compatible with ref counted pointer
implementations
Bug: 174854640
Test: Added tests to CanvasOpTests
Change-Id: Id4a47a470815d2970c54dac25e59af8512193348
-rw-r--r-- | libs/hwui/canvas/CanvasOpTypes.h | 2 | ||||
-rw-r--r-- | libs/hwui/canvas/CanvasOps.h | 33 | ||||
-rw-r--r-- | libs/hwui/canvas/Points.h | 48 | ||||
-rw-r--r-- | libs/hwui/tests/unit/CanvasOpTests.cpp | 49 |
4 files changed, 132 insertions, 0 deletions
diff --git a/libs/hwui/canvas/CanvasOpTypes.h b/libs/hwui/canvas/CanvasOpTypes.h index 2dfddaca0919..f0aa7774a6cc 100644 --- a/libs/hwui/canvas/CanvasOpTypes.h +++ b/libs/hwui/canvas/CanvasOpTypes.h @@ -47,8 +47,10 @@ enum class CanvasOpType : int8_t { DrawArc, DrawPaint, DrawPoint, + DrawPoints, DrawPath, DrawLine, + DrawLines, DrawVertices, DrawImage, DrawImageRect, diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h index b499733757a8..242dbdb27362 100644 --- a/libs/hwui/canvas/CanvasOps.h +++ b/libs/hwui/canvas/CanvasOps.h @@ -26,6 +26,7 @@ #include <hwui/Bitmap.h> #include <log/log.h> #include "CanvasProperty.h" +#include "Points.h" #include "CanvasOpTypes.h" #include "Layer.h" @@ -166,6 +167,22 @@ struct CanvasOp<CanvasOpType::DrawPoint> { }; template <> +struct CanvasOp<CanvasOpType::DrawPoints> { + size_t count; + SkPaint paint; + sk_sp<Points> points; + void draw(SkCanvas* canvas) const { + canvas->drawPoints( + SkCanvas::kPoints_PointMode, + count, + points->data(), + paint + ); + } + ASSERT_DRAWABLE() +}; + +template <> struct CanvasOp<CanvasOpType::DrawRect> { SkRect rect; SkPaint paint; @@ -264,6 +281,22 @@ struct CanvasOp<CanvasOpType::DrawLine> { }; template<> +struct CanvasOp<CanvasOpType::DrawLines> { + size_t count; + SkPaint paint; + sk_sp<Points> points; + void draw(SkCanvas* canvas) const { + canvas->drawPoints( + SkCanvas::kLines_PointMode, + count, + points->data(), + paint + ); + } + ASSERT_DRAWABLE() +}; + +template<> struct CanvasOp<CanvasOpType::DrawVertices> { sk_sp<SkVertices> vertices; SkBlendMode mode; diff --git a/libs/hwui/canvas/Points.h b/libs/hwui/canvas/Points.h new file mode 100644 index 000000000000..05e6a7dd5884 --- /dev/null +++ b/libs/hwui/canvas/Points.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <ui/FatVector.h> +#include "SkPoint.h" +#include "SkRefCnt.h" + +/** + * Collection of points that are ref counted and to be used with + * various drawing calls that consume SkPoint as inputs like + * drawLines/drawPoints + */ +class Points: public SkNVRefCnt<SkPoint> { +public: + Points(int size){ + skPoints.resize(size); + } + + Points(std::initializer_list<SkPoint> init): skPoints(init) { } + + SkPoint& operator[](int index) { + return skPoints[index]; + } + + const SkPoint* data() const { + return skPoints.data(); + } + + size_t size() const { + return skPoints.size(); + } +private: + // Initialize the size to contain 2 SkPoints on the stack for optimized + // drawLine calls that require 2 SkPoints for start/end points of the line + android::FatVector<SkPoint, 2> skPoints; +}; diff --git a/libs/hwui/tests/unit/CanvasOpTests.cpp b/libs/hwui/tests/unit/CanvasOpTests.cpp index f186e55ec2e3..033a5872ead3 100644 --- a/libs/hwui/tests/unit/CanvasOpTests.cpp +++ b/libs/hwui/tests/unit/CanvasOpTests.cpp @@ -245,6 +245,31 @@ TEST(CanvasOp, simpleDrawPoint) { EXPECT_EQ(1, canvas.sumTotalDrawCalls()); } +TEST(CanvasOp, simpleDrawPoints) { + CanvasOpBuffer buffer; + EXPECT_EQ(buffer.size(), 0); + size_t numPts = 3; + auto pts = sk_ref_sp( + new Points({ + {32, 16}, + {48, 48}, + {16, 32} + }) + ); + + buffer.push(CanvasOp<Op::DrawPoints> { + .count = numPts, + .paint = SkPaint{}, + .points = pts + }); + + CallCountingCanvas canvas; + EXPECT_EQ(0, canvas.sumTotalDrawCalls()); + rasterizeCanvasBuffer(buffer, &canvas); + EXPECT_EQ(1, canvas.drawPoints); + EXPECT_EQ(1, canvas.sumTotalDrawCalls()); +} + TEST(CanvasOp, simpleDrawLine) { CanvasOpBuffer buffer; EXPECT_EQ(buffer.size(), 0); @@ -263,6 +288,30 @@ TEST(CanvasOp, simpleDrawLine) { EXPECT_EQ(1, canvas.sumTotalDrawCalls()); } +TEST(CanvasOp, simpleDrawLines) { + CanvasOpBuffer buffer; + EXPECT_EQ(buffer.size(), 0); + size_t numPts = 3; + auto pts = sk_ref_sp( + new Points({ + {32, 16}, + {48, 48}, + {16, 32} + }) + ); + buffer.push(CanvasOp<Op::DrawLines> { + .count = numPts, + .paint = SkPaint{}, + .points = pts + }); + + CallCountingCanvas canvas; + EXPECT_EQ(0, canvas.sumTotalDrawCalls()); + rasterizeCanvasBuffer(buffer, &canvas); + EXPECT_EQ(1, canvas.drawPoints); + EXPECT_EQ(1, canvas.sumTotalDrawCalls()); +} + TEST(CanvasOp, simpleDrawRect) { CanvasOpBuffer buffer; EXPECT_EQ(buffer.size(), 0); |