Calculate clip bounds correctly when serializing

bug:26585671

Change-Id: Ic70769bce6fa2a7b65cb893ba4a45c65fdc0b7e3
This commit is contained in:
Chris Craik
2016-02-08 17:27:04 -08:00
parent c5c898640f
commit b4f4f3e16d
2 changed files with 14 additions and 6 deletions

View 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;
}

View 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.";
}