LayoutUnit RenderReplaced::computeReplacedLogicalHeight() const { // 10.5 Content height: the 'height' property: http://www.w3.org/TR/CSS21/visudet.html#propdef-height if (hasReplacedLogicalHeight()) return computeReplacedLogicalHeightRespectingMinMaxHeight(computeReplacedLogicalHeightUsing(MainOrPreferredSize, style().logicalHeight())); RenderBox* contentRenderer = embeddedContentBox(); // 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height double intrinsicRatio = 0; FloatSize constrainedSize; computeAspectRatioInformationForRenderBox(contentRenderer, constrainedSize, intrinsicRatio); bool widthIsAuto = style().logicalWidth().isAuto(); bool hasIntrinsicHeight = constrainedSize.height() > 0; // 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'. if (widthIsAuto && hasIntrinsicHeight) return computeReplacedLogicalHeightRespectingMinMaxHeight(constrainedSize.height()); // 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(roundToInt(round(availableLogicalWidth() / intrinsicRatio))); // 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) return computeReplacedLogicalHeightRespectingMinMaxHeight(constrainedSize.height()); // Otherwise, if 'height' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'height' must be set to the height // of the largest rectangle that has a 2:1 ratio, has a height not greater than 150px, and has a width not greater than the device width. return computeReplacedLogicalHeightRespectingMinMaxHeight(intrinsicLogicalHeight()); }
LayoutUnit RenderReplaced::computeReplacedLogicalHeight() const { // 10.5 Content height: the 'height' property: http://www.w3.org/TR/CSS21/visudet.html#propdef-height if (hasReplacedLogicalHeight()) return computeReplacedLogicalHeightRespectingMinMaxHeight(computeReplacedLogicalHeightUsing(style()->logicalHeight())); RenderBox* contentRenderer = embeddedContentBox(); // 10.6.2 Inline, replaced elements: http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height bool isPercentageIntrinsicSize = false; double intrinsicRatio = 0; FloatSize intrinsicSize; computeIntrinsicRatioInformationForRenderBox(contentRenderer, intrinsicSize, intrinsicRatio, isPercentageIntrinsicSize); // FIXME: Remove unnecessary round/roundToInt calls from this method when layout is off ints: webkit.org/b/63656 bool widthIsAuto = style()->logicalWidth().isAuto(); bool hasIntrinsicHeight = !isPercentageIntrinsicSize && intrinsicSize.height() > 0; // 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'. if (widthIsAuto && hasIntrinsicHeight) return computeReplacedLogicalHeightRespectingMinMaxHeight(roundToInt(intrinsicSize.height())); // 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(roundToInt(round(availableLogicalWidth() / intrinsicRatio))); // 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) return computeReplacedLogicalHeightRespectingMinMaxHeight(roundToInt(intrinsicSize.height())); // Otherwise, if 'height' has a computed value of 'auto', but none of the conditions above are met, then the used value of 'height' must be set to the height // of the largest rectangle that has a 2:1 ratio, has a height not greater than 150px, and has a width not greater than the device width. return computeReplacedLogicalHeightRespectingMinMaxHeight(intrinsicLogicalHeight()); }
void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks) { const Vector<GridTrackSize>& trackStyles = (direction == ForColumns) ? style()->gridColumns() : style()->gridRows(); LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogicalWidth() : availableLogicalHeight(IncludeMarginBorderPadding); Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTracks; for (size_t i = 0; i < trackStyles.size(); ++i) { GridTrack& track = tracks[i]; const Length& minTrackBreadth = trackStyles[i].minTrackBreadth(); const Length& maxTrackBreadth = trackStyles[i].maxTrackBreadth(); track.m_usedBreadth = computeUsedBreadthOfMinLength(direction, minTrackBreadth); track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBreadth); track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth); availableLogicalSpace -= track.m_usedBreadth; } // FIXME: We shouldn't call resolveContentBasedTrackSizingFunctions if we have no min-content / max-content tracks. resolveContentBasedTrackSizingFunctions(direction, columnTracks, rowTracks, availableLogicalSpace); if (availableLogicalSpace <= 0) return; const size_t tracksSize = tracks.size(); Vector<GridTrack*> tracksForDistribution(tracksSize); for (size_t i = 0; i < tracksSize; ++i) tracksForDistribution[i] = tracks.data() + i; distributeSpaceToTracks(tracksForDistribution, 0, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, availableLogicalSpace); }
LayoutUnit LayoutReplaced::computeReplacedLogicalHeight( LayoutUnit estimatedUsedWidth) const { // 10.5 Content height: the 'height' property: // http://www.w3.org/TR/CSS21/visudet.html#propdef-height if (hasReplacedLogicalHeight()) return computeReplacedLogicalHeightRespectingMinMaxHeight( computeReplacedLogicalHeightUsing(MainOrPreferredSize, style()->logicalHeight())); LayoutReplaced* contentLayoutObject = embeddedReplacedContent(); // 10.6.2 Inline, replaced elements: // http://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height IntrinsicSizingInfo intrinsicSizingInfo; computeIntrinsicSizingInfoForReplacedContent(contentLayoutObject, intrinsicSizingInfo); FloatSize constrainedSize = constrainIntrinsicSizeToMinMax(intrinsicSizingInfo); bool widthIsAuto = style()->logicalWidth().isAuto(); // 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'. if (widthIsAuto && intrinsicSizingInfo.hasHeight) return computeReplacedLogicalHeightRespectingMinMaxHeight( LayoutUnit(constrainedSize.height())); // 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.isEmpty()) { LayoutUnit usedWidth = estimatedUsedWidth ? estimatedUsedWidth : availableLogicalWidth(); return computeReplacedLogicalHeightRespectingMinMaxHeight( resolveHeightForRatio(usedWidth, 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) return computeReplacedLogicalHeightRespectingMinMaxHeight( LayoutUnit(constrainedSize.height())); // Otherwise, if 'height' has a computed value of 'auto', but none of the // conditions above are met, then the used value of 'height' must be set to // the height of the largest rectangle that has a 2:1 ratio, has a height not // greater than 150px, and has a width not greater than the device width. return computeReplacedLogicalHeightRespectingMinMaxHeight( intrinsicLogicalHeight()); }
void RenderBlockFlow::determineLogicalLeftPositionForChild(RenderBox* child) { LayoutUnit startPosition = borderStart() + paddingStart(); LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + availableLogicalWidth(); LayoutUnit childMarginStart = marginStartForChild(child); LayoutUnit newPosition = startPosition + childMarginStart; // If the child has an offset from the content edge to avoid floats then use that, otherwise let any negative // margin pull it back over the content edge or any positive margin push it out. if (child->style()->marginStartUsing(style()).isAuto()) newPosition = std::max(newPosition, childMarginStart); child->setX(style()->isLeftToRightDirection() ? newPosition : totalAvailableLogicalWidth - newPosition - logicalWidthForChild(child)); }