diff options
Diffstat (limited to 'libs/hwui')
| -rw-r--r-- | libs/hwui/RecordingCanvas.cpp | 14 | ||||
| -rw-r--r-- | libs/hwui/tests/unit/RecordingCanvasTests.cpp | 17 |
2 files changed, 26 insertions, 5 deletions
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index f0c79d7b2dd7..11eb825a56b0 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -356,11 +356,15 @@ void RecordingCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { } void RecordingCanvas::drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, const SkPaint& paint) { - addOp(alloc().create_trivial<RoundRectOp>( - Rect(left, top, right, bottom), - *(mState.currentSnapshot()->transform), - getRecordedClip(), - refPaint(&paint), rx, ry)); + if (CC_LIKELY(MathUtils::isPositive(rx) || MathUtils::isPositive(ry))) { + addOp(alloc().create_trivial<RoundRectOp>( + Rect(left, top, right, bottom), + *(mState.currentSnapshot()->transform), + getRecordedClip(), + refPaint(&paint), rx, ry)); + } else { + drawRect(left, top, right, bottom, paint); + } } void RecordingCanvas::drawRoundRect( diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp index c3165bbe9c1f..5e613fd50c3e 100644 --- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp +++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp @@ -114,6 +114,23 @@ TEST(RecordingCanvas, drawRect) { EXPECT_EQ(Rect(10, 20, 90, 180), op.unmappedBounds); } +TEST(RecordingCanvas, drawRoundRect) { + // Round case - stays rounded + auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) { + canvas.drawRoundRect(0, 0, 100, 100, 10, 10, SkPaint()); + }); + ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op"; + ASSERT_EQ(RecordedOpId::RoundRectOp, dl->getOps()[0]->opId); + + // Non-rounded case - turned into drawRect + dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) { + canvas.drawRoundRect(0, 0, 100, 100, 0, -1, SkPaint()); + }); + ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op"; + ASSERT_EQ(RecordedOpId::RectOp, dl->getOps()[0]->opId) + << "Non-rounded rects should be converted"; +} + TEST(RecordingCanvas, drawText) { auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) { SkPaint paint; |