Chromium Code Reviews| Index: third_party/WebKit/Source/core/svg/SVGSVGElement.cpp |
| diff --git a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp |
| index 68d551d29d35d878f93c6b25ebf84467fd95ef1c..80aa89457d97d9a038f7188a390fa88bb6b1b73b 100644 |
| --- a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp |
| +++ b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp |
| @@ -567,6 +567,13 @@ bool SVGSVGElement::selfHasRelativeLengths() const |
| || m_height->currentValue()->isRelative(); |
| } |
| +bool SVGSVGElement::shouldSynthesizeViewBox() const |
| +{ |
| + return layoutObject() |
| + && layoutObject()->isSVGRoot() |
| + && toLayoutSVGRoot(layoutObject())->isEmbeddedThroughSVGImage(); |
| +} |
| + |
| FloatRect SVGSVGElement::currentViewBoxRect() const |
|
davve
2016/09/01 17:46:42
I bothers me a bit that currentViewBoxRect() may r
fs
2016/09/01 17:57:24
Yeah, I noticed this too... Did feel that I should
|
| { |
| if (m_useCurrentView) { |
| @@ -577,14 +584,33 @@ FloatRect SVGSVGElement::currentViewBoxRect() const |
| FloatRect useViewBox = viewBox()->currentValue()->value(); |
| if (!useViewBox.isEmpty()) |
| return useViewBox; |
| - if (!layoutObject() || !layoutObject()->isSVGRoot()) |
| - return FloatRect(); |
| - if (!toLayoutSVGRoot(layoutObject())->isEmbeddedThroughSVGImage()) |
| + if (!shouldSynthesizeViewBox()) |
| return FloatRect(); |
| // If no viewBox is specified but non-relative width/height values, then we |
| // should always synthesize a viewBox if we're embedded through a SVGImage. |
| - return FloatRect(FloatPoint(), FloatSize(intrinsicWidth(), intrinsicHeight())); |
| + FloatSize synthesizedViewBoxSize(intrinsicWidth(), intrinsicHeight()); |
| + if (!hasIntrinsicWidth()) |
| + synthesizedViewBoxSize.setWidth(width()->currentValue()->scaleByPercentage(currentViewportSize().width())); |
|
davve
2016/09/01 17:46:42
So a <svg .. width="50%" height="50%"> would produ
fs
2016/09/01 17:57:24
Yeah, maybe a bit odd, but I guess it could make s
|
| + if (!hasIntrinsicHeight()) |
| + synthesizedViewBoxSize.setHeight(height()->currentValue()->scaleByPercentage(currentViewportSize().height())); |
| + return FloatRect(FloatPoint(), synthesizedViewBoxSize); |
| +} |
| + |
| +SVGPreserveAspectRatio* SVGSVGElement::currentPreserveAspectRatio() const |
| +{ |
| + if (m_useCurrentView) { |
| + DCHECK(m_viewSpec); |
| + return m_viewSpec->preserveAspectRatio()->currentValue(); |
| + } |
| + if (!viewBox()->currentValue()->isValid() && shouldSynthesizeViewBox()) { |
| + // If no viewBox is specified and we're embedded through SVGImage, then |
| + // synthesize a pAR with the value 'none'. |
| + SVGPreserveAspectRatio* synthesizedPAR = SVGPreserveAspectRatio::create(); |
| + synthesizedPAR->setAlign(SVGPreserveAspectRatio::kSvgPreserveaspectratioNone); |
| + return synthesizedPAR; |
| + } |
| + return preserveAspectRatio()->currentValue(); |
| } |
| FloatSize SVGSVGElement::currentViewportSize() const |
| @@ -631,11 +657,11 @@ float SVGSVGElement::intrinsicHeight() const |
| AffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float viewHeight) const |
| { |
| + AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), currentPreserveAspectRatio(), viewWidth, viewHeight); |
| if (!m_useCurrentView) |
| - return SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), preserveAspectRatio()->currentValue(), viewWidth, viewHeight); |
| + return ctm; |
| DCHECK(m_viewSpec); |
| - AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), m_viewSpec->preserveAspectRatio()->currentValue(), viewWidth, viewHeight); |
| SVGTransformList* transformList = m_viewSpec->transform(); |
| if (transformList->isEmpty()) |
| return ctm; |