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); |
} |
} |