[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.15.1-1414-gc69ee75

krit at webkit.org krit at webkit.org
Thu Oct 29 20:42:36 UTC 2009


The following commit has been merged in the webkit-1.1 branch:
commit cd554315b1b9e64b41f249ef024a987764935470
Author: krit at webkit.org <krit at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Oct 9 20:51:19 2009 +0000

    2009-10-09  Dirk Schulze  <krit at webkit.org>
    
            Reviewed by Oliver Hunt.
    
            SVG Filter feGaussianBlur implementation is missing
            [https://bugs.webkit.org/show_bug.cgi?id=28141]
    
            This is the implementation of GaussianBlur filter for SVG.
    
            There is already a test for feGaussianBlur
            Test: svg/W3C-SVG-1.1/filters-gauss-01-b-w3c.svg
    
            Test: svg/filters/feGaussianBlur.svg
    
            * platform/graphics/filters/FilterEffect.cpp:
            (WebCore::FilterEffect::FilterEffect):
            * platform/graphics/filters/FilterEffect.h:
            (WebCore::FilterEffect::isAlphaImage):
            (WebCore::FilterEffect::setIsAlphaImage):
            * platform/graphics/filters/SourceAlpha.cpp:
            (WebCore::SourceAlpha::apply):
            * svg/graphics/filters/SVGFEGaussianBlur.cpp:
            (WebCore::boxBlur):
            (WebCore::FEGaussianBlur::apply):
    
            Test for feGaussianBlur implementation
    
            * platform/mac/svg/filters/feGaussianBlur-expected.checksum: Added.
            * platform/mac/svg/filters/feGaussianBlur-expected.png: Added.
            * platform/mac/svg/filters/feGaussianBlur-expected.txt: Added.
            * svg/filters/feGaussianBlur.svg: Added.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@49402 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index daea1d8..42fa6d8 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,5 +1,16 @@
 2009-10-09  Dirk Schulze  <krit at webkit.org>
 
+        Reviewed by Oliver Hunt.
+
+        Test for feGaussianBlur implementation
+
+        * platform/mac/svg/filters/feGaussianBlur-expected.checksum: Added.
+        * platform/mac/svg/filters/feGaussianBlur-expected.png: Added.
+        * platform/mac/svg/filters/feGaussianBlur-expected.txt: Added.
+        * svg/filters/feGaussianBlur.svg: Added.
+
+2009-10-09  Dirk Schulze  <krit at webkit.org>
+
         Reviewed by Nikolas Zimmermann.
 
         Attribute "operator" schould only be accessible by "operator", not by "_operator"
diff --git a/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.checksum b/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.checksum
new file mode 100644
index 0000000..4a8d3b1
--- /dev/null
+++ b/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.checksum
@@ -0,0 +1 @@
+1c85cd6685a09cb7b5dca21f17e7a4e6
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.png b/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.png
new file mode 100644
index 0000000..c5eb405
Binary files /dev/null and b/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.txt b/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.txt
new file mode 100644
index 0000000..0126cfd
--- /dev/null
+++ b/LayoutTests/platform/mac/svg/filters/feGaussianBlur-expected.txt
@@ -0,0 +1,35 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderSVGRoot {svg} at (10,10) size 475x175
+    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+    RenderSVGContainer {g} at (10,10) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(10.00,10.00)}] [filter=0x0]
+      RenderPath {rect} at (10,10) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (35,35) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (110,10) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,10.00)}] [filter=0x5]
+      RenderPath {rect} at (110,10) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (135,35) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (210,10) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(210.00,10.00)}] [filter=5x0]
+      RenderPath {rect} at (210,10) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (235,35) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (310,10) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(310.00,10.00)}] [filter=3x3]
+      RenderPath {rect} at (310,10) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (335,35) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (410,10) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(410.00,10.00)}] [filter=1x6]
+      RenderPath {rect} at (410,10) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (435,35) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (10,110) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(10.00,110.00)}] [filter=6x1]
+      RenderPath {rect} at (10,110) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (35,135) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (110,110) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,110.00)}] [filter=2x10]
+      RenderPath {rect} at (110,110) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (135,135) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (210,110) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(210.00,110.00)}] [filter=1x1]
+      RenderPath {rect} at (210,110) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (235,135) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (310,110) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(310.00,110.00)}] [filter=10x100]
+      RenderPath {rect} at (310,110) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (335,135) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
+    RenderSVGContainer {g} at (410,110) size 75x75 [transform={m=((1.00,0.00)(0.00,1.00)) t=(410.00,110.00)}] [filter=15x15]
+      RenderPath {rect} at (410,110) size 50x50 [fill={[type=SOLID] [color=#FF0000]}] [data="M0.00,0.00 L50.00,0.00 L50.00,50.00 L0.00,50.00 Z"]
+      RenderPath {rect} at (435,135) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [data="M25.00,25.00 L75.00,25.00 L75.00,75.00 L25.00,75.00 Z"]
diff --git a/LayoutTests/svg/filters/feGaussianBlur.svg b/LayoutTests/svg/filters/feGaussianBlur.svg
new file mode 100644
index 0000000..43941ac
--- /dev/null
+++ b/LayoutTests/svg/filters/feGaussianBlur.svg
@@ -0,0 +1,74 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<defs>
+<filter id="0x0">
+    <feGaussianBlur stdDeviation="0"/>
+</filter>
+<filter id="0x5">
+    <feGaussianBlur stdDeviation="0 5"/>
+</filter>
+<filter id="5x0">
+    <feGaussianBlur stdDeviation="5 0"/>
+</filter>
+<filter id="3x3">
+    <feGaussianBlur stdDeviation="3"/>
+</filter>
+<filter id="1x6">
+    <feGaussianBlur stdDeviation="1 6"/>
+</filter>
+<filter id="6x1">
+    <feGaussianBlur stdDeviation="6 1"/>
+</filter>
+<filter id="2x10">
+    <feGaussianBlur stdDeviation="2 10"/>
+</filter>
+<filter id="1x1">
+    <feGaussianBlur stdDeviation="1"/>
+</filter>
+<filter id="10x100">
+    <feGaussianBlur stdDeviation="10 100"/>
+</filter>
+<filter id="15x15">
+    <feGaussianBlur stdDeviation="15 15"/>
+</filter>
+</defs>
+<g filter="url(#0x0)"  transform="translate(10, 10)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#0x5)"  transform="translate(110, 10)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#5x0)"  transform="translate(210, 10)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#3x3)"  transform="translate(310, 10)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#1x6)"  transform="translate(410, 10)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#6x1)"  transform="translate(10, 110)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#2x10)"  transform="translate(110, 110)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#1x1)"  transform="translate(210, 110)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#10x100)"  transform="translate(310, 110)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+<g filter="url(#15x15)"  transform="translate(410, 110)">
+    <rect x="0" y="0" width="50" height="50" fill="red"/>
+    <rect x="25" y="25" width="50" height="50" fill="blue"/>
+</g>
+</svg>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 37ec86a..703fdc2 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+2009-10-09  Dirk Schulze  <krit at webkit.org>
+
+        Reviewed by Oliver Hunt.
+
+        SVG Filter feGaussianBlur implementation is missing
+        [https://bugs.webkit.org/show_bug.cgi?id=28141]
+
+        This is the implementation of GaussianBlur filter for SVG.
+
+        There is already a test for feGaussianBlur
+        Test: svg/W3C-SVG-1.1/filters-gauss-01-b-w3c.svg 
+
+        Test: svg/filters/feGaussianBlur.svg
+
+        * platform/graphics/filters/FilterEffect.cpp:
+        (WebCore::FilterEffect::FilterEffect):
+        * platform/graphics/filters/FilterEffect.h:
+        (WebCore::FilterEffect::isAlphaImage):
+        (WebCore::FilterEffect::setIsAlphaImage):
+        * platform/graphics/filters/SourceAlpha.cpp:
+        (WebCore::SourceAlpha::apply):
+        * svg/graphics/filters/SVGFEGaussianBlur.cpp:
+        (WebCore::boxBlur):
+        (WebCore::FEGaussianBlur::apply):
+
 2009-10-09  Philippe Normand  <pnormand at igalia.com>
 
         Reviewed by Gustavo Noronha.
diff --git a/WebCore/platform/graphics/filters/FilterEffect.cpp b/WebCore/platform/graphics/filters/FilterEffect.cpp
index 5818e50..06ad89d 100644
--- a/WebCore/platform/graphics/filters/FilterEffect.cpp
+++ b/WebCore/platform/graphics/filters/FilterEffect.cpp
@@ -33,6 +33,7 @@ FilterEffect::FilterEffect()
     , m_hasY(false)
     , m_hasWidth(false)
     , m_hasHeight(false)
+    , m_alphaImage(false)
 {
 }
 
diff --git a/WebCore/platform/graphics/filters/FilterEffect.h b/WebCore/platform/graphics/filters/FilterEffect.h
index e2b8a0e..6eba188 100644
--- a/WebCore/platform/graphics/filters/FilterEffect.h
+++ b/WebCore/platform/graphics/filters/FilterEffect.h
@@ -79,6 +79,10 @@ namespace WebCore {
         FloatRect calculateDrawingRect(const FloatRect&);
         IntRect calculateDrawingIntRect(const FloatRect&);
 
+        // black image with different alpha values
+        bool isAlphaImage() { return m_alphaImage; }
+        void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; }
+
         virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return filter->filterRegion(); }
         virtual FloatRect calculateEffectRect(Filter*);
         virtual void apply(Filter*) = 0;
@@ -102,6 +106,8 @@ namespace WebCore {
         bool m_hasWidth : 1;
         bool m_hasHeight : 1;
 
+        bool m_alphaImage;
+
         FloatRect m_subRegion;
         FloatRect m_unionOfChildEffectSubregions;
 
diff --git a/WebCore/platform/graphics/filters/SourceAlpha.cpp b/WebCore/platform/graphics/filters/SourceAlpha.cpp
index 57436be..1b6309b 100644
--- a/WebCore/platform/graphics/filters/SourceAlpha.cpp
+++ b/WebCore/platform/graphics/filters/SourceAlpha.cpp
@@ -59,6 +59,8 @@ void SourceAlpha::apply(Filter* filter)
     if (!filterContext)
         return;
 
+    setIsAlphaImage(true);
+
     FloatRect imageRect(FloatPoint(), filter->sourceImage()->image()->size());
     filterContext->save();
     filterContext->clipToImageBuffer(imageRect, filter->sourceImage());
diff --git a/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp b/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp
index 601c39e..5a8a3e1 100644
--- a/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp
+++ b/WebCore/svg/graphics/filters/SVGFEGaussianBlur.cpp
@@ -2,6 +2,7 @@
     Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann at kde.org>
                   2004, 2005 Rob Buis <buis at kde.org>
                   2005 Eric Seidel <eric at webkit.org>
+                  2009 Dirk Schulze <krit at webkit.org>
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -23,8 +24,13 @@
 
 #if ENABLE(SVG) && ENABLE(FILTERS)
 #include "SVGFEGaussianBlur.h"
-#include "SVGRenderTreeAsText.h"
+
+#include "CanvasPixelArray.h"
 #include "Filter.h"
+#include "GraphicsContext.h"
+#include "ImageData.h"
+#include "SVGRenderTreeAsText.h"
+#include <math.h>
 
 namespace WebCore {
 
@@ -61,8 +67,68 @@ void FEGaussianBlur::setStdDeviationY(float y)
     m_y = y;
 }
 
-void FEGaussianBlur::apply(Filter*)
+void boxBlur(CanvasPixelArray*& srcPixelArray, CanvasPixelArray*& dstPixelArray,
+                 unsigned dx, int stride, int strideLine, int effectWidth, int effectHeight, bool alphaImage)
 {
+    int dxLeft = static_cast<int>(floor(dx / 2));
+    int dxRight = dx - dxLeft;
+
+    for (int y = 0; y < effectHeight; ++y) {
+        int line = y * strideLine;
+        for (int channel = 3; channel >= 0; --channel) {
+            int sum = 0;
+            // Fill the kernel
+            int maxKernelSize = std::min(dxRight, effectWidth);
+            for (int i = 0; i < maxKernelSize; ++i)
+                sum += srcPixelArray->get(line + i * stride + channel);
+
+            // Blurring
+            for (int x = 0; x < effectWidth; ++x) {
+                int pixelByteOffset = line + x * stride + channel;
+                dstPixelArray->set(pixelByteOffset, static_cast<unsigned char>(sum / dx));
+                if (x >= dxLeft)
+                    sum -= srcPixelArray->get(pixelByteOffset - dxLeft * stride);
+                if (x + dxRight < effectWidth)
+                    sum += srcPixelArray->get(pixelByteOffset + dxRight * stride);
+            }
+            if (alphaImage) // Source image is black, it just has different alpha values
+                break;
+        }
+    }
+}
+
+void FEGaussianBlur::apply(Filter* filter)
+{
+    m_in->apply(filter);
+    if (!m_in->resultImage())
+        return;
+
+    if (!getEffectContext())
+        return;
+
+    setIsAlphaImage(m_in->isAlphaImage());
+
+    if (m_x == 0 || m_y == 0)
+        return;
+
+    unsigned sdx = static_cast<unsigned>(floor(m_x * 3 * sqrt(2 * M_PI) / 4.f + 0.5f));
+    unsigned sdy = static_cast<unsigned>(floor(m_y * 3 * sqrt(2 * M_PI) / 4.f + 0.5f));
+
+    IntRect effectDrawingRect = calculateDrawingIntRect(m_in->subRegion());
+    RefPtr<ImageData> srcImageData(m_in->resultImage()->getPremultipliedImageData(effectDrawingRect));
+    CanvasPixelArray* srcPixelArray(srcImageData->data());
+
+    IntRect imageRect(IntPoint(), resultImage()->size());
+    RefPtr<ImageData> tmpImageData = ImageData::create(imageRect.width(), imageRect.height());
+    CanvasPixelArray* tmpPixelArray(tmpImageData->data());
+
+    int stride = 4 * imageRect.width();
+    for (int i = 0; i < 3; ++i) {
+        boxBlur(srcPixelArray, tmpPixelArray, sdx, 4, stride, imageRect.width(), imageRect.height(), isAlphaImage());
+        boxBlur(tmpPixelArray, srcPixelArray, sdy, stride, 4, imageRect.height(), imageRect.width(), isAlphaImage());
+    }
+
+    resultImage()->putPremultipliedImageData(srcImageData.get(), imageRect, IntPoint());
 }
 
 void FEGaussianBlur::dump()

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list