Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1869)

Unified Diff: Source/core/rendering/svg/RenderSVGResourceFilter.cpp

Issue 871983003: [Slimming Paint] Implement deferred SVG filters (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add note Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/svg/RenderSVGResourceFilter.cpp
diff --git a/Source/core/rendering/svg/RenderSVGResourceFilter.cpp b/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
index d864b2238e41cde1d088da76734497f9e3b021d1..a00d0a2f9b37f56c5d83df7d3576ab99da813ef3 100644
--- a/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
+++ b/Source/core/rendering/svg/RenderSVGResourceFilter.cpp
@@ -112,11 +112,21 @@ PassRefPtrWillBeRawPtr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitive
return builder.release();
}
-static void beginDeferredFilter(GraphicsContext* context, FilterData* filterData)
+static GraphicsContext* beginDeferredFilter(GraphicsContext* context, FilterData* filterData)
{
- // FIXME: Create a new GraphicsContext here to replace the existing context instead
- // of nesting recordings.
+ ASSERT(!filterData->m_needToEndFilter);
+
+ // For slimming paint we need to create a new context so the contents of the
+ // filter can be drawn and cached.
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
+ filterData->m_displayItemList = DisplayItemList::create();
+ filterData->m_context = adoptPtr(new GraphicsContext(nullptr, filterData->m_displayItemList.get()));
+ context = filterData->m_context.get();
+ }
+
context->beginRecording(filterData->boundaries);
+ filterData->m_needToEndFilter = true;
+ return context;
}
static void endDeferredFilter(GraphicsContext* context, FilterData* filterData)
@@ -124,7 +134,25 @@ static void endDeferredFilter(GraphicsContext* context, FilterData* filterData)
// FIXME: maybe filterData should just hold onto SourceGraphic after creation?
SourceGraphic* sourceGraphic = static_cast<SourceGraphic*>(filterData->builder->getEffectById(SourceGraphic::effectName()));
ASSERT(sourceGraphic);
+
+ // For slimming paint we need to use the context that contains the filtered
+ // content.
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
+ ASSERT(filterData->m_displayItemList);
+ ASSERT(filterData->m_context);
+ filterData->m_displayItemList->replay(filterData->m_context.get());
+ context = filterData->m_context.get();
+ }
+
sourceGraphic->setPicture(context->endRecording());
+
+ // Content is cached by the source graphic so temporaries can be freed.
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
+ filterData->m_displayItemList = nullptr;
+ filterData->m_context = nullptr;
+ }
+
+ filterData->m_needToEndFilter = false;
}
static void drawDeferredFilter(GraphicsContext* context, FilterData* filterData, SVGFilterElement* filterElement)
@@ -178,7 +206,7 @@ static void drawDeferredFilter(GraphicsContext* context, FilterData* filterData,
context->restore();
}
-bool RenderSVGResourceFilter::prepareEffect(RenderObject* object, GraphicsContext* context)
+GraphicsContext* RenderSVGResourceFilter::prepareEffect(RenderObject* object, GraphicsContext* context)
{
ASSERT(object);
ASSERT(context);
@@ -187,7 +215,7 @@ bool RenderSVGResourceFilter::prepareEffect(RenderObject* object, GraphicsContex
if (m_filter.contains(object)) {
// The filter has already begun or there is a filter cycle.
- return false;
+ return nullptr;
}
OwnPtrWillBeRawPtr<FilterData> filterData = FilterData::create();
@@ -196,7 +224,7 @@ bool RenderSVGResourceFilter::prepareEffect(RenderObject* object, GraphicsContex
SVGFilterElement* filterElement = toSVGFilterElement(element());
filterData->boundaries = SVGLengthContext::resolveRectangle<SVGFilterElement>(filterElement, filterElement->filterUnits()->currentValue()->enumValue(), targetBoundingBox);
if (filterData->boundaries.isEmpty())
- return false;
+ return nullptr;
// Create the SVGFilter object.
FloatRect drawingRegion = object->strokeBoundingBox();
@@ -207,19 +235,17 @@ bool RenderSVGResourceFilter::prepareEffect(RenderObject* object, GraphicsContex
// Create all relevant filter primitives.
filterData->builder = buildPrimitives(filterData->filter.get());
if (!filterData->builder)
- return false;
+ return nullptr;
FilterEffect* lastEffect = filterData->builder->lastEffect();
if (!lastEffect)
- return false;
+ return nullptr;
lastEffect->determineFilterPrimitiveSubregion(ClipToFilterRegion);
FilterData* data = filterData.get();
m_filter.set(object, filterData.release());
- beginDeferredFilter(context, data);
- data->m_needToEndFilter = true;
- return true;
+ return beginDeferredFilter(context, data);
}
void RenderSVGResourceFilter::finishEffect(RenderObject* object, GraphicsContext* context)
@@ -235,7 +261,6 @@ void RenderSVGResourceFilter::finishEffect(RenderObject* object, GraphicsContext
endDeferredFilter(context, filterData);
drawDeferredFilter(context, filterData, toSVGFilterElement(element()));
- filterData->m_needToEndFilter = false;
}
FloatRect RenderSVGResourceFilter::resourceBoundingBox(const RenderObject* object)
« no previous file with comments | « Source/core/rendering/svg/RenderSVGResourceFilter.h ('k') | Source/core/rendering/svg/SVGRenderingContext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698