| 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 678382b04adbeb662d8bc8214f5df1e180600163..4a978c8fb432ae8cafc9e2a886c8d112db7a5acd 100644
|
| --- a/third_party/WebKit/Source/core/paint/SVGPaintContext.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/SVGPaintContext.cpp
|
| @@ -134,27 +134,38 @@ bool SVGPaintContext::applyMaskIfNecessary(SVGResources* resources)
|
| return true;
|
| }
|
|
|
| +static bool hasReferenceFilterOnly(const ComputedStyle& style)
|
| +{
|
| + if (!style.hasFilter())
|
| + return false;
|
| + const FilterOperations& operations = style.filter();
|
| + if (operations.size() != 1)
|
| + return false;
|
| + return operations.at(0)->type() == FilterOperation::REFERENCE;
|
| +}
|
| +
|
| bool SVGPaintContext::applyFilterIfNecessary(SVGResources* resources)
|
| {
|
| - if (!resources) {
|
| - if (m_object.style()->hasFilter())
|
| - return false;
|
| - } else if (LayoutSVGResourceFilter* filter = resources->filter()) {
|
| - m_filterRecordingContext = wrapUnique(new SVGFilterRecordingContext(paintInfo().context));
|
| - m_filter = filter;
|
| - GraphicsContext* filterContext = SVGFilterPainter(*filter).prepareEffect(m_object, *m_filterRecordingContext);
|
| - if (!filterContext)
|
| - return false;
|
| + if (!resources)
|
| + return !hasReferenceFilterOnly(m_object.styleRef());
|
|
|
| - // Because the filter needs to cache its contents we replace the context
|
| - // during filtering with the filter's context.
|
| - m_filterPaintInfo = wrapUnique(new PaintInfo(*filterContext, m_paintInfo));
|
| + LayoutSVGResourceFilter* filter = resources->filter();
|
| + if (!filter)
|
| + return true;
|
| + m_filterRecordingContext = wrapUnique(new SVGFilterRecordingContext(paintInfo().context));
|
| + m_filter = filter;
|
| + GraphicsContext* filterContext = SVGFilterPainter(*filter).prepareEffect(m_object, *m_filterRecordingContext);
|
| + if (!filterContext)
|
| + return false;
|
|
|
| - // 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_filterPaintInfo->m_cullRect.m_rect = LayoutRect::infiniteIntRect();
|
| - }
|
| + // Because the filter needs to cache its contents we replace the context
|
| + // during filtering with the filter's context.
|
| + m_filterPaintInfo = wrapUnique(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_filterPaintInfo->m_cullRect.m_rect = LayoutRect::infiniteIntRect();
|
| return true;
|
| }
|
|
|
|
|