Index: Source/core/paint/FilterPainter.cpp |
diff --git a/Source/core/paint/FilterPainter.cpp b/Source/core/paint/FilterPainter.cpp |
index 9fe1e9483320a57f3a1cfcceab9c7b82676bfcc1..9f82642290490af86ce93167d5afe5eecaed07c8 100644 |
--- a/Source/core/paint/FilterPainter.cpp |
+++ b/Source/core/paint/FilterPainter.cpp |
@@ -8,16 +8,52 @@ |
#include "core/paint/LayerPainter.h" |
#include "core/rendering/FilterEffectRenderer.h" |
#include "core/rendering/RenderLayer.h" |
+#include "core/rendering/RenderView.h" |
+#include "platform/RuntimeEnabledFeatures.h" |
#include "platform/graphics/GraphicsContext.h" |
#include "platform/graphics/filters/FilterEffect.h" |
#include "platform/graphics/filters/SkiaImageFilterBuilder.h" |
namespace blink { |
+void BeginFilterDisplayItem::replay(GraphicsContext* context) |
+{ |
+ context->save(); |
+ FloatRect boundaries = mapImageFilterRect(m_imageFilter.get(), m_bounds); |
+ context->translate(m_bounds.x().toFloat(), m_bounds.y().toFloat()); |
+ boundaries.move(-m_bounds.x().toFloat(), -m_bounds.y().toFloat()); |
+ context->beginLayer(1, CompositeSourceOver, &boundaries, ColorFilterNone, m_imageFilter.get()); |
+ context->translate(-m_bounds.x().toFloat(), -m_bounds.y().toFloat()); |
+} |
+ |
+#ifndef NDEBUG |
+WTF::String BeginFilterDisplayItem::asDebugString() const |
+{ |
+ return String::format("{%s, type: \"%s\", filter bounds: [%f,%f,%f,%f]}", |
+ rendererDebugString(renderer()).utf8().data(), typeAsDebugString(type()).utf8().data(), |
+ m_bounds.x().toFloat(), m_bounds.y().toFloat(), m_bounds.width().toFloat(), m_bounds.height().toFloat()); |
+} |
+#endif |
+ |
+void EndFilterDisplayItem::replay(GraphicsContext* context) |
+{ |
+ context->endLayer(); |
+ context->restore(); |
+} |
+ |
+#ifndef NDEBUG |
+WTF::String EndFilterDisplayItem::asDebugString() const |
+{ |
+ return String::format("{%s, type: \"%s\"}", |
+ rendererDebugString(renderer()).utf8().data(), typeAsDebugString(type()).utf8().data()); |
+} |
+#endif |
+ |
FilterPainter::FilterPainter(RenderLayer& renderLayer, GraphicsContext* context, const LayoutPoint& offsetFromRoot, const ClipRect& clipRect, LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags, |
LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed) |
: m_filterInProgress(false) |
, m_context(context) |
+ , m_renderer(renderLayer.renderer()) |
{ |
if (!renderLayer.filterRenderer() || !renderLayer.paintsWithFilters()) |
return; |
@@ -50,20 +86,26 @@ FilterPainter::FilterPainter(RenderLayer& renderLayer, GraphicsContext* context, |
LayerPainter::applyRoundedRectClips(renderLayer, paintingInfo, context, paintFlags, *m_clipRecorder); |
} |
- context->save(); |
- FloatRect boundaries = mapImageFilterRect(imageFilter.get(), rootRelativeBounds); |
- context->translate(rootRelativeBounds.x().toFloat(), rootRelativeBounds.y().toFloat()); |
- boundaries.move(-rootRelativeBounds.x().toFloat(), -rootRelativeBounds.y().toFloat()); |
- context->beginLayer(1, CompositeSourceOver, &boundaries, ColorFilterNone, imageFilter.get()); |
- context->translate(-rootRelativeBounds.x().toFloat(), -rootRelativeBounds.y().toFloat()); |
+ OwnPtr<BeginFilterDisplayItem> filterDisplayItem = adoptPtr(new BeginFilterDisplayItem(m_renderer, DisplayItem::BeginFilter, imageFilter, rootRelativeBounds)); |
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
+ renderLayer.renderer()->view()->viewDisplayList().add(filterDisplayItem.release()); |
+ } else { |
+ filterDisplayItem->replay(context); |
+ } |
+ |
m_filterInProgress = true; |
} |
FilterPainter::~FilterPainter() |
{ |
- if (m_filterInProgress) { |
- m_context->endLayer(); |
- m_context->restore(); |
+ if (!m_filterInProgress) |
+ return; |
+ |
+ OwnPtr<EndFilterDisplayItem> endFilterDisplayItem = adoptPtr(new EndFilterDisplayItem(m_renderer)); |
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
+ m_renderer->view()->viewDisplayList().add(endFilterDisplayItem.release()); |
+ } else { |
+ endFilterDisplayItem->replay(m_context); |
} |
} |