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

Unified Diff: Source/core/paint/SVGFilterPainter.cpp

Issue 1220053003: Disentangle filter content recording state from FilterData (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Added test. Created 5 years, 6 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
« no previous file with comments | « Source/core/paint/SVGFilterPainter.h ('k') | Source/core/paint/SVGPaintContext.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/paint/SVGFilterPainter.cpp
diff --git a/Source/core/paint/SVGFilterPainter.cpp b/Source/core/paint/SVGFilterPainter.cpp
index d294540165c183adea080019e005e424be27d824..2bf541ddd071877cbfeab3368d6f05a3345870c0 100644
--- a/Source/core/paint/SVGFilterPainter.cpp
+++ b/Source/core/paint/SVGFilterPainter.cpp
@@ -20,16 +20,18 @@
namespace blink {
-static GraphicsContext* beginRecordingContent(GraphicsContext* context, FilterData* filterData)
+GraphicsContext* SVGFilterRecordingContext::beginContent(FilterData* filterData)
{
ASSERT(filterData->m_state == FilterData::Initial);
+ GraphicsContext* context = paintingContext();
+
// 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(filterData->m_displayItemList.get()));
- context = filterData->m_context.get();
+ m_displayItemList = DisplayItemList::create();
+ m_context = adoptPtr(new GraphicsContext(m_displayItemList.get()));
+ context = m_context.get();
} else {
context->beginRecording(filterData->filter->filterRegion());
}
@@ -38,7 +40,7 @@ static GraphicsContext* beginRecordingContent(GraphicsContext* context, FilterDa
return context;
}
-static void endRecordingContent(GraphicsContext* context, FilterData* filterData)
+void SVGFilterRecordingContext::endContent(FilterData* filterData)
{
ASSERT(filterData->m_state == FilterData::RecordingContent);
@@ -46,28 +48,30 @@ static void endRecordingContent(GraphicsContext* context, FilterData* filterData
SourceGraphic* sourceGraphic = static_cast<SourceGraphic*>(filterData->builder->getEffectById(SourceGraphic::effectName()));
ASSERT(sourceGraphic);
+ GraphicsContext* context = paintingContext();
+
// 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);
- context = filterData->m_context.get();
+ ASSERT(m_displayItemList);
+ ASSERT(m_context);
+ context = m_context.get();
context->beginRecording(filterData->filter->filterRegion());
- filterData->m_displayItemList->commitNewDisplayItemsAndReplay(*context);
+ m_displayItemList->commitNewDisplayItemsAndReplay(*context);
}
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;
+ m_displayItemList = nullptr;
+ m_context = nullptr;
}
filterData->m_state = FilterData::ReadyToPaint;
}
-static void paintFilteredContent(LayoutObject& object, GraphicsContext* context, FilterData* filterData, SVGFilterElement* filterElement)
+static void paintFilteredContent(LayoutObject& object, GraphicsContext* context, FilterData* filterData)
{
ASSERT(filterData->m_state == FilterData::ReadyToPaint);
ASSERT(filterData->builder->getEffectById(SourceGraphic::effectName()));
@@ -109,9 +113,9 @@ static void paintFilteredContent(LayoutObject& object, GraphicsContext* context,
filterData->m_state = FilterData::ReadyToPaint;
}
-GraphicsContext* SVGFilterPainter::prepareEffect(LayoutObject& object, GraphicsContext* context)
+GraphicsContext* SVGFilterPainter::prepareEffect(LayoutObject& object, SVGFilterRecordingContext& recordingContext)
{
- ASSERT(context);
+ ASSERT(recordingContext.paintingContext());
m_filter.clearInvalidationMask();
@@ -155,13 +159,11 @@ GraphicsContext* SVGFilterPainter::prepareEffect(LayoutObject& object, GraphicsC
FilterData* data = filterData.get();
m_filter.setFilterDataForLayoutObject(&object, filterData.release());
- return beginRecordingContent(context, data);
+ return recordingContext.beginContent(data);
}
-void SVGFilterPainter::finishEffect(LayoutObject& object, GraphicsContext* context)
+void SVGFilterPainter::finishEffect(LayoutObject& object, SVGFilterRecordingContext& recordingContext)
{
- ASSERT(context);
-
FilterData* filterData = m_filter.getFilterDataForLayoutObject(&object);
if (filterData) {
// A painting cycle can occur when an FeImage references a source that
@@ -173,18 +175,21 @@ void SVGFilterPainter::finishEffect(LayoutObject& object, GraphicsContext* conte
// Check for RecordingContent here because we may can be re-painting
// without re-recording the contents to be filtered.
if (filterData->m_state == FilterData::RecordingContent)
- endRecordingContent(context, filterData);
+ recordingContext.endContent(filterData);
if (filterData->m_state == FilterData::RecordingContentCycleDetected)
filterData->m_state = FilterData::RecordingContent;
}
+ GraphicsContext* context = recordingContext.paintingContext();
+ ASSERT(context);
+
LayoutObjectDrawingRecorder recorder(*context, object, DisplayItem::SVGFilter, LayoutRect::infiniteIntRect());
if (recorder.canUseCachedDrawing())
return;
if (filterData && filterData->m_state == FilterData::ReadyToPaint)
- paintFilteredContent(object, context, filterData, toSVGFilterElement(m_filter.element()));
+ paintFilteredContent(object, context, filterData);
}
}
« no previous file with comments | « Source/core/paint/SVGFilterPainter.h ('k') | Source/core/paint/SVGPaintContext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698