Index: third_party/WebKit/Source/core/paint/SVGClipPainter.cpp |
diff --git a/third_party/WebKit/Source/core/paint/SVGClipPainter.cpp b/third_party/WebKit/Source/core/paint/SVGClipPainter.cpp |
index 244719831325e44ef7ce14476052c622c4b38446..806cad631f9bcec3e41a5356a486cf659604acad 100644 |
--- a/third_party/WebKit/Source/core/paint/SVGClipPainter.cpp |
+++ b/third_party/WebKit/Source/core/paint/SVGClipPainter.cpp |
@@ -6,6 +6,7 @@ |
#include "core/dom/ElementTraversal.h" |
#include "core/layout/svg/LayoutSVGResourceClipper.h" |
+#include "core/layout/svg/SVGLayoutSupport.h" |
#include "core/layout/svg/SVGResources.h" |
#include "core/layout/svg/SVGResourcesCache.h" |
#include "core/paint/LayoutObjectDrawingRecorder.h" |
@@ -15,6 +16,7 @@ |
#include "platform/graphics/paint/CompositingRecorder.h" |
#include "platform/graphics/paint/DrawingDisplayItem.h" |
#include "platform/graphics/paint/PaintController.h" |
+#include "platform/graphics/paint/SkPictureBuilder.h" |
namespace blink { |
@@ -66,22 +68,11 @@ bool SVGClipPainter::prepareEffect(const LayoutObject& target, const FloatRect& |
// Begin compositing the clip mask. |
CompositingRecorder::beginCompositing(context, target, SkXfermode::kSrcOver_Mode, 1, &paintInvalidationRect); |
{ |
- TransformRecorder recorder(context, target, animatedLocalTransform); |
- |
- // clipPath can also be clipped by another clipPath. |
- SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(&m_clip); |
- LayoutSVGResourceClipper* clipPathClipper = resources ? resources->clipper() : 0; |
- ClipperState clipPathClipperState = ClipperNotApplied; |
- if (clipPathClipper && !SVGClipPainter(*clipPathClipper).prepareEffect(m_clip, targetBoundingBox, paintInvalidationRect, context, clipPathClipperState)) { |
+ if (!drawClipAsMask(context, target, targetBoundingBox, paintInvalidationRect, animatedLocalTransform)) { |
// End the clip mask's compositor. |
CompositingRecorder::endCompositing(context, target); |
return false; |
} |
- |
- drawClipMaskContent(context, target, targetBoundingBox, paintInvalidationRect); |
- |
- if (clipPathClipper) |
- SVGClipPainter(*clipPathClipper).finishEffect(m_clip, context, clipPathClipperState); |
} |
// Masked content layer start. |
@@ -109,19 +100,44 @@ void SVGClipPainter::finishEffect(const LayoutObject& target, GraphicsContext& c |
} |
} |
-void SVGClipPainter::drawClipMaskContent(GraphicsContext& context, const LayoutObject& layoutObject, const FloatRect& targetBoundingBox, const FloatRect& targetPaintInvalidationRect) |
+bool SVGClipPainter::drawClipAsMask(GraphicsContext& context, const LayoutObject& layoutObject, const FloatRect& targetBoundingBox, const FloatRect& targetPaintInvalidationRect, const AffineTransform& localTransform) |
{ |
- AffineTransform contentTransformation; |
- RefPtr<const SkPicture> clipContentPicture = m_clip.createContentPicture(contentTransformation, targetBoundingBox, context); |
- |
if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(context, layoutObject, DisplayItem::SVGClip)) |
- return; |
+ return true; |
+ |
+ SkPictureBuilder maskPictureBuilder(targetPaintInvalidationRect, nullptr, &context); |
+ GraphicsContext& maskContext = maskPictureBuilder.context(); |
+ { |
+ TransformRecorder recorder(maskContext, layoutObject, localTransform); |
+ |
+ // Create a clipPathClipper if this clipPath is clipped by another clipPath. |
+ SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(&m_clip); |
+ LayoutSVGResourceClipper* clipPathClipper = resources ? resources->clipper() : nullptr; |
+ ClipperState clipPathClipperState = ClipperNotApplied; |
+ if (clipPathClipper && !SVGClipPainter(*clipPathClipper).prepareEffect(m_clip, targetBoundingBox, targetPaintInvalidationRect, maskContext, clipPathClipperState)) |
+ return false; |
+ |
+ { |
+ AffineTransform contentTransform; |
+ if (m_clip.clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { |
+ contentTransform.translate(targetBoundingBox.x(), targetBoundingBox.y()); |
+ contentTransform.scaleNonUniform(targetBoundingBox.width(), targetBoundingBox.height()); |
+ } |
+ SubtreeContentTransformScope contentTransformScope(contentTransform); |
chrishtr
2016/03/29 18:45:40
This used to be allocated only if m_clipContentPic
chrishtr
2016/03/29 19:05:31
Per offline conversation: SubtreeContentTransformS
|
+ |
+ TransformRecorder contentTransformRecorder(maskContext, layoutObject, contentTransform); |
+ RefPtr<const SkPicture> clipContentPicture = m_clip.createContentPicture(); |
+ maskContext.getPaintController().createAndAppend<DrawingDisplayItem>(layoutObject, DisplayItem::SVGClip, clipContentPicture.get()); |
+ } |
+ |
+ if (clipPathClipper) |
+ SVGClipPainter(*clipPathClipper).finishEffect(m_clip, maskContext, clipPathClipperState); |
+ } |
LayoutObjectDrawingRecorder drawingRecorder(context, layoutObject, DisplayItem::SVGClip, targetPaintInvalidationRect); |
- context.save(); |
- context.concatCTM(contentTransformation); |
- context.drawPicture(clipContentPicture.get()); |
- context.restore(); |
+ RefPtr<SkPicture> maskPicture = maskPictureBuilder.endRecording(); |
+ context.drawPicture(maskPicture.get()); |
+ return true; |
} |
} // namespace blink |