Title: [145541] trunk
Revision
145541
Author
[email protected]
Date
2013-03-12 07:38:48 -0700 (Tue, 12 Mar 2013)

Log Message

SVG Pattern pixelated on inline SVG with CSS transforms
https://bugs.webkit.org/show_bug.cgi?id=111587

Reviewed by Dirk Schulze.

Source/WebCore:

When calculating the resolution for resource image buffers, we need to also consider CSS
transforms. This patch updates calculateTransformationToOutermostSVGCoordinateSystem()
(renamed to calculateTransformationToOutermostCoordinateSystem) to include the affine
component from CSS transforms by walking the parent layer tree.

Test: svg/custom/resources-css-scaled.html

* rendering/svg/RenderSVGResourceClipper.cpp:
(WebCore::RenderSVGResourceClipper::applyClippingToContext):
* rendering/svg/RenderSVGResourceFilter.cpp:
(WebCore::RenderSVGResourceFilter::applyResource):
* rendering/svg/RenderSVGResourceGradient.cpp:
(WebCore::createMaskAndSwapContextForTextGradient):
(WebCore::clipToTextMask):
* rendering/svg/RenderSVGResourceMasker.cpp:
(WebCore::RenderSVGResourceMasker::applyResource):
* rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::buildPattern):
* rendering/svg/SVGRenderingContext.cpp:
(WebCore::SVGRenderingContext::calculateScreenFontSizeScalingFactor):
(WebCore::SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem):
* rendering/svg/SVGRenderingContext.h:
(SVGRenderingContext):

LayoutTests:

* svg/custom/resources-css-scaled-expected.html: Added.
* svg/custom/resources-css-scaled.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (145540 => 145541)


--- trunk/LayoutTests/ChangeLog	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/LayoutTests/ChangeLog	2013-03-12 14:38:48 UTC (rev 145541)
@@ -1,3 +1,13 @@
+2013-03-12  Florin Malita  <[email protected]>
+
+        SVG Pattern pixelated on inline SVG with CSS transforms
+        https://bugs.webkit.org/show_bug.cgi?id=111587
+
+        Reviewed by Dirk Schulze.
+
+        * svg/custom/resources-css-scaled-expected.html: Added.
+        * svg/custom/resources-css-scaled.html: Added.
+
 2013-03-12  Vsevolod Vlasov  <[email protected]>
 
         Web Inspector: ResourceScriptFile diverged state should be correctly reset after debugger reset.

Added: trunk/LayoutTests/svg/custom/resources-css-scaled-expected.html (0 => 145541)


--- trunk/LayoutTests/svg/custom/resources-css-scaled-expected.html	                        (rev 0)
+++ trunk/LayoutTests/svg/custom/resources-css-scaled-expected.html	2013-03-12 14:38:48 UTC (rev 145541)
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<body>
+
+<div style="position: relative; left: 27px; width: 100px;">
+<div style="width: 50px;">
+  <svg width="600" height="400" xmlns="http://www.w3.org/2000/svg">
+    <defs>
+      <pattern id="pattern" width="100" height="100" patternUnits="userSpaceOnUse">
+        <circle cx="50" cy="50" r="50" fill="green"/>
+      </pattern>
+
+      <mask id="mask">
+        <circle cx="50" cy="50" r="50" fill="white"/>
+      </mask>
+
+      <clipPath id="clip">
+        <circle cx="50" cy="50" r="50"/>
+        <circle cx="50" cy="50" r="50"/>
+      </clipPath>
+
+      <filter id="filter">
+        <feOffset dx="0" dy="0"/>
+      </filter>
+    </defs>
+
+    <circle cx="50" cy="50" r="50" fill="green"/>
+
+    <g transform="translate(300)">
+      <rect width="100" height="100" fill="url(#pattern)"></rect>
+    </g>
+
+    <g transform="translate(150 150)">
+      <rect width="100" height="100" fill="green" mask="url(#mask)"/>
+    </g>
+
+    <g transform="translate(0 300)">
+      <rect width="100" height="100" fill="green" clip-path="url(#clip)"/>
+    </g>
+
+    <g transform="translate(300 300)">
+      <circle cx="50" cy="50" r="50" fill="green" filter="url(#filter)"/>
+    </g>
+  </svg>
+</div>
+</div>
+</body>
+</html>

Added: trunk/LayoutTests/svg/custom/resources-css-scaled.html (0 => 145541)


--- trunk/LayoutTests/svg/custom/resources-css-scaled.html	                        (rev 0)
+++ trunk/LayoutTests/svg/custom/resources-css-scaled.html	2013-03-12 14:38:48 UTC (rev 145541)
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<body>
+
+<!-- Test for https://bugs.webkit.org/show_bug.cgi?id=111587 -->
+<!-- Passes if all circles are drawn at high resolution, without pixelation -->
+
+<div style="position: relative; left: 27px; -webkit-transform: scale(5); -webkit-transform-origin: 0 0; width: 100px;">
+<div style="-webkit-transform: scale(2); -webkit-transform-origin: 0 0; width: 50px;">
+  <svg width="40" height="40" xmlns="http://www.w3.org/2000/svg">
+    <defs>
+      <pattern id="pattern" width="10" height="10" patternUnits="userSpaceOnUse">
+        <circle cx="5" cy="5" r="5" fill="green"/>
+      </pattern>
+
+      <mask id="mask">
+        <circle cx="5" cy="5" r="5" fill="white"/>
+      </mask>
+
+      <clipPath id="clip">
+        <circle cx="5" cy="5" r="5"/>
+        <!-- multiple shapes to force mask-based clipping -->
+        <circle cx="5" cy="5" r="5"/>
+      </clipPath>
+
+      <filter id="filter">
+        <feOffset dx="0" dy="0"/>
+      </filter>
+    </defs>
+
+    <circle cx="5" cy="5" r="5" fill="green"/>
+
+    <g transform="translate(30)">
+      <rect width="10" height="10" fill="url(#pattern)"></rect>
+    </g>
+
+    <g transform="translate(15 15)">
+      <rect width="10" height="10" fill="green" mask="url(#mask)"/>
+    </g>
+
+    <g transform="translate(0 30)">
+      <rect width="10" height="10" fill="green" clip-path="url(#clip)"/>
+    </g>
+
+    <g transform="translate(30 30)">
+      <circle cx="5" cy="5" r="5" fill="green" filter="url(#filter)"/>
+    </g>
+  </svg>
+</div>
+</div>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (145540 => 145541)


--- trunk/Source/WebCore/ChangeLog	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/ChangeLog	2013-03-12 14:38:48 UTC (rev 145541)
@@ -1,3 +1,34 @@
+2013-03-12  Florin Malita  <[email protected]>
+
+        SVG Pattern pixelated on inline SVG with CSS transforms
+        https://bugs.webkit.org/show_bug.cgi?id=111587
+
+        Reviewed by Dirk Schulze.
+
+        When calculating the resolution for resource image buffers, we need to also consider CSS
+        transforms. This patch updates calculateTransformationToOutermostSVGCoordinateSystem()
+        (renamed to calculateTransformationToOutermostCoordinateSystem) to include the affine
+        component from CSS transforms by walking the parent layer tree.        
+
+        Test: svg/custom/resources-css-scaled.html
+
+        * rendering/svg/RenderSVGResourceClipper.cpp:
+        (WebCore::RenderSVGResourceClipper::applyClippingToContext):
+        * rendering/svg/RenderSVGResourceFilter.cpp:
+        (WebCore::RenderSVGResourceFilter::applyResource):
+        * rendering/svg/RenderSVGResourceGradient.cpp:
+        (WebCore::createMaskAndSwapContextForTextGradient):
+        (WebCore::clipToTextMask):
+        * rendering/svg/RenderSVGResourceMasker.cpp:
+        (WebCore::RenderSVGResourceMasker::applyResource):
+        * rendering/svg/RenderSVGResourcePattern.cpp:
+        (WebCore::RenderSVGResourcePattern::buildPattern):
+        * rendering/svg/SVGRenderingContext.cpp:
+        (WebCore::SVGRenderingContext::calculateScreenFontSizeScalingFactor):
+        (WebCore::SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem):
+        * rendering/svg/SVGRenderingContext.h:
+        (SVGRenderingContext):
+
 2013-03-12  Yury Semikhatsky  <[email protected]>
 
         Web Inspector: add html canvas memory details to the native memory overview

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp	2013-03-12 14:38:48 UTC (rev 145541)
@@ -169,7 +169,7 @@
     }
 
     AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(object, absoluteTransform);
+    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(object, absoluteTransform);
 
     if (shouldCreateClipData && !repaintRect.isEmpty()) {
         if (!SVGRenderingContext::createImageBuffer(repaintRect, absoluteTransform, clipperData->clipMaskImage, ColorSpaceDeviceRGB, Unaccelerated))

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp	2013-03-12 14:38:48 UTC (rev 145541)
@@ -166,7 +166,7 @@
 
     // Determine absolute transformation matrix for filter. 
     AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(object, absoluteTransform);
+    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(object, absoluteTransform);
     if (!absoluteTransform.isInvertible())
         return false;
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp	2013-03-12 14:38:48 UTC (rev 145541)
@@ -68,7 +68,7 @@
     ASSERT(textRootBlock);
 
     AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(textRootBlock, absoluteTransform);
+    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(textRootBlock, absoluteTransform);
 
     FloatRect repaintRect = textRootBlock->repaintRectInLocalCoordinates();
     OwnPtr<ImageBuffer> maskImage;
@@ -95,7 +95,7 @@
     ASSERT(textRootBlock);
 
     AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(textRootBlock, absoluteTransform);
+    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(textRootBlock, absoluteTransform);
 
     targetRect = textRootBlock->repaintRectInLocalCoordinates();
     SVGRenderingContext::clipToImageBuffer(context, absoluteTransform, targetRect, imageBuffer, false);

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp	2013-03-12 14:38:48 UTC (rev 145541)
@@ -92,7 +92,7 @@
     MaskerData* maskerData = m_masker.get(object);
 
     AffineTransform absoluteTransform;
-    SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(object, absoluteTransform);
+    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(object, absoluteTransform);
 
     FloatRect repaintRect = object->repaintRectInLocalCoordinates();
 

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp	2013-03-12 14:38:48 UTC (rev 145541)
@@ -84,7 +84,7 @@
         return 0;
 
     AffineTransform absoluteTransformIgnoringRotation;
-    SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(object, absoluteTransformIgnoringRotation);
+    SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(object, absoluteTransformIgnoringRotation);
 
     // Ignore 2D rotation, as it doesn't affect the size of the tile.
     SVGRenderingContext::clear2DRotation(absoluteTransformIgnoringRotation);

Modified: trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderingContext.cpp	2013-03-12 14:38:48 UTC (rev 145541)
@@ -30,6 +30,7 @@
 #include "BasicShapes.h"
 #include "Frame.h"
 #include "FrameView.h"
+#include "RenderLayer.h"
 #include "RenderSVGResource.h"
 #include "RenderSVGResourceClipper.h"
 #include "RenderSVGResourceFilter.h"
@@ -188,22 +189,35 @@
     ASSERT(renderer);
 
     AffineTransform ctm;
-    calculateTransformationToOutermostSVGCoordinateSystem(renderer, ctm);
+    calculateTransformationToOutermostCoordinateSystem(renderer, ctm);
     return narrowPrecisionToFloat(sqrt((pow(ctm.xScale(), 2) + pow(ctm.yScale(), 2)) / 2));
 }
 
-void SVGRenderingContext::calculateTransformationToOutermostSVGCoordinateSystem(const RenderObject* renderer, AffineTransform& absoluteTransform)
+void SVGRenderingContext::calculateTransformationToOutermostCoordinateSystem(const RenderObject* renderer, AffineTransform& absoluteTransform)
 {
-    const RenderObject* current = renderer;
-    ASSERT(current);
+    ASSERT(renderer);
+    absoluteTransform = currentContentTransformation();
 
-    absoluteTransform = currentContentTransformation();
-    while (current) {
-        absoluteTransform = current->localToParentTransform() * absoluteTransform;
-        if (current->isSVGRoot())
+    // Walk up the render tree, accumulating SVG transforms.
+    while (renderer) {
+        absoluteTransform = renderer->localToParentTransform() * absoluteTransform;
+        if (renderer->isSVGRoot())
             break;
-        current = current->parent();
+        renderer = renderer->parent();
     }
+
+    // Continue walking up the layer tree, accumulating CSS transforms.
+    RenderLayer* layer = renderer ? renderer->enclosingLayer() : 0;
+    while (layer) {
+        if (TransformationMatrix* layerTransform = layer->transform())
+            absoluteTransform = layerTransform->toAffineTransform() * absoluteTransform;
+
+        // We can stop at compositing layers, to match the backing resolution.
+        if (layer->isComposited())
+            break;
+
+        layer = layer->parent();
+    }
 }
 
 bool SVGRenderingContext::createImageBuffer(const FloatRect& targetRect, const AffineTransform& absoluteTransform, OwnPtr<ImageBuffer>& imageBuffer, ColorSpace colorSpace, RenderingMode renderingMode)

Modified: trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h (145540 => 145541)


--- trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h	2013-03-12 14:35:33 UTC (rev 145540)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderingContext.h	2013-03-12 14:38:48 UTC (rev 145541)
@@ -83,7 +83,7 @@
     static void clipToImageBuffer(GraphicsContext*, const AffineTransform& absoluteTransform, const FloatRect& targetRect, OwnPtr<ImageBuffer>&, bool safeToClear);
 
     static float calculateScreenFontSizeScalingFactor(const RenderObject*);
-    static void calculateTransformationToOutermostSVGCoordinateSystem(const RenderObject*, AffineTransform& absoluteTransform);
+    static void calculateTransformationToOutermostCoordinateSystem(const RenderObject*, AffineTransform& absoluteTransform);
     static IntSize clampedAbsoluteSize(const IntSize&);
     static FloatRect clampedAbsoluteTargetRect(const FloatRect& absoluteTargetRect);
     static void clear2DRotation(AffineTransform&);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to