From 0827c378f816a9644c17d3805b64c4ce74c691ed Mon Sep 17 00:00:00 2001 From: "commit-queue@webkit.org" Date: Fri, 24 Feb 2012 00:52:35 +0000 Subject: [PATCH] Recompute font metrics on scale changes https://bugs.webkit.org/show_bug.cgi?id=75091 Patch by Philip Rogers on 2012-02-23 Reviewed by Nikolas Zimmermann. Source/WebCore: SVG text metrics depend on the transform from renderer to the svg root which requires that we propagate transform changes down to text. This change adds a boolean for tracking transform changes to SVGViewportContainers and SVGTransformableContainers, and updates RenderSVGText::layout() to recalculate text metrics if the transform of an ancestor has changed. Tests: platform/mac/svg/text/text-rescale.html platform/mac/svg/text/text-viewbox-rescale.html svg/text/text-rescale.html svg/text/text-viewbox-rescale.html * rendering/RenderObject.h: (WebCore::RenderObject::isSVGTransformableContainer): (WebCore::RenderObject::isSVGViewportContainer): * rendering/svg/RenderSVGContainer.h: (WebCore::RenderSVGContainer::didTransformToRootUpdate): * rendering/svg/RenderSVGInlineText.cpp: (WebCore::RenderSVGInlineText::computeNewScaledFontForStyle): * rendering/svg/RenderSVGText.cpp: (WebCore::RenderSVGText::RenderSVGText): (WebCore::RenderSVGText::layout): * rendering/svg/RenderSVGText.h: (WebCore::RenderSVGText::setNeedsTextMetricsUpdate): (RenderSVGText): * rendering/svg/RenderSVGTransformableContainer.cpp: (WebCore::RenderSVGTransformableContainer::RenderSVGTransformableContainer): (WebCore::RenderSVGTransformableContainer::calculateLocalTransform): * rendering/svg/RenderSVGTransformableContainer.h: (WebCore::RenderSVGTransformableContainer::isSVGTransformableContainer): (WebCore::RenderSVGTransformableContainer::didTransformToRootUpdate): (RenderSVGTransformableContainer): * rendering/svg/RenderSVGViewportContainer.cpp: (WebCore::RenderSVGViewportContainer::RenderSVGViewportContainer): (WebCore::RenderSVGViewportContainer::calcViewport): * rendering/svg/RenderSVGViewportContainer.h: (WebCore::RenderSVGViewportContainer::didTransformToRootUpdate): (RenderSVGViewportContainer): * rendering/svg/SVGRenderSupport.cpp: (WebCore::SVGRenderSupport::transformToRootChanged): (WebCore): (WebCore::SVGRenderSupport::layoutChildren): * rendering/svg/SVGRenderSupport.h: (SVGRenderSupport): LayoutTests: * platform/chromium-linux/svg/text/text-rescale-expected.png: Added. * platform/chromium-linux/svg/text/text-rescale-expected.txt: Added. * platform/chromium-linux/svg/text/text-viewbox-rescale-expected.png: Added. * platform/chromium-linux/svg/text/text-viewbox-rescale-expected.txt: Added. * platform/chromium/test_expectations.txt: * platform/mac/svg/text/text-rescale-expected.png: Added. * platform/mac/svg/text/text-rescale-expected.txt: Added. * platform/mac/svg/text/text-rescale.html: Added. * platform/mac/svg/text/text-viewbox-rescale-expected.png: Added. * platform/mac/svg/text/text-viewbox-rescale-expected.txt: Added. * platform/mac/svg/text/text-viewbox-rescale.html: Added. * svg/text/text-rescale-expected.png: Added. * svg/text/text-rescale-expected.txt: Added. * svg/text/text-rescale.html: Added. * svg/text/text-viewbox-rescale-expected.png: Added. * svg/text/text-viewbox-rescale-expected.txt: Added. * svg/text/text-viewbox-rescale.html: Added. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108699 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 25 ++++++++++ .../svg/text/text-rescale-expected.png | Bin 0 -> 10116 bytes .../svg/text/text-rescale-expected.txt | 55 +++++++++++++++++++++ .../svg/text/text-viewbox-rescale-expected.png | Bin 0 -> 4845 bytes .../svg/text/text-viewbox-rescale-expected.txt | 23 +++++++++ .../platform/chromium/test_expectations.txt | 10 ++++ .../mac/svg/text/text-rescale-expected.png | Bin 0 -> 22691 bytes .../mac/svg/text/text-rescale-expected.txt | 55 +++++++++++++++++++++ .../platform/mac/svg/text/text-rescale.html | 55 +++++++++++++++++++++ .../mac/svg/text/text-viewbox-rescale-expected.png | Bin 0 -> 13430 bytes .../mac/svg/text/text-viewbox-rescale-expected.txt | 23 +++++++++ .../mac/svg/text/text-viewbox-rescale.html | 30 +++++++++++ LayoutTests/svg/text/text-rescale-expected.png | Bin 0 -> 10116 bytes LayoutTests/svg/text/text-rescale-expected.txt | 55 +++++++++++++++++++++ LayoutTests/svg/text/text-rescale.html | 55 +++++++++++++++++++++ .../svg/text/text-viewbox-rescale-expected.png | Bin 0 -> 4845 bytes .../svg/text/text-viewbox-rescale-expected.txt | 23 +++++++++ LayoutTests/svg/text/text-viewbox-rescale.html | 30 +++++++++++ Source/WebCore/ChangeLog | 52 +++++++++++++++++++ Source/WebCore/rendering/RenderObject.h | 3 +- Source/WebCore/rendering/svg/RenderSVGContainer.h | 1 + .../WebCore/rendering/svg/RenderSVGInlineText.cpp | 2 + Source/WebCore/rendering/svg/RenderSVGText.cpp | 7 ++- Source/WebCore/rendering/svg/RenderSVGText.h | 2 + .../svg/RenderSVGTransformableContainer.cpp | 3 ++ .../svg/RenderSVGTransformableContainer.h | 3 ++ .../rendering/svg/RenderSVGViewportContainer.cpp | 2 + .../rendering/svg/RenderSVGViewportContainer.h | 2 + Source/WebCore/rendering/svg/SVGRenderSupport.cpp | 21 ++++++++ Source/WebCore/rendering/svg/SVGRenderSupport.h | 3 ++ 30 files changed, 537 insertions(+), 3 deletions(-) create mode 100644 LayoutTests/platform/chromium-linux/svg/text/text-rescale-expected.png create mode 100644 LayoutTests/platform/chromium-linux/svg/text/text-rescale-expected.txt create mode 100644 LayoutTests/platform/chromium-linux/svg/text/text-viewbox-rescale-expected.png create mode 100644 LayoutTests/platform/chromium-linux/svg/text/text-viewbox-rescale-expected.txt create mode 100644 LayoutTests/platform/mac/svg/text/text-rescale-expected.png create mode 100644 LayoutTests/platform/mac/svg/text/text-rescale-expected.txt create mode 100644 LayoutTests/platform/mac/svg/text/text-rescale.html create mode 100644 LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.png create mode 100644 LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.txt create mode 100644 LayoutTests/platform/mac/svg/text/text-viewbox-rescale.html create mode 100644 LayoutTests/svg/text/text-rescale-expected.png create mode 100644 LayoutTests/svg/text/text-rescale-expected.txt create mode 100644 LayoutTests/svg/text/text-rescale.html create mode 100644 LayoutTests/svg/text/text-viewbox-rescale-expected.png create mode 100644 LayoutTests/svg/text/text-viewbox-rescale-expected.txt create mode 100644 LayoutTests/svg/text/text-viewbox-rescale.html diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 00a8f7a..580dc91 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,28 @@ +2012-02-23 Philip Rogers + + Recompute font metrics on scale changes + https://bugs.webkit.org/show_bug.cgi?id=75091 + + Reviewed by Nikolas Zimmermann. + + * platform/chromium-linux/svg/text/text-rescale-expected.png: Added. + * platform/chromium-linux/svg/text/text-rescale-expected.txt: Added. + * platform/chromium-linux/svg/text/text-viewbox-rescale-expected.png: Added. + * platform/chromium-linux/svg/text/text-viewbox-rescale-expected.txt: Added. + * platform/chromium/test_expectations.txt: + * platform/mac/svg/text/text-rescale-expected.png: Added. + * platform/mac/svg/text/text-rescale-expected.txt: Added. + * platform/mac/svg/text/text-rescale.html: Added. + * platform/mac/svg/text/text-viewbox-rescale-expected.png: Added. + * platform/mac/svg/text/text-viewbox-rescale-expected.txt: Added. + * platform/mac/svg/text/text-viewbox-rescale.html: Added. + * svg/text/text-rescale-expected.png: Added. + * svg/text/text-rescale-expected.txt: Added. + * svg/text/text-rescale.html: Added. + * svg/text/text-viewbox-rescale-expected.png: Added. + * svg/text/text-viewbox-rescale-expected.txt: Added. + * svg/text/text-viewbox-rescale.html: Added. + 2012-02-23 Adrienne Walker [chromium] Unreviewed gardening. Re-enable a handful of tests. diff --git a/LayoutTests/platform/chromium-linux/svg/text/text-rescale-expected.png b/LayoutTests/platform/chromium-linux/svg/text/text-rescale-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0d53d66d1ae4cfb66aea50ab01b55e943e9a1d GIT binary patch literal 10116 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 + + + + + + + + + + + PASS + PASS + + +

PASS

+
+ + PASS + +
+ + + PASS + PASS + + +

PASS

+
+ + PASS + +
+ + + PASS + PASS + + +

PASS

+
+ + PASS + +
+
+ + + \ No newline at end of file diff --git a/LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.png b/LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..15e6697e00201442322eda56bc664d733aedc9d1 GIT binary patch literal 13430 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 literal 0 HcmV?d00001 diff --git a/LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.txt b/LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.txt new file mode 100644 index 0000000..54888c1 --- /dev/null +++ b/LayoutTests/platform/mac/svg/text/text-viewbox-rescale-expected.txt @@ -0,0 +1,23 @@ +layer at (0,0) size 800x600 + RenderView at (0,0) size 800x600 +layer at (0,0) size 800x600 + RenderBlock {HTML} at (0,0) size 800x600 + RenderBody {BODY} at (8,8) size 784x584 +layer at (0,0) size 200x200 + RenderSVGRoot {svg} at (0,0) size 200x200 + RenderSVGViewportContainer {svg} at (0,0) size 200x200 + RenderSVGText {text} at (0,0) size 1x1 contains 1 chunk(s) + RenderSVGInlineText {#text} at (0,0) size 1x1 + chunk 1 text run 1 at (0.30,0.30) startOffset 0 endOffset 5 width 0.26: "PASS " + RenderSVGTSpan {tspan} at (0,0) size 1x1 + RenderSVGInlineText {#text} at (0,0) size 1x1 + chunk 1 text run 1 at (0.56,0.30) startOffset 0 endOffset 4 width 0.24: "PASS" + RenderSVGInlineText {#text} at (0,0) size 0x0 + RenderSVGViewportContainer {svg} at (0,100) size 200x100 + RenderSVGText {text} at (0,0) size 1x1 contains 1 chunk(s) + RenderSVGInlineText {#text} at (0,0) size 1x1 + chunk 1 text run 1 at (0.30,0.30) startOffset 0 endOffset 5 width 0.26: "PASS " + RenderSVGTSpan {tspan} at (0,0) size 1x1 + RenderSVGInlineText {#text} at (0,0) size 1x1 + chunk 1 text run 1 at (0.56,0.30) startOffset 0 endOffset 4 width 0.24: "PASS" + RenderSVGInlineText {#text} at (0,0) size 0x0 diff --git a/LayoutTests/platform/mac/svg/text/text-viewbox-rescale.html b/LayoutTests/platform/mac/svg/text/text-viewbox-rescale.html new file mode 100644 index 0000000..d458f02 --- /dev/null +++ b/LayoutTests/platform/mac/svg/text/text-viewbox-rescale.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + PASS + PASS + + + + + PASS + PASS + + + + + + \ No newline at end of file diff --git a/LayoutTests/svg/text/text-rescale-expected.png b/LayoutTests/svg/text/text-rescale-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0d53d66d1ae4cfb66aea50ab01b55e943e9a1d GIT binary patch literal 10116 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 + + + + + + + + + + + PASS + PASS + + +

PASS

+
+ + PASS + +
+ + + PASS + PASS + + +

PASS

+
+ + PASS + +
+ + + PASS + PASS + + +

PASS

+
+ + PASS + +
+
+ + + \ No newline at end of file diff --git a/LayoutTests/svg/text/text-viewbox-rescale-expected.png b/LayoutTests/svg/text/text-viewbox-rescale-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..810401af0e408c2700a79550bcec84d5cc649945 GIT binary patch literal 4845 zcmeI0`BM^T7{}kVvTQx7wOUz^a?927PRUWBEGsp$NW&Wp%<^tm@|J8ZGefi0wA7{D zhBPY3J0%Wv)AFn-ut0=7Nx>sT!;7W=px<_E`01JFooD8GW}ff!ndf=4PaHp@rKzt8 z0MK$jdI$l4x-kH1e(ThfFM2=fnJSH0yqjM<=3E#i@^@S`aNKtmV`FQ(*WTVH)CP+Q z`|5?-heEBfc4r*y_gQbW;bsA_3GaUBfKOtngpZ0Ulo_;5qdJHjU90wMmuv~eJDV?W z3*3=!VHx%4A~gA9=9_It(bHEyz33crB}}*KW_x6=+E^D{ycfI4KQ46rg98U$?*(rc zp$$TW4y0dCTrkFKN-P`qdUb63w?|VWgj$*-b?%ufO}7#_j=nnYi$b9?YUI*Ultd2* z$qyOa4FCkiuHFLn7qisBy3Kw7gsN=-#>ddBK<4^A;F5L58lb!DDFDqYD99I!_O+nu zFIFUx&W>>(de&Jw#t*#4r@ZQLLK!ONzu1lT1kH?HO@ln3J4TClW6G7L>o0qwwCR)V z&*a_u71#LSQvS*O4BSWLR_>NM8GJH;i~C$;Do7Lab1Au31@=FSVf#`U<@MpdZRCk+ zK19)Y;S1XrA5x1QzcueJ3ucOvW0zATS-kMYv#oksKJ77p^|In6i%cQM6u*0|NF8{V zjUl%kBU&$!CYkZ#&dTrr;!iL^6*H{aYqN*h`0QgyI!;a*CKa#=kJ@^3nUWEn!y>k& zB>|S|re0VD0oJzWwoff1x(ggh1sv~yEL8FnNv+Ile3CxgUq+Pl&B+f!IF6n7S4>5A)X&6A-A= z@9w{Nj+e%y$G$PzYT$?)`mAAo0SbhQax#^QfJ;OQo69zAOmcEc#9?;l^RST|K}zNM zh_}K!riz)NKBtlH5(laxj`w#o0RkB}<6@A4r{)Z~rra&Bw{rd%KjPgCg@Y*t}j|zl;ber=AtPfwwk2fL?&0{WB}RQmvj9h;OX@ zH0MZD^PSVY>)ev;VXR^K0MScJzr)N>+mZQ>*0ry~uZ2%OuX^y6Z2S*~ + + + + + + + + + + + PASS + PASS + + + + + PASS + PASS + + + + + + \ No newline at end of file diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 741c394..a52a66c 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,55 @@ +2012-02-23 Philip Rogers + + Recompute font metrics on scale changes + https://bugs.webkit.org/show_bug.cgi?id=75091 + + Reviewed by Nikolas Zimmermann. + + SVG text metrics depend on the transform from renderer to the svg root + which requires that we propagate transform changes down to text. + This change adds a boolean for tracking transform changes to + SVGViewportContainers and SVGTransformableContainers, and updates + RenderSVGText::layout() to recalculate text metrics if the transform + of an ancestor has changed. + + Tests: platform/mac/svg/text/text-rescale.html + platform/mac/svg/text/text-viewbox-rescale.html + svg/text/text-rescale.html + svg/text/text-viewbox-rescale.html + + * rendering/RenderObject.h: + (WebCore::RenderObject::isSVGTransformableContainer): + (WebCore::RenderObject::isSVGViewportContainer): + * rendering/svg/RenderSVGContainer.h: + (WebCore::RenderSVGContainer::didTransformToRootUpdate): + * rendering/svg/RenderSVGInlineText.cpp: + (WebCore::RenderSVGInlineText::computeNewScaledFontForStyle): + * rendering/svg/RenderSVGText.cpp: + (WebCore::RenderSVGText::RenderSVGText): + (WebCore::RenderSVGText::layout): + * rendering/svg/RenderSVGText.h: + (WebCore::RenderSVGText::setNeedsTextMetricsUpdate): + (RenderSVGText): + * rendering/svg/RenderSVGTransformableContainer.cpp: + (WebCore::RenderSVGTransformableContainer::RenderSVGTransformableContainer): + (WebCore::RenderSVGTransformableContainer::calculateLocalTransform): + * rendering/svg/RenderSVGTransformableContainer.h: + (WebCore::RenderSVGTransformableContainer::isSVGTransformableContainer): + (WebCore::RenderSVGTransformableContainer::didTransformToRootUpdate): + (RenderSVGTransformableContainer): + * rendering/svg/RenderSVGViewportContainer.cpp: + (WebCore::RenderSVGViewportContainer::RenderSVGViewportContainer): + (WebCore::RenderSVGViewportContainer::calcViewport): + * rendering/svg/RenderSVGViewportContainer.h: + (WebCore::RenderSVGViewportContainer::didTransformToRootUpdate): + (RenderSVGViewportContainer): + * rendering/svg/SVGRenderSupport.cpp: + (WebCore::SVGRenderSupport::transformToRootChanged): + (WebCore): + (WebCore::SVGRenderSupport::layoutChildren): + * rendering/svg/SVGRenderSupport.h: + (SVGRenderSupport): + 2012-02-21 James Robinson [chromium] Notify compositor of wheel event registration via ScrollingCoordinator diff --git a/Source/WebCore/rendering/RenderObject.h b/Source/WebCore/rendering/RenderObject.h index d5f813d..5827bc8 100644 --- a/Source/WebCore/rendering/RenderObject.h +++ b/Source/WebCore/rendering/RenderObject.h @@ -387,7 +387,8 @@ public: // to add SVG renderer methods to RenderObject with an ASSERT_NOT_REACHED() default implementation. virtual bool isSVGRoot() const { return false; } virtual bool isSVGContainer() const { return false; } - virtual bool isSVGViewportContainer() const { return false; } + virtual bool isSVGTransformableContainer() const { return false; } + virtual bool isSVGViewportContainer() const { return false; } virtual bool isSVGGradientStop() const { return false; } virtual bool isSVGHiddenContainer() const { return false; } virtual bool isSVGPath() const { return false; } diff --git a/Source/WebCore/rendering/svg/RenderSVGContainer.h b/Source/WebCore/rendering/svg/RenderSVGContainer.h index c7d9f20..b332470 100644 --- a/Source/WebCore/rendering/svg/RenderSVGContainer.h +++ b/Source/WebCore/rendering/svg/RenderSVGContainer.h @@ -41,6 +41,7 @@ public: virtual void paint(PaintInfo&, const LayoutPoint&); virtual void setNeedsBoundariesUpdate() { m_needsBoundariesUpdate = true; } + virtual bool didTransformToRootUpdate() { return false; } protected: virtual RenderObjectChildList* virtualChildren() { return children(); } diff --git a/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp b/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp index 74facc3..5913162 100644 --- a/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp @@ -267,6 +267,8 @@ void RenderSVGInlineText::computeNewScaledFontForStyle(RenderObject* renderer, c } FontDescription fontDescription(style->fontDescription()); + + // FIXME: We need to better handle the case when we compute very small fonts below (below 1pt). fontDescription.setComputedSize(CSSStyleSelector::getComputedSizeFromSpecifiedSize(document, scalingFactor, fontDescription.isAbsoluteSize(), fontDescription.computedSize(), DoNotUseSmartMinimumForFontSize)); scaledFont = Font(fontDescription, 0, 0); diff --git a/Source/WebCore/rendering/svg/RenderSVGText.cpp b/Source/WebCore/rendering/svg/RenderSVGText.cpp index ebf92e5..d9cdecc 100644 --- a/Source/WebCore/rendering/svg/RenderSVGText.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGText.cpp @@ -58,6 +58,7 @@ RenderSVGText::RenderSVGText(SVGTextElement* node) , m_needsReordering(false) , m_needsPositioningValuesUpdate(true) , m_needsTransformUpdate(true) + , m_needsTextMetricsUpdate(true) { } @@ -208,11 +209,13 @@ void RenderSVGText::layout() updateCachedBoundariesInParents = true; } - // If the root layout size changed (eg. window size changes) or the positioning values change, recompute the on-screen font size. - if (SVGRenderSupport::findTreeRootObject(this)->isLayoutSizeChanged()) { + // If the root layout size changed (eg. window size changes) or the positioning values change + // or the transform to the root context has changed then recompute the on-screen font size. + if (m_needsTextMetricsUpdate || SVGRenderSupport::findTreeRootObject(this)->isLayoutSizeChanged()) { recursiveUpdateScaledFont(this); rebuildLayoutAttributes(true); updateCachedBoundariesInParents = true; + m_needsTextMetricsUpdate = false; } if (m_needsPositioningValuesUpdate) { diff --git a/Source/WebCore/rendering/svg/RenderSVGText.h b/Source/WebCore/rendering/svg/RenderSVGText.h index 8641016..7b0b5ef 100644 --- a/Source/WebCore/rendering/svg/RenderSVGText.h +++ b/Source/WebCore/rendering/svg/RenderSVGText.h @@ -41,6 +41,7 @@ public: void setNeedsPositioningValuesUpdate() { m_needsPositioningValuesUpdate = true; } virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; } + void setNeedsTextMetricsUpdate() { m_needsTextMetricsUpdate = true; } virtual FloatRect repaintRectInLocalCoordinates() const; static RenderSVGText* locateRenderSVGTextAncestor(RenderObject*); @@ -90,6 +91,7 @@ private: bool m_needsReordering : 1; bool m_needsPositioningValuesUpdate : 1; bool m_needsTransformUpdate : 1; + bool m_needsTextMetricsUpdate : 1; AffineTransform m_localTransform; SVGTextLayoutAttributesBuilder m_layoutAttributesBuilder; Vector m_layoutAttributes; diff --git a/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp b/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp index 1db6365..0a62f68 100644 --- a/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp @@ -25,6 +25,7 @@ #include "RenderSVGTransformableContainer.h" #include "SVGNames.h" +#include "SVGRenderSupport.h" #include "SVGShadowTreeElements.h" #include "SVGStyledTransformableElement.h" @@ -33,6 +34,7 @@ namespace WebCore { RenderSVGTransformableContainer::RenderSVGTransformableContainer(SVGStyledTransformableElement* node) : RenderSVGContainer(node) , m_needsTransformUpdate(true) + , m_didTransformToRootUpdate(false) { } @@ -41,6 +43,7 @@ bool RenderSVGTransformableContainer::calculateLocalTransform() SVGStyledTransformableElement* element = static_cast(node()); bool needsUpdate = m_needsTransformUpdate; + m_didTransformToRootUpdate = m_needsTransformUpdate || SVGRenderSupport::transformToRootChanged(parent()); if (needsUpdate) { m_localTransform = element->animatedLocalTransform(); m_needsTransformUpdate = false; diff --git a/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.h b/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.h index 401bfa8..c9c607b 100644 --- a/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.h +++ b/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.h @@ -31,14 +31,17 @@ class RenderSVGTransformableContainer : public RenderSVGContainer { public: explicit RenderSVGTransformableContainer(SVGStyledTransformableElement*); + virtual bool isSVGTransformableContainer() const { return true; } virtual const AffineTransform& localToParentTransform() const { return m_localTransform; } virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; } + virtual bool didTransformToRootUpdate() { return m_didTransformToRootUpdate; } private: virtual bool calculateLocalTransform(); virtual AffineTransform localTransform() const { return m_localTransform; } bool m_needsTransformUpdate : 1; + bool m_didTransformToRootUpdate : 1; AffineTransform m_localTransform; }; } diff --git a/Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp b/Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp index b223349..3e0e3e4 100644 --- a/Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp @@ -34,6 +34,7 @@ namespace WebCore { RenderSVGViewportContainer::RenderSVGViewportContainer(SVGStyledElement* node) : RenderSVGContainer(node) + , m_didTransformToRootUpdate(false) , m_isLayoutSizeChanged(false) , m_needsTransformUpdate(true) { @@ -65,6 +66,7 @@ void RenderSVGViewportContainer::calcViewport() m_viewport = FloatRect(svg->x().value(lengthContext), svg->y().value(lengthContext), svg->width().value(lengthContext), svg->height().value(lengthContext)); if (oldViewport != m_viewport) { + m_didTransformToRootUpdate = true; setNeedsBoundariesUpdate(); setNeedsTransformUpdate(); } diff --git a/Source/WebCore/rendering/svg/RenderSVGViewportContainer.h b/Source/WebCore/rendering/svg/RenderSVGViewportContainer.h index 418fcfb..b748fe6 100644 --- a/Source/WebCore/rendering/svg/RenderSVGViewportContainer.h +++ b/Source/WebCore/rendering/svg/RenderSVGViewportContainer.h @@ -36,6 +36,7 @@ public: FloatRect viewport() const { return m_viewport; } bool isLayoutSizeChanged() const { return m_isLayoutSizeChanged; } + virtual bool didTransformToRootUpdate() { return m_didTransformToRootUpdate; } virtual void determineIfLayoutSizeChanged(); virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; } @@ -56,6 +57,7 @@ private: FloatRect m_viewport; mutable AffineTransform m_localToParentTransform; + bool m_didTransformToRootUpdate : 1; bool m_isLayoutSizeChanged : 1; bool m_needsTransformUpdate : 1; }; diff --git a/Source/WebCore/rendering/svg/SVGRenderSupport.cpp b/Source/WebCore/rendering/svg/SVGRenderSupport.cpp index 4524a20..7feb88f 100644 --- a/Source/WebCore/rendering/svg/SVGRenderSupport.cpp +++ b/Source/WebCore/rendering/svg/SVGRenderSupport.cpp @@ -250,14 +250,35 @@ static inline bool layoutSizeOfNearestViewportChanged(const RenderObject* start) return toRenderSVGRoot(start)->isLayoutSizeChanged(); } +bool SVGRenderSupport::transformToRootChanged(RenderObject* ancestor) +{ + while (ancestor && !ancestor->isSVGRoot()) { + if (ancestor->isSVGTransformableContainer()) + return toRenderSVGContainer(ancestor)->didTransformToRootUpdate(); + if (ancestor->isSVGViewportContainer()) + return toRenderSVGViewportContainer(ancestor)->didTransformToRootUpdate(); + ancestor = ancestor->parent(); + } + + return false; +} + void SVGRenderSupport::layoutChildren(RenderObject* start, bool selfNeedsLayout) { bool layoutSizeChanged = layoutSizeOfNearestViewportChanged(start); + bool transformChanged = transformToRootChanged(start); HashSet notlayoutedObjects; for (RenderObject* child = start->firstChild(); child; child = child->nextSibling()) { bool needsLayout = selfNeedsLayout; + if (transformChanged) { + // If the transform changed we need to update the text metrics (note: this also happens for layoutSizeChanged=true). + if (child->isSVGText()) + toRenderSVGText(child)->setNeedsTextMetricsUpdate(); + needsLayout = true; + } + if (layoutSizeChanged) { // When selfNeedsLayout is false and the layout size changed, we have to check whether this child uses relative lengths if (SVGElement* element = child->node()->isSVGElement() ? static_cast(child->node()) : 0) { diff --git a/Source/WebCore/rendering/svg/SVGRenderSupport.h b/Source/WebCore/rendering/svg/SVGRenderSupport.h index f5280ff..c7b2fdc 100644 --- a/Source/WebCore/rendering/svg/SVGRenderSupport.h +++ b/Source/WebCore/rendering/svg/SVGRenderSupport.h @@ -72,6 +72,9 @@ public: // Shared between SVG renderers and resources. static void applyStrokeStyleToContext(GraphicsContext*, const RenderStyle*, const RenderObject*); + // Determines if any ancestor's transform has changed. + static bool transformToRootChanged(RenderObject*); + // FIXME: These methods do not belong here. static const RenderSVGRoot* findTreeRootObject(const RenderObject*); -- 2.7.4