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&);