2010-02-08 Nikolas Zimmermann <nzimmermann@rim.com>
Reviewed by Dirk Schulze.
All SVG *-expected.txt files contain wrong results
https://bugs.webkit.org/show_bug.cgi?id=34703
Finally dump meaningful information for SVG layout tests.
Use 'absoluteClippedOverflowRect' which goes through the same code paths used
to actually calculate repaint rects etc - instead of the legacy CSS-unaware
code path that mapped 'repaintRectInLocalCoordinates' through 'absoluteTransform'.
Remove absoluteTransform() - a long standing TODO, finally not needed anymore.
Despite SVGRenderTreeAsText, SVGPaintServerGradient was also using absoluteTransform().
Rewrite the code in question, fixing svg/W3C-SVG-1.1/pserver-grad-08-b.svg alignment issues
when scaling/panning text using gradient on stroke/fill. Affects some other gradient tests as well.
As we're now dumping clipped overflow rects any problems with repaint rects will become
immediate visible - it turns out we're not supporting the overflow rules on the outermost <svg>
element properly (repaint rects and bounding boxes need to take special SVG overflow rules into account).
Fixing that magically gives pixel-perfect clipped overflow rects for all types of shapes/text/containers.
Note: This will break any overriden platform-specific SVG results, need to wait for build bots in order to update them.
* rendering/RenderObject.cpp: Remove absoluteTransform() method, centralize overflow query code in SVGRenderSupport::isOverflowHidden().
* rendering/RenderObject.h: Remove absoluteTransform() method.
* rendering/RenderSVGHiddenContainer.h: Ditto.
* rendering/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::paint): Use SVGRenderSupport::isOverflowHidden() to query SVG overflow mode.
(WebCore::RenderSVGRoot::computeRectForRepaint): Respect SVG overflow rules here: clip repaintRect against overflow rect _before_ passing
along to RenderBox. This is the key issue behind wrong absoluteClippedOverflowRect() values.
(WebCore::RenderSVGRoot::nodeAtPoint): Use SVGRenderSupport::isOverflowHidden() to query SVG overflow mode.
* rendering/RenderSVGRoot.h: Remove absoluteTransform(). Don't expose viewportSize() anymore.
* rendering/RenderSVGText.cpp:
(WebCore::RenderSVGText::strokeBoundingBox): Fix default stroke width to 1. This was the only wrong place -> fixes repaint rects for stroked text.
* rendering/RenderSVGViewportContainer.cpp: Remove absoluteTransform() method.
(WebCore::RenderSVGViewportContainer::pointIsInsideViewportClip): Use SVGRenderSupport::isOverflowHidden() to query SVG overflow mode.
* rendering/RenderSVGViewportContainer.h: Remove absoluteTransform() method.
* rendering/SVGRenderSupport.cpp: Refactored overflow queries in one place, centralizing SVG specific assumptions about overflowX/Y.
(WebCore::SVGRenderBase::isOverflowHidden):
* rendering/SVGRenderSupport.h:
* rendering/SVGRenderTreeAsText.cpp: Dump absoluteClippedOverflowRect() instead of absoluteTransform().mapRect(repaintRectInLocalCoordinates()).
(WebCore::writePositionAndStyle): Affects all layout tests dumping render trees.
* svg/graphics/SVGPaintServerGradient.cpp: Rewrite Gradient on text fill/stroke support on Cg, to avoid using absoluteTransform().
(WebCore::absoluteTransformForRenderer):
(WebCore::createMaskAndSwapContextForTextGradient):
(WebCore::clipToTextMask):
(WebCore::SVGPaintServerGradient::setup):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54483 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/SVGRenderSupport.cpp b/WebCore/rendering/SVGRenderSupport.cpp
index 86cbf32..2c80735 100644
--- a/WebCore/rendering/SVGRenderSupport.cpp
+++ b/WebCore/rendering/SVGRenderSupport.cpp
@@ -258,6 +258,17 @@
}
}
+bool SVGRenderBase::isOverflowHidden(const RenderObject* object)
+{
+ if (object->style()->overflowX() == OHIDDEN) {
+ // SVG doesn't support independent x/y overflow
+ ASSERT(object->style()->overflowY() == OHIDDEN);
+ return true;
+ }
+
+ return false;
+}
+
FloatRect SVGRenderBase::filterBoundingBoxForRenderer(const RenderObject* object) const
{
#if ENABLE(FILTERS)