Index: Source/platform/graphics/paint/ClipDisplayItem.cpp |
diff --git a/Source/platform/graphics/paint/ClipDisplayItem.cpp b/Source/platform/graphics/paint/ClipDisplayItem.cpp |
index 26eb7900ec54c0b23c77b90f5e579c9607c4df57..75f8c200746c5eb5b9bc942db1bab759247690c3 100644 |
--- a/Source/platform/graphics/paint/ClipDisplayItem.cpp |
+++ b/Source/platform/graphics/paint/ClipDisplayItem.cpp |
@@ -7,6 +7,7 @@ |
#include "platform/geometry/FloatRoundedRect.h" |
#include "platform/graphics/GraphicsContext.h" |
+#include "platform/graphics/paint/DisplayItems.h" |
#include "public/platform/WebDisplayItemList.h" |
#include "third_party/skia/include/core/SkScalar.h" |
@@ -15,16 +16,25 @@ namespace blink { |
void ClipDisplayItem::replay(GraphicsContext& context) |
{ |
context.save(); |
- context.clipRect(m_clipRect, NotAntiAliased, m_operation); |
- for (FloatRoundedRect roundedRect : m_roundedRectClips) |
- context.clipRoundedRect(roundedRect, m_operation); |
+ context.clipRect(m_clipRect, NotAntiAliased, SkRegion::kIntersect_Op); |
+ if (m_roundedRectClips) { |
+ for (const auto& roundedRect : *m_roundedRectClips) |
+ context.clipRoundedRect(roundedRect, SkRegion::kIntersect_Op); |
+ } |
} |
void ClipDisplayItem::appendToWebDisplayItemList(WebDisplayItemList* list) const |
{ |
- WebVector<SkRRect> webRoundedRects(m_roundedRectClips.size()); |
- for (size_t i = 0; i < m_roundedRectClips.size(); ++i) { |
- FloatRoundedRect::Radii rectRadii = m_roundedRectClips[i].radii(); |
+ if (!m_roundedRectClips) { |
+ WebVector<SkRRect> webRoundedRects; |
+ list->appendClipItem(m_clipRect, webRoundedRects); |
+ return; |
+ } |
+ |
+ Vector<FloatRoundedRect>& roundedRects = *m_roundedRectClips; |
+ WebVector<SkRRect> webRoundedRects(roundedRects.size()); |
+ for (size_t i = 0; i < m_roundedRectClips->size(); ++i) { |
+ FloatRoundedRect::Radii rectRadii = roundedRects[i].radii(); |
SkVector skRadii[4]; |
skRadii[SkRRect::kUpperLeft_Corner].set(SkIntToScalar(rectRadii.topLeft().width()), |
SkIntToScalar(rectRadii.topLeft().height())); |
@@ -35,13 +45,22 @@ void ClipDisplayItem::appendToWebDisplayItemList(WebDisplayItemList* list) const |
skRadii[SkRRect::kLowerLeft_Corner].set(SkIntToScalar(rectRadii.bottomLeft().width()), |
SkIntToScalar(rectRadii.bottomLeft().height())); |
SkRRect skRoundedRect; |
- skRoundedRect.setRectRadii(m_roundedRectClips[i].rect(), skRadii); |
+ skRoundedRect.setRectRadii(roundedRects[i].rect(), skRadii); |
webRoundedRects[i] = skRoundedRect; |
} |
// FIXME: needs to include the SkRegion::Op |
list->appendClipItem(m_clipRect, webRoundedRects); |
} |
+void ClipDisplayItem::appendByMoving(DisplayItems& destination) |
+{ |
+ destination.emplaceBack<ClipDisplayItem>( |
+ DisplayItemClientWrapperHelper(*this), |
+ type(), |
+ m_clipRect, |
+ m_roundedRectClips.release()); |
+} |
+ |
void EndClipDisplayItem::replay(GraphicsContext& context) |
{ |
context.restore(); |
@@ -52,6 +71,12 @@ void EndClipDisplayItem::appendToWebDisplayItemList(WebDisplayItemList* list) co |
list->appendEndClipItem(); |
} |
+void EndClipDisplayItem::appendByMoving(DisplayItems& destination) |
+{ |
+ destination.emplaceBack<EndClipDisplayItem>( |
+ DisplayItemClientWrapperHelper(*this), type()); |
+} |
+ |
#ifndef NDEBUG |
void ClipDisplayItem::dumpPropertiesAsDebugString(WTF::StringBuilder& stringBuilder) const |
{ |