Index: Source/core/layout/svg/LayoutSVGResourceMasker.cpp |
diff --git a/Source/core/layout/svg/LayoutSVGResourceMasker.cpp b/Source/core/layout/svg/LayoutSVGResourceMasker.cpp |
index 10524d9a199c3e86a963dfc996a598bc49d14302..89cf515a8cb32f27ff92afd52cbf0f4813d5e7cc 100644 |
--- a/Source/core/layout/svg/LayoutSVGResourceMasker.cpp |
+++ b/Source/core/layout/svg/LayoutSVGResourceMasker.cpp |
@@ -22,9 +22,14 @@ |
#include "core/dom/ElementTraversal.h" |
#include "core/layout/svg/SVGLayoutSupport.h" |
+#include "core/paint/CompositingRecorder.h" |
#include "core/paint/SVGPaintContext.h" |
+#include "core/paint/TransformRecorder.h" |
#include "core/svg/SVGElement.h" |
#include "platform/graphics/GraphicsContextStateSaver.h" |
+#include "platform/graphics/paint/CompositingDisplayItem.h" |
+#include "platform/graphics/paint/DisplayItemList.h" |
+#include "platform/graphics/paint/DrawingDisplayItem.h" |
#include "platform/transforms/AffineTransform.h" |
#include "third_party/skia/include/core/SkPicture.h" |
@@ -65,8 +70,13 @@ bool LayoutSVGResourceMasker::prepareEffect(LayoutObject* object, GraphicsContex |
if (paintInvalidationRect.isEmpty() || !element()->hasChildren()) |
return false; |
- // Content layer start. |
- context->beginTransparencyLayer(1, &paintInvalidationRect); |
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
+ ASSERT(context->displayItemList()); |
+ context->displayItemList()->add(BeginCompositingDisplayItem::create(object->displayItemClient(), WebCoreCompositeToSkiaComposite(context->compositeOperationDeprecated(), WebBlendModeNormal), 1, &paintInvalidationRect)); |
+ } else { |
+ BeginCompositingDisplayItem beginCompositingContent(object->displayItemClient(), WebCoreCompositeToSkiaComposite(context->compositeOperationDeprecated(), WebBlendModeNormal), 1, &paintInvalidationRect); |
+ beginCompositingContent.replay(context); |
+ } |
return true; |
} |
@@ -79,30 +89,23 @@ void LayoutSVGResourceMasker::finishEffect(LayoutObject* object, GraphicsContext |
ASSERT_WITH_SECURITY_IMPLICATION(!needsLayout()); |
FloatRect paintInvalidationRect = object->paintInvalidationRectInLocalCoordinates(); |
- |
- const SVGLayoutStyle& svgStyle = style()->svgStyle(); |
- ColorFilter maskLayerFilter = svgStyle.maskType() == MT_LUMINANCE |
- ? ColorFilterLuminanceToAlpha : ColorFilterNone; |
- ColorFilter maskContentFilter = svgStyle.colorInterpolation() == CI_LINEARRGB |
- ? ColorFilterSRGBToLinearRGB : ColorFilterNone; |
- |
- // Mask layer start. |
- context->beginLayer(1, SkXfermode::kDstIn_Mode, &paintInvalidationRect, maskLayerFilter); |
{ |
- // Draw the mask with color conversion (when needed). |
- GraphicsContextStateSaver maskContentSaver(*context); |
- context->setColorFilter(maskContentFilter); |
- |
- drawMaskForRenderer(context, object->objectBoundingBox()); |
+ ColorFilter maskLayerFilter = style()->svgStyle().maskType() == MT_LUMINANCE |
+ ? ColorFilterLuminanceToAlpha : ColorFilterNone; |
+ CompositingRecorder maskCompositing(context, object->displayItemClient(), SkXfermode::kDstIn_Mode, 1, &paintInvalidationRect, maskLayerFilter); |
+ drawMaskForRenderer(context, object->displayItemClient(), object->objectBoundingBox()); |
} |
- // Transfer mask layer -> content layer (DstIn) |
- context->endLayer(); |
- // Transfer content layer -> backdrop (SrcOver) |
- context->endLayer(); |
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
+ ASSERT(context->displayItemList()); |
+ context->displayItemList()->add(EndCompositingDisplayItem::create(object->displayItemClient())); |
+ } else { |
+ EndCompositingDisplayItem endCompositingContent(object->displayItemClient()); |
+ endCompositingContent.replay(context); |
+ } |
} |
-void LayoutSVGResourceMasker::drawMaskForRenderer(GraphicsContext* context, const FloatRect& targetBoundingBox) |
+void LayoutSVGResourceMasker::drawMaskForRenderer(GraphicsContext* context, DisplayItemClient client, const FloatRect& targetBoundingBox) |
{ |
ASSERT(context); |
@@ -111,26 +114,41 @@ void LayoutSVGResourceMasker::drawMaskForRenderer(GraphicsContext* context, cons |
if (contentUnits == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) { |
contentTransformation.translate(targetBoundingBox.x(), targetBoundingBox.y()); |
contentTransformation.scaleNonUniform(targetBoundingBox.width(), targetBoundingBox.height()); |
- context->concatCTM(contentTransformation); |
} |
if (!m_maskContentPicture) { |
SubtreeContentTransformScope contentTransformScope(contentTransformation); |
- createPicture(context); |
+ m_maskContentPicture = createContentPicture(); |
} |
- context->drawPicture(m_maskContentPicture.get()); |
+ TransformRecorder recorder(*context, client, contentTransformation); |
+ |
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
+ ASSERT(context->displayItemList()); |
+ context->displayItemList()->add(DrawingDisplayItem::create(client, DisplayItem::SVGMask, m_maskContentPicture)); |
+ } else { |
+ DrawingDisplayItem maskPicture(client, DisplayItem::SVGMask, m_maskContentPicture); |
+ maskPicture.replay(context); |
+ } |
} |
-void LayoutSVGResourceMasker::createPicture(GraphicsContext* context) |
+PassRefPtr<const SkPicture> LayoutSVGResourceMasker::createContentPicture() |
{ |
- ASSERT(context); |
- |
// Using strokeBoundingBox (instead of paintInvalidationRectInLocalCoordinates) to avoid the intersection |
// with local clips/mask, which may yield incorrect results when mixing objectBoundingBox and |
// userSpaceOnUse units (http://crbug.com/294900). |
FloatRect bounds = strokeBoundingBox(); |
- context->beginRecording(bounds); |
+ |
+ OwnPtr<DisplayItemList> displayItemList; |
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) |
+ displayItemList = DisplayItemList::create(); |
+ GraphicsContext context(nullptr, displayItemList.get()); |
+ context.beginRecording(bounds); |
+ |
+ ColorFilter maskContentFilter = style()->svgStyle().colorInterpolation() == CI_LINEARRGB |
+ ? ColorFilterSRGBToLinearRGB : ColorFilterNone; |
+ context.setColorFilter(maskContentFilter); |
+ |
for (SVGElement* childElement = Traversal<SVGElement>::firstChild(*element()); childElement; childElement = Traversal<SVGElement>::nextSibling(*childElement)) { |
LayoutObject* renderer = childElement->renderer(); |
if (!renderer) |
@@ -139,9 +157,12 @@ void LayoutSVGResourceMasker::createPicture(GraphicsContext* context) |
if (!style || style->display() == NONE || style->visibility() != VISIBLE) |
continue; |
- SVGPaintContext::paintSubtree(context, renderer); |
+ SVGPaintContext::paintSubtree(&context, renderer); |
} |
- m_maskContentPicture = context->endRecording(); |
+ |
+ if (displayItemList) |
+ displayItemList->replay(&context); |
+ return context.endRecording(); |
} |
void LayoutSVGResourceMasker::calculateMaskContentPaintInvalidationRect() |