Changeset 108699 in webkit


Ignore:
Timestamp:
Feb 23, 2012 4:52:35 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Recompute font metrics on scale changes
https://bugs.webkit.org/show_bug.cgi?id=75091

Patch by Philip Rogers <pdr@google.com> 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.
Location:
trunk
Files:
16 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r108697 r108699  
     12012-02-23  Philip Rogers  <pdr@google.com>
     2
     3        Recompute font metrics on scale changes
     4        https://bugs.webkit.org/show_bug.cgi?id=75091
     5
     6        Reviewed by Nikolas Zimmermann.
     7
     8        * platform/chromium-linux/svg/text/text-rescale-expected.png: Added.
     9        * platform/chromium-linux/svg/text/text-rescale-expected.txt: Added.
     10        * platform/chromium-linux/svg/text/text-viewbox-rescale-expected.png: Added.
     11        * platform/chromium-linux/svg/text/text-viewbox-rescale-expected.txt: Added.
     12        * platform/chromium/test_expectations.txt:
     13        * platform/mac/svg/text/text-rescale-expected.png: Added.
     14        * platform/mac/svg/text/text-rescale-expected.txt: Added.
     15        * platform/mac/svg/text/text-rescale.html: Added.
     16        * platform/mac/svg/text/text-viewbox-rescale-expected.png: Added.
     17        * platform/mac/svg/text/text-viewbox-rescale-expected.txt: Added.
     18        * platform/mac/svg/text/text-viewbox-rescale.html: Added.
     19        * svg/text/text-rescale-expected.png: Added.
     20        * svg/text/text-rescale-expected.txt: Added.
     21        * svg/text/text-rescale.html: Added.
     22        * svg/text/text-viewbox-rescale-expected.png: Added.
     23        * svg/text/text-viewbox-rescale-expected.txt: Added.
     24        * svg/text/text-viewbox-rescale.html: Added.
     25
    1262012-02-23  Adrienne Walker  <enne@google.com>
    227
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r108697 r108699  
    42074207BUGWK79239 : http/tests/media/video-referer.html = FAIL
    42084208
     4209// Need rebaselining after bug 75091
     4210BUGWK75091 SKIP : svg/carto.net/tabgroup.svg = FAIL
     4211BUGWK75091 SKIP : svg/carto.net/window.svg = FAIL
     4212BUGWK75091 SKIP : svg/custom/js-late-clipPath-and-object-creation.svg = FAIL
     4213BUGWK75091 SKIP : svg/custom/js-late-gradient-and-object-creation.svg = FAIL
     4214BUGWK75091 SKIP : svg/custom/js-late-pattern-and-object-creation.svg = FAIL
     4215BUGWK75091 SKIP : svg/custom/text-ctm.svg = FAIL
     4216BUGWK75091 SKIP : svg/custom/use-detach.svg = FAIL
     4217BUGWK75091 SKIP : svg/hixie/perf/003.xml = FAIL
     4218
    42094219// Asserting in debug builds since r108506
    42104220BUGWK79229 WIN LINUX DEBUG : http/tests/inspector/console-xhr-logging-async.html = CRASH
  • trunk/Source/WebCore/ChangeLog

    r108698 r108699  
     12012-02-23  Philip Rogers  <pdr@google.com>
     2
     3        Recompute font metrics on scale changes
     4        https://bugs.webkit.org/show_bug.cgi?id=75091
     5
     6        Reviewed by Nikolas Zimmermann.
     7
     8        SVG text metrics depend on the transform from renderer to the svg root
     9        which requires that we propagate transform changes down to text.
     10        This change adds a boolean for tracking transform changes to
     11        SVGViewportContainers and SVGTransformableContainers, and updates
     12        RenderSVGText::layout() to recalculate text metrics if the transform
     13        of an ancestor has changed.
     14
     15        Tests: platform/mac/svg/text/text-rescale.html
     16               platform/mac/svg/text/text-viewbox-rescale.html
     17               svg/text/text-rescale.html
     18               svg/text/text-viewbox-rescale.html
     19
     20        * rendering/RenderObject.h:
     21        (WebCore::RenderObject::isSVGTransformableContainer):
     22        (WebCore::RenderObject::isSVGViewportContainer):
     23        * rendering/svg/RenderSVGContainer.h:
     24        (WebCore::RenderSVGContainer::didTransformToRootUpdate):
     25        * rendering/svg/RenderSVGInlineText.cpp:
     26        (WebCore::RenderSVGInlineText::computeNewScaledFontForStyle):
     27        * rendering/svg/RenderSVGText.cpp:
     28        (WebCore::RenderSVGText::RenderSVGText):
     29        (WebCore::RenderSVGText::layout):
     30        * rendering/svg/RenderSVGText.h:
     31        (WebCore::RenderSVGText::setNeedsTextMetricsUpdate):
     32        (RenderSVGText):
     33        * rendering/svg/RenderSVGTransformableContainer.cpp:
     34        (WebCore::RenderSVGTransformableContainer::RenderSVGTransformableContainer):
     35        (WebCore::RenderSVGTransformableContainer::calculateLocalTransform):
     36        * rendering/svg/RenderSVGTransformableContainer.h:
     37        (WebCore::RenderSVGTransformableContainer::isSVGTransformableContainer):
     38        (WebCore::RenderSVGTransformableContainer::didTransformToRootUpdate):
     39        (RenderSVGTransformableContainer):
     40        * rendering/svg/RenderSVGViewportContainer.cpp:
     41        (WebCore::RenderSVGViewportContainer::RenderSVGViewportContainer):
     42        (WebCore::RenderSVGViewportContainer::calcViewport):
     43        * rendering/svg/RenderSVGViewportContainer.h:
     44        (WebCore::RenderSVGViewportContainer::didTransformToRootUpdate):
     45        (RenderSVGViewportContainer):
     46        * rendering/svg/SVGRenderSupport.cpp:
     47        (WebCore::SVGRenderSupport::transformToRootChanged):
     48        (WebCore):
     49        (WebCore::SVGRenderSupport::layoutChildren):
     50        * rendering/svg/SVGRenderSupport.h:
     51        (SVGRenderSupport):
     52
    1532012-02-21  James Robinson  <jamesr@chromium.org>
    254
  • trunk/Source/WebCore/rendering/RenderObject.h

    r108606 r108699  
    388388    virtual bool isSVGRoot() const { return false; }
    389389    virtual bool isSVGContainer() const { return false; }
    390     virtual bool isSVGViewportContainer() const { return false; }
     390    virtual bool isSVGTransformableContainer() const { return false; }
     391    virtual bool isSVGViewportContainer() const { return false; }
    391392    virtual bool isSVGGradientStop() const { return false; }
    392393    virtual bool isSVGHiddenContainer() const { return false; }
  • trunk/Source/WebCore/rendering/svg/RenderSVGContainer.h

    r107108 r108699  
    4242    virtual void paint(PaintInfo&, const LayoutPoint&);
    4343    virtual void setNeedsBoundariesUpdate() { m_needsBoundariesUpdate = true; }
     44    virtual bool didTransformToRootUpdate() { return false; }
    4445
    4546protected:
  • trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp

    r105224 r108699  
    268268
    269269    FontDescription fontDescription(style->fontDescription());
     270
     271    // FIXME: We need to better handle the case when we compute very small fonts below (below 1pt).
    270272    fontDescription.setComputedSize(CSSStyleSelector::getComputedSizeFromSpecifiedSize(document, scalingFactor, fontDescription.isAbsoluteSize(), fontDescription.computedSize(), DoNotUseSmartMinimumForFontSize));
    271273
  • trunk/Source/WebCore/rendering/svg/RenderSVGText.cpp

    r105143 r108699  
    5959    , m_needsPositioningValuesUpdate(true)
    6060    , m_needsTransformUpdate(true)
     61    , m_needsTextMetricsUpdate(true)
    6162{
    6263}
     
    209210    }
    210211
    211     // If the root layout size changed (eg. window size changes) or the positioning values change, recompute the on-screen font size.
    212     if (SVGRenderSupport::findTreeRootObject(this)->isLayoutSizeChanged()) {
     212    // If the root layout size changed (eg. window size changes) or the positioning values change
     213    // or the transform to the root context has changed then recompute the on-screen font size.
     214    if (m_needsTextMetricsUpdate || SVGRenderSupport::findTreeRootObject(this)->isLayoutSizeChanged()) {
    213215        recursiveUpdateScaledFont(this);
    214216        rebuildLayoutAttributes(true);
    215217        updateCachedBoundariesInParents = true;
     218        m_needsTextMetricsUpdate = false;
    216219    }
    217220
  • trunk/Source/WebCore/rendering/svg/RenderSVGText.h

    r105143 r108699  
    4242    void setNeedsPositioningValuesUpdate() { m_needsPositioningValuesUpdate = true; }
    4343    virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; }
     44    void setNeedsTextMetricsUpdate() { m_needsTextMetricsUpdate = true; }
    4445    virtual FloatRect repaintRectInLocalCoordinates() const;
    4546
     
    9192    bool m_needsPositioningValuesUpdate : 1;
    9293    bool m_needsTransformUpdate : 1;
     94    bool m_needsTextMetricsUpdate : 1;
    9395    AffineTransform m_localTransform;
    9496    SVGTextLayoutAttributesBuilder m_layoutAttributesBuilder;
  • trunk/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.cpp

    r91644 r108699  
    2626
    2727#include "SVGNames.h"
     28#include "SVGRenderSupport.h"
    2829#include "SVGShadowTreeElements.h"
    2930#include "SVGStyledTransformableElement.h"
     
    3435    : RenderSVGContainer(node)
    3536    , m_needsTransformUpdate(true)
     37    , m_didTransformToRootUpdate(false)
    3638{
    3739}
     
    4244
    4345    bool needsUpdate = m_needsTransformUpdate;
     46    m_didTransformToRootUpdate = m_needsTransformUpdate || SVGRenderSupport::transformToRootChanged(parent());
    4447    if (needsUpdate) {
    4548        m_localTransform = element->animatedLocalTransform();
  • trunk/Source/WebCore/rendering/svg/RenderSVGTransformableContainer.h

    r75350 r108699  
    3232    explicit RenderSVGTransformableContainer(SVGStyledTransformableElement*);
    3333
     34    virtual bool isSVGTransformableContainer() const { return true; }
    3435    virtual const AffineTransform& localToParentTransform() const { return m_localTransform; }
    3536    virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; }
     37    virtual bool didTransformToRootUpdate() { return m_didTransformToRootUpdate; }
    3638
    3739private:
     
    4042
    4143    bool m_needsTransformUpdate : 1;
     44    bool m_didTransformToRootUpdate : 1;
    4245    AffineTransform m_localTransform;
    4346};
  • trunk/Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp

    r107893 r108699  
    3535RenderSVGViewportContainer::RenderSVGViewportContainer(SVGStyledElement* node)
    3636    : RenderSVGContainer(node)
     37    , m_didTransformToRootUpdate(false)
    3738    , m_isLayoutSizeChanged(false)
    3839    , m_needsTransformUpdate(true)
     
    6667
    6768    if (oldViewport != m_viewport) {
     69        m_didTransformToRootUpdate = true;
    6870        setNeedsBoundariesUpdate();
    6971        setNeedsTransformUpdate();
  • trunk/Source/WebCore/rendering/svg/RenderSVGViewportContainer.h

    r107893 r108699  
    3737
    3838    bool isLayoutSizeChanged() const { return m_isLayoutSizeChanged; }
     39    virtual bool didTransformToRootUpdate() { return m_didTransformToRootUpdate; }
    3940
    4041    virtual void determineIfLayoutSizeChanged();
     
    5758    FloatRect m_viewport;
    5859    mutable AffineTransform m_localToParentTransform;
     60    bool m_didTransformToRootUpdate : 1;
    5961    bool m_isLayoutSizeChanged : 1;
    6062    bool m_needsTransformUpdate : 1;
  • trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp

    r108537 r108699  
    251251}
    252252
     253bool SVGRenderSupport::transformToRootChanged(RenderObject* ancestor)
     254{
     255    while (ancestor && !ancestor->isSVGRoot()) {
     256        if (ancestor->isSVGTransformableContainer())
     257            return toRenderSVGContainer(ancestor)->didTransformToRootUpdate();
     258        if (ancestor->isSVGViewportContainer())
     259            return toRenderSVGViewportContainer(ancestor)->didTransformToRootUpdate();
     260        ancestor = ancestor->parent();
     261    }
     262
     263    return false;
     264}
     265
    253266void SVGRenderSupport::layoutChildren(RenderObject* start, bool selfNeedsLayout)
    254267{
    255268    bool layoutSizeChanged = layoutSizeOfNearestViewportChanged(start);
     269    bool transformChanged = transformToRootChanged(start);
    256270    HashSet<RenderObject*> notlayoutedObjects;
    257271
    258272    for (RenderObject* child = start->firstChild(); child; child = child->nextSibling()) {
    259273        bool needsLayout = selfNeedsLayout;
     274
     275        if (transformChanged) {
     276            // If the transform changed we need to update the text metrics (note: this also happens for layoutSizeChanged=true).
     277            if (child->isSVGText())
     278                toRenderSVGText(child)->setNeedsTextMetricsUpdate();
     279            needsLayout = true;
     280        }
    260281
    261282        if (layoutSizeChanged) {
  • trunk/Source/WebCore/rendering/svg/SVGRenderSupport.h

    r101342 r108699  
    7373    static void applyStrokeStyleToContext(GraphicsContext*, const RenderStyle*, const RenderObject*);
    7474
     75    // Determines if any ancestor's transform has changed.
     76    static bool transformToRootChanged(RenderObject*);
     77
    7578    // FIXME: These methods do not belong here.
    7679    static const RenderSVGRoot* findTreeRootObject(const RenderObject*);
Note: See TracChangeset for help on using the changeset viewer.