From 2dbb4c46ee648c64bb977b6839374d73b5a605d9 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Fri, 11 Mar 2016 18:58:37 -0800 Subject: [PATCH] Unrounded round rects are just rects Change-Id: I66517390943192e4725251b316a3d8c332c2b77d --- libs/hwui/RecordingCanvas.cpp | 14 +++++++++----- 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( - 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( + 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(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(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(200, 200, [](RecordingCanvas& canvas) { SkPaint paint; -- 2.11.0