[webkitgtk3/f17] Fix SVG clipping

Peter Hatina phatina at fedoraproject.org
Fri Jun 8 07:00:33 UTC 2012


commit 9708b4770c6d895aaa006d9362d0772db47885e7
Author: Peter Hatina <phatina at redhat.com>
Date:   Fri Jun 8 09:01:30 2012 +0200

    Fix SVG clipping

 webkit-svg-clipping.patch |   94 +++++++++++++++++++++++++++++++++++++++++++++
 webkitgtk3.spec           |    7 +++-
 2 files changed, 100 insertions(+), 1 deletions(-)
---
diff --git a/webkit-svg-clipping.patch b/webkit-svg-clipping.patch
new file mode 100644
index 0000000..39974da
--- /dev/null
+++ b/webkit-svg-clipping.patch
@@ -0,0 +1,94 @@
+diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
+index 34db57d..98cad17 100644
+--- a/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
++++ b/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
+@@ -155,7 +155,8 @@ bool RenderSVGResourceClipper::pathOnlyClipping(GraphicsContext* context, const
+ bool RenderSVGResourceClipper::applyClippingToContext(RenderObject* object, const FloatRect& objectBoundingBox,
+                                                       const FloatRect& repaintRect, GraphicsContext* context)
+ {
+-    if (!m_clipper.contains(object))
++    bool missingClipperData = !m_clipper.contains(object);
++    if (missingClipperData)
+         m_clipper.set(object, new ClipperData);
+ 
+     bool shouldCreateClipData = false;
+@@ -201,7 +202,7 @@ bool RenderSVGResourceClipper::applyClippingToContext(RenderObject* object, cons
+     if (!clipperData->clipMaskImage)
+         return false;
+ 
+-    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, repaintRect, clipperData->clipMaskImage);
++    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, repaintRect, clipperData->clipMaskImage, missingClipperData);
+     return true;
+ }
+ 
+diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp
+index ead5510..1a1d5a0 100644
+--- a/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp
++++ b/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp
+@@ -98,7 +98,7 @@ static inline AffineTransform clipToTextMask(GraphicsContext* context,
+     SVGImageBufferTools::calculateTransformationToOutermostSVGCoordinateSystem(textRootBlock, absoluteTransform);
+ 
+     targetRect = textRootBlock->repaintRectInLocalCoordinates();
+-    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, targetRect, imageBuffer);
++    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, targetRect, imageBuffer, false);
+ 
+     AffineTransform matrix;
+     if (boundingBoxMode) {
+diff --git a/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp b/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp
+index bf59549..f7a35e3 100644
+--- a/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp
++++ b/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp
+@@ -86,7 +86,8 @@ bool RenderSVGResourceMasker::applyResource(RenderObject* object, RenderStyle*,
+     ASSERT(context);
+     ASSERT_UNUSED(resourceMode, resourceMode == ApplyToDefaultMode);
+ 
+-    if (!m_masker.contains(object))
++    bool missingMaskerData = !m_masker.contains(object);
++    if (missingMaskerData)
+         m_masker.set(object, new MaskerData);
+ 
+     MaskerData* maskerData = m_masker.get(object);
+@@ -116,7 +117,7 @@ bool RenderSVGResourceMasker::applyResource(RenderObject* object, RenderStyle*,
+     if (!maskerData->maskImage)
+         return false;
+ 
+-    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage);
++    SVGImageBufferTools::clipToImageBuffer(context, absoluteTransform, repaintRect, maskerData->maskImage, missingMaskerData);
+     return true;
+ }
+ 
+diff --git a/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp b/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp
+index ef97a28..9fa6d68 100644
+--- a/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp
++++ b/Source/WebCore/rendering/svg/SVGImageBufferTools.cpp
+@@ -121,7 +121,7 @@ void SVGImageBufferTools::renderSubtreeToImageBuffer(ImageBuffer* image, RenderO
+     contentTransformation = savedContentTransformation;
+ }
+ 
+-void SVGImageBufferTools::clipToImageBuffer(GraphicsContext* context, const AffineTransform& absoluteTransform, const FloatRect& targetRect, OwnPtr<ImageBuffer>& imageBuffer)
++void SVGImageBufferTools::clipToImageBuffer(GraphicsContext* context, const AffineTransform& absoluteTransform, const FloatRect& targetRect, OwnPtr<ImageBuffer>& imageBuffer, bool safeToClear)
+ {
+     ASSERT(context);
+     ASSERT(imageBuffer);
+@@ -136,7 +136,7 @@ void SVGImageBufferTools::clipToImageBuffer(GraphicsContext* context, const Affi
+ 
+     // When nesting resources, with objectBoundingBox as content unit types, there's no use in caching the
+     // resulting image buffer as the parent resource already caches the result.
+-    if (!currentContentTransformation().isIdentity())
++    if (safeToClear && !currentContentTransformation().isIdentity())
+         imageBuffer.clear();
+ }
+ 
+diff --git a/Source/WebCore/rendering/svg/SVGImageBufferTools.h b/Source/WebCore/rendering/svg/SVGImageBufferTools.h
+index dce80cc..b71b10d 100644
+--- a/Source/WebCore/rendering/svg/SVGImageBufferTools.h
++++ b/Source/WebCore/rendering/svg/SVGImageBufferTools.h
+@@ -42,7 +42,7 @@ public:
+     static bool createImageBufferForPattern(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&, ColorSpace, RenderingMode);
+ 
+     static void renderSubtreeToImageBuffer(ImageBuffer*, RenderObject*, const AffineTransform&);
+-    static void clipToImageBuffer(GraphicsContext*, const AffineTransform& absoluteTransform, const FloatRect& targetRect, OwnPtr<ImageBuffer>&);
++    static void clipToImageBuffer(GraphicsContext*, const AffineTransform& absoluteTransform, const FloatRect& targetRect, OwnPtr<ImageBuffer>&, bool safeToClear);
+ 
+     static void calculateTransformationToOutermostSVGCoordinateSystem(const RenderObject*, AffineTransform& absoluteTransform);
+     static IntSize clampedAbsoluteSize(const IntSize&);
diff --git a/webkitgtk3.spec b/webkitgtk3.spec
index eac5345..4220719 100644
--- a/webkitgtk3.spec
+++ b/webkitgtk3.spec
@@ -7,7 +7,7 @@
 
 Name:           webkitgtk3
 Version:        1.8.1
-Release:        2%{?dist}
+Release:        3%{?dist}
 Summary:        GTK+ Web content engine library
 
 Group:          Development/Libraries
@@ -18,6 +18,7 @@ Source0:        http://webkitgtk.org/releases/webkit-%{version}.tar.xz
 
 Patch1:         webkit-1.3.4-no-execmem.patch
 Patch2:         webkit-1.1.14-nspluginwrapper.patch
+Patch3:         webkit-svg-clipping.patch
 
 BuildRequires:  bison
 BuildRequires:  chrpath
@@ -82,6 +83,7 @@ This package contains developer documentation for %{name}.
 # tbzatek - doesn't apply, is this fixed?
 # %patch1 -p1 -b .no-execmem
 %patch2 -p1 -b .nspluginwrapper
+%patch3 -p1 -b .svg-clipping
 
 %build
 %ifarch s390 %{arm} ppc
@@ -185,6 +187,9 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || :
 
 
 %changelog
+* Fri Jun 08 2012 Peter Hatina <phatina at redhat.com> - 1.8.1-3
+- Fix svg clipping
+
 * Mon May 14 2012 Peter Robinson <pbrobinson at fedoraproject.org> - 1.8.1-2
 - Explicitly disable JIT on ARM as it's not currently stable with JS heavy pages
 


More information about the scm-commits mailing list