| Index: third_party/WebKit/Source/core/layout/LayoutReplaced.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp
|
| index 9927165b5ff21d6026cd904158b53076501f6f72..be5b49af4ab988464ea051cde1bd21dac8e0bb4f 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp
|
| @@ -159,14 +159,14 @@ void LayoutReplaced::computeIntrinsicSizingInfoForLayoutBox(LayoutBox* contentLa
|
| // Update our intrinsic size to match what the content layoutObject has computed, so that when we
|
| // constrain the size below, the correct intrinsic size will be obtained for comparison against
|
| // min and max widths.
|
| - if (intrinsicSizingInfo.aspectRatio && !intrinsicSizingInfo.size.isEmpty())
|
| + if (!intrinsicSizingInfo.aspectRatio.isEmpty() && !intrinsicSizingInfo.size.isEmpty())
|
| m_intrinsicSize = LayoutSize(intrinsicSizingInfo.size);
|
|
|
| if (!isHorizontalWritingMode())
|
| intrinsicSizingInfo.transpose();
|
| } else {
|
| computeIntrinsicSizingInfo(intrinsicSizingInfo);
|
| - if (intrinsicSizingInfo.aspectRatio && !intrinsicSizingInfo.size.isEmpty())
|
| + if (!intrinsicSizingInfo.aspectRatio.isEmpty() && !intrinsicSizingInfo.size.isEmpty())
|
| m_intrinsicSize = LayoutSize(isHorizontalWritingMode() ? intrinsicSizingInfo.size : intrinsicSizingInfo.size.transposedSize());
|
| }
|
| }
|
| @@ -177,8 +177,9 @@ FloatSize LayoutReplaced::constrainIntrinsicSizeToMinMax(const IntrinsicSizingIn
|
| // axis. So for example a maximum width that shrinks our width will result in the height we compute here having
|
| // to shrink in order to preserve the aspect ratio. Because we compute these values independently along each
|
| // axis, the final returned size may in fact not preserve the aspect ratio.
|
| + // TODO(davve): Investigate using only the intrinsic aspect ratio here.
|
| FloatSize constrainedSize = intrinsicSizingInfo.size;
|
| - if (intrinsicSizingInfo.aspectRatio && !intrinsicSizingInfo.size.isEmpty() && style()->logicalWidth().isAuto() && style()->logicalHeight().isAuto()) {
|
| + if (!intrinsicSizingInfo.aspectRatio.isEmpty() && !intrinsicSizingInfo.size.isEmpty() && style()->logicalWidth().isAuto() && style()->logicalHeight().isAuto()) {
|
| // We can't multiply or divide by 'intrinsicSizingInfo.aspectRatio' here, it breaks tests, like fast/images/zoomed-img-size.html, which
|
| // can only be fixed once subpixel precision is available for things like intrinsicWidth/Height - which include zoom!
|
| constrainedSize.setWidth(LayoutBox::computeReplacedLogicalHeight() * intrinsicSizingInfo.size.width() / intrinsicSizingInfo.size.height());
|
| @@ -537,7 +538,17 @@ void LayoutReplaced::computeIntrinsicSizingInfo(IntrinsicSizingInfo& intrinsicSi
|
| if (intrinsicSizingInfo.size.isEmpty() || !layoutObjectHasAspectRatio(this))
|
| return;
|
|
|
| - intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size.width() / intrinsicSizingInfo.size.height();
|
| + intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size;
|
| +}
|
| +
|
| +static inline LayoutUnit resolveWidthForRatio(LayoutUnit height, const FloatSize& aspectRatio)
|
| +{
|
| + return LayoutUnit(height * aspectRatio.width() / aspectRatio.height());
|
| +}
|
| +
|
| +static inline LayoutUnit resolveHeightForRatio(LayoutUnit width, const FloatSize& aspectRatio)
|
| +{
|
| + return LayoutUnit(width * aspectRatio.height() / aspectRatio.width());
|
| }
|
|
|
| LayoutUnit LayoutReplaced::computeReplacedLogicalWidth(ShouldComputePreferred shouldComputePreferred) const
|
| @@ -559,13 +570,13 @@ LayoutUnit LayoutReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh
|
| if (computedHeightIsAuto && intrinsicSizingInfo.hasWidth)
|
| return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(constrainedSize.width()), shouldComputePreferred);
|
|
|
| - if (intrinsicSizingInfo.aspectRatio) {
|
| + if (!intrinsicSizingInfo.aspectRatio.isEmpty()) {
|
| // If 'height' and 'width' both have computed values of 'auto' and the element has no intrinsic width, but does have an intrinsic height and intrinsic ratio;
|
| // or if 'width' has a computed value of 'auto', 'height' has some other computed value, and the element does have an intrinsic ratio; then the used value
|
| // of 'width' is: (used height) * (intrinsic ratio)
|
| if ((computedHeightIsAuto && !intrinsicSizingInfo.hasWidth && intrinsicSizingInfo.hasHeight) || !computedHeightIsAuto) {
|
| LayoutUnit logicalHeight = computeReplacedLogicalHeight();
|
| - return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(logicalHeight * intrinsicSizingInfo.aspectRatio), shouldComputePreferred);
|
| + return computeReplacedLogicalWidthRespectingMinMaxWidth(resolveWidthForRatio(logicalHeight, intrinsicSizingInfo.aspectRatio), shouldComputePreferred);
|
| }
|
|
|
| // If 'height' and 'width' both have computed values of 'auto' and the element has an intrinsic ratio but no intrinsic height or width, then the used value of
|
| @@ -621,8 +632,8 @@ LayoutUnit LayoutReplaced::computeReplacedLogicalHeight() const
|
|
|
| // Otherwise, if 'height' has a computed value of 'auto', and the element has an intrinsic ratio then the used value of 'height' is:
|
| // (used width) / (intrinsic ratio)
|
| - if (intrinsicSizingInfo.aspectRatio)
|
| - return computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutUnit(availableLogicalWidth() / intrinsicSizingInfo.aspectRatio));
|
| + if (!intrinsicSizingInfo.aspectRatio.isEmpty())
|
| + return computeReplacedLogicalHeightRespectingMinMaxHeight(resolveHeightForRatio(availableLogicalWidth(), intrinsicSizingInfo.aspectRatio));
|
|
|
| // Otherwise, if 'height' has a computed value of 'auto', and the element has an intrinsic height, then that intrinsic height is the used value of 'height'.
|
| if (intrinsicSizingInfo.hasHeight)
|
|
|