OSDN Git Service

Fix drawColor/drawPaint bounds
authorChris Craik <ccraik@google.com>
Fri, 19 Feb 2016 01:49:44 +0000 (17:49 -0800)
committerChris Craik <ccraik@google.com>
Fri, 19 Feb 2016 01:49:46 +0000 (17:49 -0800)
bug:26591194

Change-Id: Icda9b6e6cdd0c12a10e06469ace02b4a89df044b

libs/hwui/RecordingCanvas.cpp
libs/hwui/tests/unit/RecordingCanvasTests.cpp

index 269e590..83e75b9 100644 (file)
@@ -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<RectOp>(
-            mState.getRenderTargetClipBounds(), // OK, since we've not passed transform
+            bounds,
             Matrix4::identity(),
-            getRecordedClip(),
+            clip,
             refPaint(&paint)));
 }
 
index 20d2f1f..9162279 100644 (file)
@@ -19,6 +19,7 @@
 #include <RecordedOp.h>
 #include <RecordingCanvas.h>
 #include <tests/common/TestUtils.h>
+#include <utils/Color.h>
 
 namespace android {
 namespace uirenderer {
@@ -169,6 +170,19 @@ TEST(RecordingCanvas, drawText_forceAlignLeft) {
     ASSERT_EQ(3, count);
 }
 
+TEST(RecordingCanvas, drawColor) {
+    auto dl = TestUtils::createDisplayList<RecordingCanvas>(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<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
         SkBitmap bitmap;