Changeset 282379 in webkit


Ignore:
Timestamp:
Sep 13, 2021, 9:42:12 PM (4 years ago)
Author:
Simon Fraser
Message:

Fix computed style for transform-origin on SVG boxes
https://bugs.webkit.org/show_bug.cgi?id=230172

Reviewed by Alan Bujtas.

LayoutTests/imported/w3c:

  • web-platform-tests/css/css-transforms/transform-origin-014-expected.txt:

Source/WebCore:

When getting the computed value for transform-origin on SVG boxes, we need to get
the appropriate "reference box" from the renderer. Do minor refactoring to share
code between rendering and computed style for SVG and non-SVG boxes.

Tested by imported/w3c/web-platform-tests/css/css-transforms/transform-origin-014.html

  • css/CSSComputedStyleDeclaration.cpp:

(WebCore::transformReferenceBox):
(WebCore::ComputedStyleExtractor::valueForPropertyInStyle):

  • rendering/RenderLayer.cpp:

(WebCore::transformBoxToCSSBoxType): Deleted.

  • rendering/style/RenderStyleConstants.cpp:

(WebCore::transformBoxToCSSBoxType):

  • rendering/style/RenderStyleConstants.h:
  • rendering/svg/SVGRenderSupport.cpp:

(WebCore::SVGRenderSupport::transformReferenceBox):

  • rendering/svg/SVGRenderSupport.h:
  • svg/SVGGraphicsElement.cpp:

(WebCore::SVGGraphicsElement::animatedLocalTransform const):

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r282362 r282379  
     12021-09-13  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Fix computed style for transform-origin on SVG boxes
     4        https://bugs.webkit.org/show_bug.cgi?id=230172
     5
     6        Reviewed by Alan Bujtas.
     7
     8        * web-platform-tests/css/css-transforms/transform-origin-014-expected.txt:
     9
    1102021-09-13  Youenn Fablet  <youenn@apple.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/transform-origin-014-expected.txt

    r282287 r282379  
    11
    2 FAIL Percentage 'transform-origin' with 'fill-box' transform-box assert_equals: expected "50px 50px" but got "0px 0px"
    3 FAIL Percentage 'transform-origin' with 'view-box' transform-box assert_equals: expected "150px 75px" but got "0px 0px"
    4 FAIL Percentage 'transform-origin' with 'view-box' transform-box in nested <svg> with 'viewBox' assert_equals: expected "25px 25px" but got "0px 0px"
    5 FAIL Percentage 'transform-origin' with 'view-box' transform-box in nested <svg> without 'viewBox' assert_equals: expected "50px 50px" but got "0px 0px"
     2PASS Percentage 'transform-origin' with 'fill-box' transform-box
     3PASS Percentage 'transform-origin' with 'view-box' transform-box
     4PASS Percentage 'transform-origin' with 'view-box' transform-box in nested <svg> with 'viewBox'
     5PASS Percentage 'transform-origin' with 'view-box' transform-box in nested <svg> without 'viewBox'
    66
  • trunk/Source/WebCore/ChangeLog

    r282377 r282379  
     12021-09-13  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Fix computed style for transform-origin on SVG boxes
     4        https://bugs.webkit.org/show_bug.cgi?id=230172
     5
     6        Reviewed by Alan Bujtas.
     7
     8        When getting the computed value for transform-origin on SVG boxes, we need to get
     9        the appropriate "reference box" from the renderer. Do minor refactoring to share
     10        code between rendering and computed style for SVG and non-SVG boxes.
     11
     12        Tested by imported/w3c/web-platform-tests/css/css-transforms/transform-origin-014.html
     13
     14        * css/CSSComputedStyleDeclaration.cpp:
     15        (WebCore::transformReferenceBox):
     16        (WebCore::ComputedStyleExtractor::valueForPropertyInStyle):
     17        * rendering/RenderLayer.cpp:
     18        (WebCore::transformBoxToCSSBoxType): Deleted.
     19        * rendering/style/RenderStyleConstants.cpp:
     20        (WebCore::transformBoxToCSSBoxType):
     21        * rendering/style/RenderStyleConstants.h:
     22        * rendering/svg/SVGRenderSupport.cpp:
     23        (WebCore::SVGRenderSupport::transformReferenceBox):
     24        * rendering/svg/SVGRenderSupport.h:
     25        * svg/SVGGraphicsElement.cpp:
     26        (WebCore::SVGGraphicsElement::animatedLocalTransform const):
     27
    1282021-09-13  Chris Dumez  <cdumez@apple.com>
    229
  • trunk/Source/WebCore/css/CSSComputedStyleDeclaration.cpp

    r282315 r282379  
    6666#include "RenderStyle.h"
    6767#include "SVGElement.h"
     68#include "SVGRenderSupport.h"
    6869#include "Settings.h"
    6970#include "ShapeValue.h"
     
    557558    auto& box = downcast<RenderBox>(renderer);
    558559    return box.style().boxSizing() == BoxSizing::BorderBox ? box.borderBoxRect() : box.computedCSSContentBoxRect();
     560}
     561
     562static FloatRect transformReferenceBox(const RenderStyle& style, const RenderElement& renderer)
     563{
     564    if (is<RenderBox>(renderer))
     565        return downcast<RenderBox>(renderer).referenceBox(transformBoxToCSSBoxType(style.transformBox()));
     566
     567    if (is<SVGElement>(renderer.element()))
     568        return SVGRenderSupport::transformReferenceBox(renderer, downcast<SVGElement>(*renderer.element()), style);
     569
     570    return { };
    559571}
    560572
     
    35833595            auto list = CSSValueList::createSpaceSeparated();
    35843596            if (renderer) {
    3585                 LayoutRect box;
    3586                 if (is<RenderBox>(*renderer))
    3587                     box = downcast<RenderBox>(*renderer).borderBoxRect();
    3588 
     3597                auto box = transformReferenceBox(style, *renderer);
    35893598                list->append(zoomAdjustedPixelValue(minimumValueForLength(style.perspectiveOriginX(), box.width()), style));
    35903599                list->append(zoomAdjustedPixelValue(minimumValueForLength(style.perspectiveOriginY(), box.height()), style));
     
    36423651            auto list = CSSValueList::createSpaceSeparated();
    36433652            if (renderer) {
    3644                 LayoutRect box;
    3645                 if (is<RenderBox>(*renderer))
    3646                     box = downcast<RenderBox>(*renderer).borderBoxRect();
    3647 
     3653                auto box = transformReferenceBox(style, *renderer);
    36483654                list->append(zoomAdjustedPixelValue(minimumValueForLength(style.transformOriginX(), box.width()), style));
    36493655                list->append(zoomAdjustedPixelValue(minimumValueForLength(style.transformOriginY(), box.height()), style));
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r281967 r282379  
    12571257}
    12581258
    1259 static inline CSSBoxType transformBoxToCSSBoxType(TransformBox transformBox)
    1260 {
    1261     switch (transformBox) {
    1262     case TransformBox::StrokeBox:
    1263         return CSSBoxType::StrokeBox;
    1264     case TransformBox::ContentBox:
    1265         return CSSBoxType::ContentBox;
    1266     case TransformBox::BorderBox:
    1267         return CSSBoxType::BorderBox;
    1268     case TransformBox::FillBox:
    1269         return CSSBoxType::FillBox;
    1270     case TransformBox::ViewBox:
    1271         return CSSBoxType::ViewBox;
    1272     default:
    1273         ASSERT_NOT_REACHED();
    1274         return CSSBoxType::BorderBox;
    1275     }
    1276 }
    1277 
    12781259void RenderLayer::updateTransform()
    12791260{
  • trunk/Source/WebCore/rendering/style/RenderStyleConstants.cpp

    r282143 r282379  
    13091309}
    13101310
     1311CSSBoxType transformBoxToCSSBoxType(TransformBox transformBox)
     1312{
     1313    switch (transformBox) {
     1314    case TransformBox::StrokeBox:
     1315        return CSSBoxType::StrokeBox;
     1316    case TransformBox::ContentBox:
     1317        return CSSBoxType::ContentBox;
     1318    case TransformBox::BorderBox:
     1319        return CSSBoxType::BorderBox;
     1320    case TransformBox::FillBox:
     1321        return CSSBoxType::FillBox;
     1322    case TransformBox::ViewBox:
     1323        return CSSBoxType::ViewBox;
     1324    default:
     1325        ASSERT_NOT_REACHED();
     1326        return CSSBoxType::BorderBox;
     1327    }
     1328}
     1329
    13111330const float defaultMiterLimit = 4;
    13121331
  • trunk/Source/WebCore/rendering/style/RenderStyleConstants.h

    r282143 r282379  
    12461246    Size     = 1 << 2,
    12471247};
     1248
     1249CSSBoxType transformBoxToCSSBoxType(TransformBox);
    12481250
    12491251extern const float defaultMiterLimit;
  • trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp

    r281239 r282379  
    336336}
    337337
     338FloatRect SVGRenderSupport::transformReferenceBox(const RenderElement& renderer, const SVGElement& element, const RenderStyle& style)
     339{
     340    switch (style.transformBox()) {
     341    case TransformBox::BorderBox:
     342        // For SVG elements without an associated CSS layout box, the used value for border-box is stroke-box.
     343    case TransformBox::StrokeBox:
     344        return renderer.strokeBoundingBox();
     345    case TransformBox::ContentBox:
     346        // For SVG elements without an associated CSS layout box, the used value for content-box is fill-box.
     347    case TransformBox::FillBox:
     348        return renderer.objectBoundingBox();
     349    case TransformBox::ViewBox: {
     350        FloatSize viewportSize;
     351        SVGLengthContext(&element).determineViewport(viewportSize);
     352        return FloatRect { { }, viewportSize };
     353        }
     354    }
     355    return { };
     356}
     357
    338358inline FloatRect clipPathReferenceBox(const RenderElement& renderer, CSSBoxType boxType)
    339359{
  • trunk/Source/WebCore/rendering/svg/SVGRenderSupport.h

    r278253 r282379  
    3939class RenderStyle;
    4040class RenderSVGRoot;
     41class SVGElement;
    4142class TransformState;
    4243
     
    8182
    8283    static void styleChanged(RenderElement&, const RenderStyle*);
     84   
     85    static FloatRect transformReferenceBox(const RenderElement&, const SVGElement&, const RenderStyle&);
    8386
    8487#if ENABLE(CSS_COMPOSITING)
  • trunk/Source/WebCore/svg/SVGGraphicsElement.cpp

    r267985 r282379  
    2929#include "SVGPathData.h"
    3030#include "SVGRect.h"
     31#include "SVGRenderSupport.h"
    3132#include "SVGSVGElement.h"
    3233#include "SVGStringList.h"
     
    8081    // Honor any of the transform-related CSS properties if set.
    8182    if (hasSpecifiedTransform || (style && (style->translate() || style->scale() || style->rotate()))) {
    82 
    83         FloatRect boundingBox;
    84         switch (style->transformBox()) {
    85         case TransformBox::BorderBox:
    86             // For SVG elements without an associated CSS layout box, the used value for border-box is stroke-box.
    87         case TransformBox::StrokeBox:
    88             boundingBox = renderer()->strokeBoundingBox();
    89             break;
    90         case TransformBox::ContentBox:
    91             // For SVG elements without an associated CSS layout box, the used value for content-box is fill-box.
    92         case TransformBox::FillBox:
    93             boundingBox = renderer()->objectBoundingBox();
    94             break;
    95         case TransformBox::ViewBox: {
    96             FloatSize viewportSize;
    97             SVGLengthContext(this).determineViewport(viewportSize);
    98             boundingBox.setSize(viewportSize);
    99             break;
    100             }
    101         }
     83        auto boundingBox = SVGRenderSupport::transformReferenceBox(*renderer(), *this, *style);
    10284       
    10385        // Note: objectBoundingBox is an emptyRect for elements like pattern or clipPath.
     
    11597            matrix.setF(matrix.f() / zoom);
    11698        }
    117 
    11899    }
    119100
Note: See TracChangeset for help on using the changeset viewer.