Changeset 246154 in webkit
- Timestamp:
- Jun 6, 2019 7:50:54 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r246143 r246154 1 2019-06-06 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Layout and preferred width computation should both call placeInlineItems(). 4 https://bugs.webkit.org/show_bug.cgi?id=198587 5 <rdar://problem/51460340> 6 7 Reviewed by Antti Koivisto. 8 9 This patch enables inline placement logic sharing between layout and preferred width computation. 10 11 * layout/inlineformatting/InlineFormattingContext.h: 12 * layout/inlineformatting/InlineFormattingContextLineLayout.cpp: 13 (WebCore::Layout::InlineFormattingContext::LineLayout::LineInput::LineInput): 14 (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const): 15 (WebCore::Layout::InlineFormattingContext::LineLayout::layout const): 16 (WebCore::Layout::InlineFormattingContext::LineLayout::computedIntrinsicWidth const): 17 1 18 2019-06-05 Takashi Komori <Takashi.Komori@sony.com> 2 19 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r246114 r246154 67 67 68 68 struct LineInput { 69 LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems&); 69 enum class SkipVerticalAligment { No, Yes }; 70 LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&); 70 71 struct HorizontalConstraint { 71 72 HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth); … … 75 76 }; 76 77 HorizontalConstraint horizontalConstraint; 78 // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out) 79 SkipVerticalAligment skipVerticalAligment; 77 80 unsigned firstInlineItemIndex { 0 }; 78 81 const InlineItems& inlineItems; -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
r246114 r246154 79 79 } 80 80 81 InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, unsigned firstInlineItemIndex, const InlineItems& inlineItems)81 InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems) 82 82 : horizontalConstraint(logicalTopLeft, availableLogicalWidth) 83 , skipVerticalAligment(skipVerticalAligment) 83 84 , firstInlineItemIndex(firstInlineItemIndex) 84 85 , inlineItems(inlineItems) … … 221 222 continue; 222 223 } 223 if (inlineItem->isHardLineBreak()) { 224 uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) }); 225 commitPendingContent(); 226 return closeLine(); 227 } 228 229 uncommittedContent.add(*inlineItem, { itemLogicalWidth, inlineItemHeight(layoutState(), *inlineItem) }); 224 225 Optional<LayoutUnit> itemLogicalHeight; 226 if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No) 227 itemLogicalHeight = inlineItemHeight(layoutState(), *inlineItem); 228 uncommittedContent.add(*inlineItem, { itemLogicalWidth, itemLogicalHeight }); 229 230 230 if (breakingContext.isAtBreakingOpportunity) 231 231 commitPendingContent(); 232 233 if (inlineItem->isHardLineBreak()) 234 return closeLine(); 232 235 } 233 236 commitPendingContent(); … … 276 279 unsigned currentInlineItemIndex = 0; 277 280 while (currentInlineItemIndex < inlineItems.size()) { 278 auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, currentInlineItemIndex, inlineItems };281 auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, LineInput::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems }; 279 282 applyFloatConstraint(lineInput.horizontalConstraint); 280 283 auto lineContent = placeInlineItems(lineInput); … … 289 292 LayoutUnit InlineFormattingContext::LineLayout::computedIntrinsicWidth(LayoutUnit widthConstraint) const 290 293 { 291 // FIXME: Consider running it through layout().292 294 LayoutUnit maximumLineWidth; 293 LayoutUnit lineLogicalRight; 294 LayoutUnit trimmableTrailingWidth; 295 296 LineBreaker lineBreaker; 297 auto& inlineContent = m_formattingState.inlineItems(); 298 for (auto& inlineItem : inlineContent) { 299 auto logicalWidth = inlineItemWidth(layoutState(), *inlineItem, lineLogicalRight); 300 auto breakingContext = lineBreaker.breakingContext(*inlineItem, logicalWidth, { widthConstraint, lineLogicalRight, !lineLogicalRight }); 301 if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Wrap) { 302 maximumLineWidth = std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); 303 trimmableTrailingWidth = { }; 304 lineLogicalRight = { }; 305 } 306 if (TextUtil::isTrimmableContent(*inlineItem)) { 307 // Skip leading whitespace. 308 if (!lineLogicalRight) 309 continue; 310 trimmableTrailingWidth += logicalWidth; 311 } else 312 trimmableTrailingWidth = { }; 313 lineLogicalRight += logicalWidth; 314 } 315 return std::max(maximumLineWidth, lineLogicalRight - trimmableTrailingWidth); 295 auto& inlineItems = m_formattingState.inlineItems(); 296 unsigned currentInlineItemIndex = 0; 297 while (currentInlineItemIndex < inlineItems.size()) { 298 auto lineContent = placeInlineItems({ { }, widthConstraint, LineInput::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems }); 299 currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1; 300 LayoutUnit floatsWidth; 301 for (auto& floatItem : lineContent.floats) 302 floatsWidth += layoutState().displayBoxForLayoutBox(floatItem->layoutBox()).marginBoxWidth(); 303 maximumLineWidth = std::max(maximumLineWidth, floatsWidth + lineContent.runs->logicalWidth()); 304 } 305 return maximumLineWidth; 316 306 } 317 307
Note: See TracChangeset
for help on using the changeset viewer.