Chromium Code Reviews| Index: third_party/WebKit/Source/core/svg/SVGElement.cpp |
| diff --git a/third_party/WebKit/Source/core/svg/SVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGElement.cpp |
| index 821591b0f41d800f42c13f19a0c9bc70e0b4a03b..b1887fcbab5f0b9a06a63dfdc4da09422bd91442 100644 |
| --- a/third_party/WebKit/Source/core/svg/SVGElement.cpp |
| +++ b/third_party/WebKit/Source/core/svg/SVGElement.cpp |
| @@ -316,6 +316,30 @@ static inline bool transformUsesBoxSize( |
| return false; |
| } |
| +static FloatRect computeTransformReferenceBox(const SVGElement& element) { |
| + const LayoutObject& layoutObject = *element.layoutObject(); |
| + const ComputedStyle& style = layoutObject.styleRef(); |
| + if (!RuntimeEnabledFeatures::cssTransformBoxEnabled()) { |
| + FloatRect referenceBox = layoutObject.objectBoundingBox(); |
| + // Set the reference origin to zero when transform-origin (x/y) has a |
| + // non-percentage unit. |
| + const TransformOrigin& transformOrigin = style.transformOrigin(); |
| + if (transformOrigin.x().type() != Percent) |
| + referenceBox.setX(0); |
| + if (transformOrigin.y().type() != Percent) |
| + referenceBox.setY(0); |
| + return referenceBox; |
| + } |
| + if (style.transformBox() == ETransformBox::kFillBox) |
|
pdr.
2017/04/04 22:47:13
I was looking at Gecko's implementation and they a
fs
2017/04/05 08:48:17
I've not managed to find any relevant minutes abou
|
| + return layoutObject.objectBoundingBox(); |
| + DCHECK(style.transformBox() == ETransformBox::kBorderBox || |
| + style.transformBox() == ETransformBox::kViewBox); |
| + SVGLengthContext lengthContext(&element); |
| + FloatSize viewportSize; |
| + lengthContext.determineViewport(viewportSize); |
| + return FloatRect(FloatPoint(), viewportSize); |
| +} |
| + |
| AffineTransform SVGElement::calculateTransform( |
| ApplyMotionTransform applyMotionTransform) const { |
| const ComputedStyle* style = |
| @@ -325,16 +349,13 @@ AffineTransform SVGElement::calculateTransform( |
| // set). |
| AffineTransform matrix; |
| if (style && style->hasTransform()) { |
| - TransformationMatrix transform; |
| - float zoom = style->effectiveZoom(); |
| - |
| - FloatRect boundingBox = layoutObject()->objectBoundingBox(); |
| + FloatRect referenceBox = computeTransformReferenceBox(*this); |
| ComputedStyle::ApplyTransformOrigin applyTransformOrigin = |
| ComputedStyle::IncludeTransformOrigin; |
| // SVGTextElements need special handling for the text positioning code. |
| if (isSVGTextElement(this)) { |
| // Do not take into account transform-origin, or percentage values. |
| - boundingBox = FloatRect(); |
| + referenceBox = FloatRect(); |
| applyTransformOrigin = ComputedStyle::ExcludeTransformOrigin; |
| } |
| @@ -344,7 +365,7 @@ AffineTransform SVGElement::calculateTransform( |
| // CSS transforms operate with pre-scaled lengths. To make this work with |
| // SVG (which applies the zoom factor globally, at the root level) we |
| // |
| - // * pre-scale the bounding box (to bring it into the same space as the |
| + // * pre-scale the reference box (to bring it into the same space as the |
| // other CSS values) |
| // * invert the zoom factor (to effectively compute the CSS transform |
| // under a 1.0 zoom) |
| @@ -352,17 +373,19 @@ AffineTransform SVGElement::calculateTransform( |
| // Note: objectBoundingBox is an emptyRect for elements like pattern or |
| // clipPath. See the "Object bounding box units" section of |
| // http://dev.w3.org/csswg/css3-transforms/ |
| + float zoom = style->effectiveZoom(); |
| + TransformationMatrix transform; |
| if (zoom != 1) { |
| - boundingBox.scale(zoom); |
| + referenceBox.scale(zoom); |
| transform.scale(1 / zoom); |
| style->applyTransform( |
| - transform, boundingBox, applyTransformOrigin, |
| + transform, referenceBox, applyTransformOrigin, |
| ComputedStyle::IncludeMotionPath, |
| ComputedStyle::IncludeIndependentTransformProperties); |
| transform.scale(zoom); |
| } else { |
| style->applyTransform( |
| - transform, boundingBox, applyTransformOrigin, |
| + transform, referenceBox, applyTransformOrigin, |
| ComputedStyle::IncludeMotionPath, |
| ComputedStyle::IncludeIndependentTransformProperties); |
| } |