Index: Source/core/paint/FilterPainter.cpp |
diff --git a/Source/core/paint/FilterPainter.cpp b/Source/core/paint/FilterPainter.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..51a7bbdb97e39af265fd7eb3f4ec8d3e4ec694a3 |
--- /dev/null |
+++ b/Source/core/paint/FilterPainter.cpp |
@@ -0,0 +1,39 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "config.h" |
+#include "core/paint/FilterPainter.h" |
+ |
+#include "core/rendering/FilterEffectRenderer.h" |
+#include "core/rendering/RenderLayer.h" |
+#include "platform/graphics/GraphicsContext.h" |
+#include "platform/graphics/filters/FilterEffect.h" |
+#include "platform/graphics/filters/SkiaImageFilterBuilder.h" |
+ |
+namespace blink { |
+ |
+bool FilterPainter::beginFilterEffect(GraphicsContext* context, const FloatRect& filterBoxRect) |
+{ |
+ SkiaImageFilterBuilder builder(context); |
+ RefPtr<FilterEffect> lastEffect = m_renderLayer.filterRenderer()->lastEffect(); |
+ lastEffect->determineFilterPrimitiveSubregion(MapRectForward); |
+ RefPtr<ImageFilter> imageFilter = builder.build(lastEffect.get(), ColorSpaceDeviceRGB); |
+ if (!imageFilter) |
+ return false; |
+ context->save(); |
+ FloatRect boundaries = mapImageFilterRect(imageFilter.get(), filterBoxRect); |
+ context->translate(filterBoxRect.x(), filterBoxRect.y()); |
+ boundaries.move(-filterBoxRect.x(), -filterBoxRect.y()); |
+ context->beginLayer(1, CompositeSourceOver, &boundaries, ColorFilterNone, imageFilter.get()); |
+ context->translate(-filterBoxRect.x(), -filterBoxRect.y()); |
+ return true; |
+} |
+ |
+void FilterPainter::endFilterEffect(GraphicsContext* context) |
+{ |
+ context->endLayer(); |
+ context->restore(); |
+} |
+ |
+} // namespace blink |