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 5e31d1ff9bf42753e0d194594b334e0d67a294a7..29f6846fb92d7f2647c3436843a131a809488034 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp |
@@ -146,47 +146,48 @@ static inline bool layoutObjectHasAspectRatio(const LayoutObject* layoutObject) |
return layoutObject->isImage() || layoutObject->isCanvas() || layoutObject->isVideo(); |
} |
-void LayoutReplaced::computeAspectRatioInformationForLayoutBox(LayoutBox* contentLayoutObject, FloatSize& constrainedSize, double& intrinsicRatio) const |
+void LayoutReplaced::computeIntrinsicSizingInfoForLayoutBox(LayoutBox* contentLayoutObject, IntrinsicSizingInfo& intrinsicSizingInfo) const |
{ |
- FloatSize intrinsicSize; |
if (contentLayoutObject) { |
- contentLayoutObject->computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio); |
+ contentLayoutObject->computeIntrinsicSizingInfo(intrinsicSizingInfo); |
// Handle zoom & vertical writing modes here, as the embedded document doesn't know about them. |
- intrinsicSize.scale(style()->effectiveZoom()); |
+ intrinsicSizingInfo.size.scale(style()->effectiveZoom()); |
if (isLayoutImage()) |
- intrinsicSize.scale(toLayoutImage(this)->imageDevicePixelRatio()); |
+ intrinsicSizingInfo.size.scale(toLayoutImage(this)->imageDevicePixelRatio()); |
// 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 (intrinsicRatio && !intrinsicSize.isEmpty()) |
- m_intrinsicSize = LayoutSize(intrinsicSize); |
+ if (intrinsicSizingInfo.aspectRatio && !intrinsicSizingInfo.size.isEmpty()) |
+ m_intrinsicSize = LayoutSize(intrinsicSizingInfo.size); |
if (!isHorizontalWritingMode()) { |
- if (intrinsicRatio) |
- intrinsicRatio = 1 / intrinsicRatio; |
- intrinsicSize = intrinsicSize.transposedSize(); |
+ if (intrinsicSizingInfo.aspectRatio) |
+ intrinsicSizingInfo.aspectRatio = 1 / intrinsicSizingInfo.aspectRatio; |
+ intrinsicSizingInfo.size = intrinsicSizingInfo.size.transposedSize(); |
} |
} else { |
- computeIntrinsicRatioInformation(intrinsicSize, intrinsicRatio); |
- if (intrinsicRatio && !intrinsicSize.isEmpty()) |
- m_intrinsicSize = LayoutSize(isHorizontalWritingMode() ? intrinsicSize : intrinsicSize.transposedSize()); |
+ computeIntrinsicSizingInfo(intrinsicSizingInfo); |
+ if (intrinsicSizingInfo.aspectRatio && !intrinsicSizingInfo.size.isEmpty()) |
+ m_intrinsicSize = LayoutSize(isHorizontalWritingMode() ? intrinsicSizingInfo.size : intrinsicSizingInfo.size.transposedSize()); |
} |
+} |
- // Now constrain the intrinsic size along each axis according to minimum and maximum width/heights along the |
- // opposite 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. |
- // FIXME: In the long term, it might be better to just return this code more to the way it used to be before this |
- // function was added, since all it has done is make the code more unclear. |
- constrainedSize = intrinsicSize; |
- if (intrinsicRatio && !intrinsicSize.isEmpty() && style()->logicalWidth().isAuto() && style()->logicalHeight().isAuto()) { |
- // We can't multiply or divide by 'intrinsicRatio' here, it breaks tests, like fast/images/zoomed-img-size.html, which |
+FloatSize LayoutReplaced::constrainIntrinsicSizeToMinMax(const IntrinsicSizingInfo& intrinsicSizingInfo) const |
+{ |
+ // Constrain the intrinsic size along each axis according to minimum and maximum width/heights along the opposite |
+ // 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. |
+ FloatSize constrainedSize = intrinsicSizingInfo.size; |
+ if (intrinsicSizingInfo.aspectRatio && !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() * intrinsicSize.width() / intrinsicSize.height()); |
- constrainedSize.setHeight(LayoutBox::computeReplacedLogicalWidth() * intrinsicSize.height() / intrinsicSize.width()); |
+ constrainedSize.setWidth(LayoutBox::computeReplacedLogicalHeight() * intrinsicSizingInfo.size.width() / intrinsicSizingInfo.size.height()); |
+ constrainedSize.setHeight(LayoutBox::computeReplacedLogicalWidth() * intrinsicSizingInfo.size.height() / intrinsicSizingInfo.size.width()); |
} |
+ return constrainedSize; |
} |
void LayoutReplaced::computePositionedLogicalWidth(LogicalExtentComputedValues& computedValues) const |
@@ -529,17 +530,17 @@ LayoutRect LayoutReplaced::replacedContentRect(const LayoutSize* overriddenIntri |
return finalRect; |
} |
-void LayoutReplaced::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, double& intrinsicRatio) const |
+void LayoutReplaced::computeIntrinsicSizingInfo(IntrinsicSizingInfo& intrinsicSizingInfo) const |
{ |
// If there's an embeddedContentBox() of a remote, referenced document available, this code-path should never be used. |
ASSERT(!embeddedContentBox()); |
- intrinsicSize = FloatSize(intrinsicLogicalWidth().toFloat(), intrinsicLogicalHeight().toFloat()); |
+ intrinsicSizingInfo.size = FloatSize(intrinsicLogicalWidth().toFloat(), intrinsicLogicalHeight().toFloat()); |
// Figure out if we need to compute an intrinsic ratio. |
- if (intrinsicSize.isEmpty() || !layoutObjectHasAspectRatio(this)) |
+ if (intrinsicSizingInfo.size.isEmpty() || !layoutObjectHasAspectRatio(this)) |
return; |
- intrinsicRatio = intrinsicSize.width() / intrinsicSize.height(); |
+ intrinsicSizingInfo.aspectRatio = intrinsicSizingInfo.size.width() / intrinsicSizingInfo.size.height(); |
} |
static bool hasIntrinsicWidthForLayoutBox(LayoutBox* layoutObject) |
@@ -572,14 +573,14 @@ LayoutUnit LayoutReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh |
LayoutBox* contentLayoutObject = embeddedContentBox(); |
// 10.3.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-width |
- double intrinsicRatio = 0; |
- FloatSize constrainedSize; |
- computeAspectRatioInformationForLayoutBox(contentLayoutObject, constrainedSize, intrinsicRatio); |
+ IntrinsicSizingInfo intrinsicSizingInfo; |
+ computeIntrinsicSizingInfoForLayoutBox(contentLayoutObject, intrinsicSizingInfo); |
+ FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingInfo); |
if (style()->logicalWidth().isAuto()) { |
bool computedHeightIsAuto = hasAutoHeightOrContainingBlockWithAutoHeight(); |
// TODO(shanmuga.m@samsung.com): hasIntrinsicWidth/Height information should be obtained |
- // from LayoutBox::computeIntrinsicRatioInformation(). |
+ // from LayoutBox::computeIntrinsicSizingInfo(). |
bool hasIntrinsicWidth = constrainedSize.width() > 0 || hasIntrinsicWidthForLayoutBox(contentLayoutObject); |
// If 'height' and 'width' both have computed values of 'auto' and the element also has an intrinsic width, then that intrinsic width is the used value of 'width'. |
@@ -588,13 +589,13 @@ LayoutUnit LayoutReplaced::computeReplacedLogicalWidth(ShouldComputePreferred sh |
bool hasIntrinsicHeight = constrainedSize.height() > 0 || hasIntrinsicHeightForLayoutBox(contentLayoutObject); |
- if (intrinsicRatio) { |
+ if (intrinsicSizingInfo.aspectRatio) { |
// 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 (intrinsicRatio && ((computedHeightIsAuto && !hasIntrinsicWidth && hasIntrinsicHeight) || !computedHeightIsAuto)) { |
+ if (intrinsicSizingInfo.aspectRatio && ((computedHeightIsAuto && !hasIntrinsicWidth && hasIntrinsicHeight) || !computedHeightIsAuto)) { |
LayoutUnit logicalHeight = computeReplacedLogicalHeight(); |
- return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(logicalHeight * intrinsicRatio), shouldComputePreferred); |
+ return computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUnit(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 |
@@ -638,13 +639,13 @@ LayoutUnit LayoutReplaced::computeReplacedLogicalHeight() const |
LayoutBox* contentLayoutObject = embeddedContentBox(); |
// 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height |
- double intrinsicRatio = 0; |
- FloatSize constrainedSize; |
- computeAspectRatioInformationForLayoutBox(contentLayoutObject, constrainedSize, intrinsicRatio); |
+ IntrinsicSizingInfo intrinsicSizingInfo; |
+ computeIntrinsicSizingInfoForLayoutBox(contentLayoutObject, intrinsicSizingInfo); |
+ FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingInfo); |
bool widthIsAuto = style()->logicalWidth().isAuto(); |
// TODO(shanmuga.m@samsung.com): hasIntrinsicWidth/Height information should be obtained |
- // from LayoutBox::computeIntrinsicRatioInformation(). |
+ // from LayoutBox::computeIntrinsicSizingInfo(). |
bool hasIntrinsicHeight = constrainedSize.height() > 0 || hasIntrinsicHeightForLayoutBox(contentLayoutObject); |
// If 'height' and 'width' both have computed values of 'auto' and the element also has an intrinsic height, then that intrinsic height is the used value of 'height'. |
@@ -653,8 +654,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 (intrinsicRatio) |
- return computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutUnit(availableLogicalWidth() / intrinsicRatio)); |
+ if (intrinsicSizingInfo.aspectRatio) |
+ return computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutUnit(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 (hasIntrinsicHeight) |