[skia] Switch to Skia's implementation of the feMorphology filter.
authorsenorblanco@chromium.org <senorblanco@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Mar 2012 22:41:34 +0000 (22:41 +0000)
committersenorblanco@chromium.org <senorblanco@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Mar 2012 22:41:34 +0000 (22:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=82085

Reviewed by Dirk Schulze.

Covered by existing tests in svg/filters/.

* WebCore.gypi:
* platform/graphics/filters/FEMorphology.h:
(FEMorphology):
* platform/graphics/filters/skia/FEMorphologySkia.cpp: Added.
(WebCore):
(WebCore::FEMorphology::platformApplySkia):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@111922 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/platform/chromium/test_expectations.txt
Source/WebCore/ChangeLog
Source/WebCore/WebCore.gypi
Source/WebCore/platform/graphics/filters/FEMorphology.h
Source/WebCore/platform/graphics/filters/skia/FEMorphologySkia.cpp [new file with mode: 0644]

index 33df4f603937a88cedef4a2ea1fb6570c6e4e9f8..c047de66fd2b3081d0b6c19b52f7acbd24b6de4f 100644 (file)
@@ -1224,6 +1224,9 @@ BUGWK81796 SNOWLEOPARD DEBUG : svg/custom/fill-opacity-update.svg = CRASH
 // Updated test, needs a rebaseline
 BUGWK81219 : svg/filters/feColorMatrix-invalid-animation.svg = TEXT
 
+// Needs a rebaseline after https://bugs.webkit.org/show_bug.cgi?id=82085
+BUGWK82085 : svg/filters/filterRes.svg = IMAGE
+
 // Changed test, needs a rebaseline
 BUGWK34714 : svg/text/select-textLength-spacing-squeeze-2.svg = IMAGE IMAGE+TEXT
 
@@ -3741,7 +3744,6 @@ BUGWK73643 WIN MAC : svg/W3C-SVG-1.1/masking-path-01-b.svg = IMAGE
 BUGWK73643 WIN MAC : svg/clip-path/clipper-placement-issue.svg = IMAGE
 BUGWK73643 WIN MAC : svg/clip-path/deep-nested-clip-in-mask-different-unitTypes.svg = IMAGE IMAGE+TEXT
 BUGWK73643 WIN MAC : svg/filters/feDropShadow.svg = IMAGE
-BUGWK73643 WIN MAC : svg/filters/filterRes.svg = IMAGE
 BUGWK73643 SLOW DEBUG WIN MAC : svg/filters/big-sized-filter.svg = IMAGE
 BUGWK73643 SLOW DEBUG LINUX : svg/filters/big-sized-filter.svg = PASS
 BUGWK73643 RELEASE WIN MAC : svg/filters/big-sized-filter.svg = IMAGE
index 219511ff62c63a2d56dc9573691cbdb17af5a862..abc61bffc6a505a7ec4f58b42b178a70adb9660d 100644 (file)
@@ -1,3 +1,19 @@
+2012-03-23  Stephen White  <senorblanco@chromium.org>
+
+        [skia] Switch to Skia's implementation of the feMorphology filter.
+        https://bugs.webkit.org/show_bug.cgi?id=82085
+
+        Reviewed by Dirk Schulze.
+
+        Covered by existing tests in svg/filters/.
+
+        * WebCore.gypi:
+        * platform/graphics/filters/FEMorphology.h:
+        (FEMorphology):
+        * platform/graphics/filters/skia/FEMorphologySkia.cpp: Added.
+        (WebCore):
+        (WebCore::FEMorphology::platformApplySkia):
+
 2012-03-23  Adam Barth  <abarth@webkit.org>
 
         Move Notifications APIs from DOMWindow.idl to DOMWindowNotifications.idl (Part 3)
index 8cc65251574e3c043fcafbe7f7079befa8f9a10c..c59075c076615454dcd4e7d8817e7ce28c980692 100644 (file)
             'platform/graphics/filters/arm/FELightingNEON.h',
             'platform/graphics/filters/skia/FEColorMatrixSkia.cpp',
             'platform/graphics/filters/skia/FEGaussianBlurSkia.cpp',
+            'platform/graphics/filters/skia/FEMorphologySkia.cpp',
             'platform/graphics/freetype/FontCacheFreeType.cpp',
             'platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp',
             'platform/graphics/freetype/FontPlatformData.h',
index f925403421808870abd6e9ef0a19add96a204929..542d26b28396f19120f3652c30296e1b0d4b1f80 100644 (file)
@@ -47,6 +47,9 @@ public:
     bool setRadiusY(float);
 
     virtual void platformApplySoftware();
+#if USE(SKIA)
+    virtual bool platformApplySkia();
+#endif
     virtual void dump();
 
     virtual void determineAbsolutePaintRect();
diff --git a/Source/WebCore/platform/graphics/filters/skia/FEMorphologySkia.cpp b/Source/WebCore/platform/graphics/filters/skia/FEMorphologySkia.cpp
new file mode 100644 (file)
index 0000000..067a653
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#if USE(SKIA)
+#include "FEMorphology.h"
+
+#include "SkMorphologyImageFilter.h"
+
+namespace WebCore {
+
+bool FEMorphology::platformApplySkia()
+{
+    ImageBuffer* resultImage = createImageBufferResult();
+    if (!resultImage)
+        return false;
+
+    FilterEffect* in = inputEffect(0);
+
+    IntRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect());
+
+    setIsAlphaImage(in->isAlphaImage());
+
+    float radiusX = filter()->applyHorizontalScale(m_radiusX);
+    float radiusY = filter()->applyVerticalScale(m_radiusY);
+    
+    RefPtr<Image> image = in->asImageBuffer()->copyImage(DontCopyBackingStore);
+
+    SkPaint paint;
+    GraphicsContext* dstContext = resultImage->context();
+    SkCanvas* canvas = dstContext->platformContext()->canvas();
+    if (m_type == FEMORPHOLOGY_OPERATOR_DILATE)
+        paint.setImageFilter(new SkDilateImageFilter(radiusX, radiusY))->unref();
+    else if (m_type == FEMORPHOLOGY_OPERATOR_ERODE)
+        paint.setImageFilter(new SkErodeImageFilter(radiusX, radiusY))->unref();
+
+    canvas->saveLayer(0, &paint);
+    dstContext->drawImage(image.get(), ColorSpaceDeviceRGB, drawingRegion.location(), CompositeCopy);
+    canvas->restore();
+    return true;
+}
+
+};
+#endif