Index: third_party/WebKit/Source/core/paint/SVGPaintContext.cpp |
diff --git a/third_party/WebKit/Source/core/paint/SVGPaintContext.cpp b/third_party/WebKit/Source/core/paint/SVGPaintContext.cpp |
index 2d1b319e89d32497d4ab30a29c6f8b9dcbf4674e..75c8f94fc68a33cd7bf8aeb494a4cf8ed94f8b74 100644 |
--- a/third_party/WebKit/Source/core/paint/SVGPaintContext.cpp |
+++ b/third_party/WebKit/Source/core/paint/SVGPaintContext.cpp |
@@ -39,28 +39,25 @@ namespace blink { |
SVGPaintContext::~SVGPaintContext() |
{ |
if (m_filter) { |
- ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(m_object)); |
- ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(m_object)->filter() == m_filter); |
+ ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(&m_object)); |
+ ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(&m_object)->filter() == m_filter); |
ASSERT(m_filterRecordingContext); |
- SVGFilterPainter(*m_filter).finishEffect(*m_object, *m_filterRecordingContext); |
+ SVGFilterPainter(*m_filter).finishEffect(m_object, *m_filterRecordingContext); |
// Reset the paint info after the filter effect has been completed. |
- // This isn't strictly required (e.g., m_paintInfo.rect is not used |
- // after this). |
- m_paintInfo.context = m_originalPaintInfo->context; |
- m_paintInfo.m_cullRect.m_rect = m_originalPaintInfo->m_cullRect.m_rect; |
+ m_filterPaintInfo = nullptr; |
} |
if (m_masker) { |
- ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(m_object)); |
- ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(m_object)->masker() == m_masker); |
- SVGMaskPainter(*m_masker).finishEffect(*m_object, m_paintInfo.context); |
+ ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(&m_object)); |
+ ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(&m_object)->masker() == m_masker); |
+ SVGMaskPainter(*m_masker).finishEffect(m_object, paintInfo().context); |
} |
if (m_clipper) { |
- ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(m_object)); |
- ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(m_object)->clipper() == m_clipper); |
- SVGClipPainter(*m_clipper).finishEffect(*m_object, m_paintInfo.context, m_clipperState); |
+ ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(&m_object)); |
+ ASSERT(SVGResourcesCache::cachedResourcesForLayoutObject(&m_object)->clipper() == m_clipper); |
+ SVGClipPainter(*m_clipper).finishEffect(m_object, paintInfo().context, m_clipperState); |
} |
} |
@@ -71,11 +68,11 @@ bool SVGPaintContext::applyClipMaskAndFilterIfNecessary() |
m_applyClipMaskAndFilterIfNecessaryCalled = true; |
#endif |
- SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(m_object); |
+ SVGResources* resources = SVGResourcesCache::cachedResourcesForLayoutObject(&m_object); |
// When rendering clip paths as masks, only geometric operations should be included so skip |
// non-geometric operations such as compositing, masking, and filtering. |
- if (m_paintInfo.isRenderingClipPathAsMaskImage()) { |
+ if (paintInfo().isRenderingClipPathAsMaskImage()) { |
if (!applyClipIfNecessary(resources)) |
return false; |
return true; |
@@ -92,27 +89,27 @@ bool SVGPaintContext::applyClipMaskAndFilterIfNecessary() |
if (!applyFilterIfNecessary(resources)) |
return false; |
- if (!isIsolationInstalled() && SVGLayoutSupport::isIsolationRequired(m_object)) |
- m_compositingRecorder = adoptPtr(new CompositingRecorder(*m_paintInfo.context, *m_object, SkXfermode::kSrcOver_Mode, 1)); |
+ if (!isIsolationInstalled() && SVGLayoutSupport::isIsolationRequired(&m_object)) |
+ m_compositingRecorder = adoptPtr(new CompositingRecorder(paintInfo().context, m_object, SkXfermode::kSrcOver_Mode, 1)); |
return true; |
} |
void SVGPaintContext::applyCompositingIfNecessary() |
{ |
- ASSERT(!m_paintInfo.isRenderingClipPathAsMaskImage()); |
+ ASSERT(!paintInfo().isRenderingClipPathAsMaskImage()); |
// Layer takes care of root opacity and blend mode. |
- if (m_object->isSVGRoot()) |
+ if (m_object.isSVGRoot()) |
return; |
- const ComputedStyle& style = m_object->styleRef(); |
+ const ComputedStyle& style = m_object.styleRef(); |
float opacity = style.opacity(); |
- WebBlendMode blendMode = style.hasBlendMode() && m_object->isBlendingAllowed() ? |
+ WebBlendMode blendMode = style.hasBlendMode() && m_object.isBlendingAllowed() ? |
style.blendMode() : WebBlendModeNormal; |
if (opacity < 1 || blendMode != WebBlendModeNormal) { |
- const FloatRect compositingBounds = m_object->paintInvalidationRectInLocalCoordinates(); |
- m_compositingRecorder = adoptPtr(new CompositingRecorder(*m_paintInfo.context, *m_object, |
+ const FloatRect compositingBounds = m_object.paintInvalidationRectInLocalCoordinates(); |
+ m_compositingRecorder = adoptPtr(new CompositingRecorder(paintInfo().context, m_object, |
WebCoreCompositeToSkiaComposite(CompositeSourceOver, blendMode), opacity, &compositingBounds)); |
} |
} |
@@ -120,19 +117,19 @@ void SVGPaintContext::applyCompositingIfNecessary() |
bool SVGPaintContext::applyClipIfNecessary(SVGResources* resources) |
{ |
// resources->clipper() corresponds to the non-prefixed 'clip-path' whereas |
- // m_object->style()->clipPath() corresponds to '-webkit-clip-path'. |
+ // m_object.style()->clipPath() corresponds to '-webkit-clip-path'. |
// FIXME: We should unify the clip-path and -webkit-clip-path codepaths. |
if (LayoutSVGResourceClipper* clipper = resources ? resources->clipper() : nullptr) { |
- if (!SVGClipPainter(*clipper).prepareEffect(*m_object, m_object->objectBoundingBox(), m_object->paintInvalidationRectInLocalCoordinates(), m_paintInfo.context, m_clipperState)) |
+ if (!SVGClipPainter(*clipper).prepareEffect(m_object, m_object.objectBoundingBox(), m_object.paintInvalidationRectInLocalCoordinates(), paintInfo().context, m_clipperState)) |
return false; |
m_clipper = clipper; |
} else { |
- ClipPathOperation* clipPathOperation = m_object->style()->clipPath(); |
+ ClipPathOperation* clipPathOperation = m_object.style()->clipPath(); |
if (clipPathOperation && clipPathOperation->type() == ClipPathOperation::SHAPE) { |
ShapeClipPathOperation* clipPath = toShapeClipPathOperation(clipPathOperation); |
if (!clipPath->isValid()) |
return false; |
- m_clipPathRecorder = adoptPtr(new ClipPathRecorder(*m_paintInfo.context, *m_object, clipPath->path(m_object->objectBoundingBox()))); |
+ m_clipPathRecorder = adoptPtr(new ClipPathRecorder(paintInfo().context, m_object, clipPath->path(m_object.objectBoundingBox()))); |
} |
} |
return true; |
@@ -141,7 +138,7 @@ bool SVGPaintContext::applyClipIfNecessary(SVGResources* resources) |
bool SVGPaintContext::applyMaskIfNecessary(SVGResources* resources) |
{ |
if (LayoutSVGResourceMasker* masker = resources ? resources->masker() : nullptr) { |
- if (!SVGMaskPainter(*masker).prepareEffect(*m_object, m_paintInfo.context)) |
+ if (!SVGMaskPainter(*masker).prepareEffect(m_object, paintInfo().context)) |
return false; |
m_masker = masker; |
} |
@@ -151,23 +148,23 @@ bool SVGPaintContext::applyMaskIfNecessary(SVGResources* resources) |
bool SVGPaintContext::applyFilterIfNecessary(SVGResources* resources) |
{ |
if (!resources) { |
- if (m_object->style()->svgStyle().hasFilter()) |
+ if (m_object.style()->svgStyle().hasFilter()) |
return false; |
} else if (LayoutSVGResourceFilter* filter = resources->filter()) { |
- m_filterRecordingContext = adoptPtr(new SVGFilterRecordingContext(m_paintInfo.context)); |
+ m_filterRecordingContext = adoptPtr(new SVGFilterRecordingContext(paintInfo().context)); |
m_filter = filter; |
- GraphicsContext* filterContext = SVGFilterPainter(*filter).prepareEffect(*m_object, *m_filterRecordingContext); |
+ GraphicsContext* filterContext = SVGFilterPainter(*filter).prepareEffect(m_object, *m_filterRecordingContext); |
if (!filterContext) |
return false; |
// Because the filter needs to cache its contents we replace the context |
// during filtering with the filter's context. |
- m_paintInfo.context = filterContext; |
+ m_filterPaintInfo = adoptPtr(new PaintInfo(*filterContext, m_paintInfo)); |
// Because we cache the filter contents and do not invalidate on paint |
// invalidation rect changes, we need to paint the entire filter region |
// so elements outside the initial paint (due to scrolling, etc) paint. |
- m_paintInfo.m_cullRect.m_rect = LayoutRect::infiniteIntRect(); |
+ m_filterPaintInfo->m_cullRect.m_rect = LayoutRect::infiniteIntRect(); |
} |
return true; |
} |
@@ -183,9 +180,8 @@ bool SVGPaintContext::isIsolationInstalled() const |
return false; |
} |
-void SVGPaintContext::paintSubtree(GraphicsContext* context, const LayoutObject* item) |
+void SVGPaintContext::paintSubtree(GraphicsContext& context, const LayoutObject* item) |
{ |
- ASSERT(context); |
ASSERT(item); |
ASSERT(!item->needsLayout()); |
@@ -229,7 +225,7 @@ bool SVGPaintContext::paintForLayoutObject(const PaintInfo& paintInfo, const Com |
// something down the paint pipe may want to farther tweak the color |
// filter, which could yield incorrect results. (Consider just using |
// saveLayer() w/ this color filter explicitly instead.) |
- paint.setColorFilter(paintInfo.context->colorFilter()); |
+ paint.setColorFilter(paintInfo.context.colorFilter()); |
return true; |
} |