diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 78a0b13aaf900..31de305d52467 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 cd9ffc5590f84..f988da3996657 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 { @@ -185,6 +186,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;