[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