OSDN Git Service

Calculate clip bounds correctly when serializing
authorChris Craik <ccraik@google.com>
Tue, 9 Feb 2016 01:27:04 +0000 (17:27 -0800)
committerChris Craik <ccraik@google.com>
Tue, 9 Feb 2016 01:27:56 +0000 (01:27 +0000)
bug:26585671

Change-Id: Ic70769bce6fa2a7b65cb893ba4a45c65fdc0b7e3

libs/hwui/ClipArea.cpp
libs/hwui/tests/unit/ClipAreaTests.cpp

index 9c08b4d..0ae3e89 100644 (file)
@@ -361,17 +361,21 @@ const ClipBase* ClipArea::serializeClip(LinearAllocator& allocator) {
             "expect RectangleList to be trivially destructible");
 
     if (mLastSerialization == nullptr) {
+        ClipBase* serialization;
         switch (mMode) {
         case ClipMode::Rectangle:
-            mLastSerialization = allocator.create<ClipRect>(mClipRect);
+            serialization = allocator.create<ClipRect>(mClipRect);
             break;
         case ClipMode::RectangleList:
-            mLastSerialization = allocator.create<ClipRectList>(mRectangleList);
+            serialization = allocator.create<ClipRectList>(mRectangleList);
+            serialization->rect = mRectangleList.calculateBounds();
             break;
         case ClipMode::Region:
-            mLastSerialization = allocator.create<ClipRegion>(mClipRegion);
+            serialization = allocator.create<ClipRegion>(mClipRegion);
+            serialization->rect.set(mClipRegion.getBounds());
             break;
         }
+        mLastSerialization = serialization;
     }
     return mLastSerialization;
 }
index 4cae737..679569e 100644 (file)
@@ -133,7 +133,7 @@ TEST(ClipArea, serializeClip) {
         ASSERT_NE(nullptr, serializedClip);
         ASSERT_EQ(ClipMode::Rectangle, serializedClip->mode);
         auto clipRect = reinterpret_cast<const ClipRect*>(serializedClip);
-        ASSERT_EQ(Rect(200, 200), clipRect->rect);
+        EXPECT_EQ(Rect(200, 200), clipRect->rect);
         EXPECT_EQ(serializedClip, area.serializeClip(allocator))
                 << "Requery of clip on unmodified ClipArea must return same pointer.";
     }
@@ -147,7 +147,10 @@ TEST(ClipArea, serializeClip) {
         ASSERT_NE(nullptr, serializedClip);
         ASSERT_EQ(ClipMode::RectangleList, serializedClip->mode);
         auto clipRectList = reinterpret_cast<const ClipRectList*>(serializedClip);
-        ASSERT_EQ(2, clipRectList->rectList.getTransformedRectanglesCount());
+        EXPECT_EQ(2, clipRectList->rectList.getTransformedRectanglesCount());
+        EXPECT_FALSE(clipRectList->rect.isEmpty());
+        EXPECT_FLOAT_EQ(199.87817f, clipRectList->rect.right)
+            << "Right side should be clipped by rotated rect";
         EXPECT_EQ(serializedClip, area.serializeClip(allocator))
                 << "Requery of clip on unmodified ClipArea must return same pointer.";
     }
@@ -161,8 +164,9 @@ TEST(ClipArea, serializeClip) {
         ASSERT_NE(nullptr, serializedClip);
         ASSERT_EQ(ClipMode::Region, serializedClip->mode);
         auto clipRegion = reinterpret_cast<const ClipRegion*>(serializedClip);
-        ASSERT_EQ(SkIRect::MakeWH(200, 200), clipRegion->region.getBounds())
+        EXPECT_EQ(SkIRect::MakeWH(200, 200), clipRegion->region.getBounds())
                 << "Clip region should be 200x200";
+        EXPECT_EQ(Rect(200, 200), clipRegion->rect);
         EXPECT_EQ(serializedClip, area.serializeClip(allocator))
                 << "Requery of clip on unmodified ClipArea must return same pointer.";
     }