From 1713c7773cea83a9c1ba7e08c73434df33ca6f4b Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Thu, 18 Feb 2016 17:49:44 -0800 Subject: [PATCH] Fix drawColor/drawPaint bounds bug:26591194 Change-Id: Icda9b6e6cdd0c12a10e06469ace02b4a89df044b --- libs/hwui/RecordingCanvas.cpp | 7 +++++-- libs/hwui/tests/unit/RecordingCanvasTests.cpp | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 269e590892d38..83e75b90bc3bf 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -241,10 +241,13 @@ void RecordingCanvas::drawColor(int color, SkXfermode::Mode mode) { } void RecordingCanvas::drawPaint(const SkPaint& paint) { + const ClipBase* clip = getRecordedClip(); + // if there's no current clip, draw a big rect and hope we cover the eventual clip bounds + Rect bounds = clip ? clip->rect : Rect(-10000, -10000, 10000, 10000); addOp(alloc().create_trivial( - mState.getRenderTargetClipBounds(), // OK, since we've not passed transform + bounds, Matrix4::identity(), - getRecordedClip(), + clip, refPaint(&paint))); } diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp index 20d2f1f18c587..91622796d1ca1 100644 --- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp +++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace android { namespace uirenderer { @@ -169,6 +170,19 @@ TEST(RecordingCanvas, drawText_forceAlignLeft) { ASSERT_EQ(3, count); } +TEST(RecordingCanvas, drawColor) { + auto dl = TestUtils::createDisplayList(200, 200, [](RecordingCanvas& canvas) { + canvas.drawColor(Color::Black, SkXfermode::kSrcOver_Mode); + }); + + ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op"; + auto op = *(dl->getOps()[0]); + EXPECT_EQ(RecordedOpId::RectOp, op.opId); + EXPECT_EQ(nullptr, op.localClip); + EXPECT_TRUE(op.unmappedBounds.contains(Rect(-1000, -1000, 1000, 1000))) + << "no clip, unmappedBounds should resolve to be much larger than DL bounds"; +} + TEST(RecordingCanvas, backgroundAndImage) { auto dl = TestUtils::createDisplayList(100, 200, [](RecordingCanvas& canvas) { SkBitmap bitmap;