Changeset 246633 in webkit
- Timestamp:
- Jun 20, 2019 6:59:12 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r246632 r246633 1 2019-06-20 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Introduce Line::InitialConstraints 4 https://bugs.webkit.org/show_bug.cgi?id=199056 5 <rdar://problem/51927597> 6 7 Reviewed by Antti Koivisto. 8 9 Line::InitialConstraints, as the name suggests, holds the initial constraint values for the new line. 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 * layout/inlineformatting/InlineLine.cpp: 18 (WebCore::Layout::Line::Line): 19 (WebCore::Layout::m_skipVerticalAligment): 20 (WebCore::Layout::m_lineLogicalWidth): Deleted. 21 * layout/inlineformatting/InlineLine.h: 22 1 23 2019-06-20 Carlos Garcia Campos <cgarcia@igalia.com> 2 24 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r246540 r246633 67 67 68 68 struct LineInput { 69 enum class SkipVerticalAligment { No, Yes }; 70 LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&); 69 LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems&); 71 70 struct HorizontalConstraint { 72 71 HorizontalConstraint(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth); … … 77 76 HorizontalConstraint horizontalConstraint; 78 77 // FIXME Alternatively we could just have a second pass with vertical positioning (preferred width computation opts out) 79 SkipVerticalAligment skipVerticalAligment;78 Line::SkipVerticalAligment skipVerticalAligment; 80 79 unsigned firstInlineItemIndex { 0 }; 81 80 const InlineItems& inlineItems; -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
r246540 r246633 79 79 } 80 80 81 InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems)81 InlineFormattingContext::LineLayout::LineInput::LineInput(LayoutPoint logicalTopLeft, LayoutUnit availableLogicalWidth, Line::SkipVerticalAligment skipVerticalAligment, unsigned firstInlineItemIndex, const InlineItems& inlineItems) 82 82 : horizontalConstraint(logicalTopLeft, availableLogicalWidth) 83 83 , skipVerticalAligment(skipVerticalAligment) … … 128 128 InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const 129 129 { 130 std::unique_ptr<Line> line; 131 if (lineInput.skipVerticalAligment == LineInput::SkipVerticalAligment::No) { 132 auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight(); 133 auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent; 134 line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft, lineInput.horizontalConstraint.availableLogicalWidth, mimimumLineHeight, initialBaselineOffset); 135 } else 136 line = std::make_unique<Line>(layoutState(), lineInput.horizontalConstraint.logicalTopLeft.x(), lineInput.horizontalConstraint.availableLogicalWidth); 130 auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight(); 131 auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent; 132 auto initialLineConstraints = Line::InitialConstraints { 133 lineInput.horizontalConstraint.logicalTopLeft, 134 lineInput.horizontalConstraint.availableLogicalWidth, 135 mimimumLineHeight, 136 initialBaselineOffset 137 }; 138 auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment }; 137 139 138 140 Vector<WeakPtr<InlineItem>> floats; … … 145 147 committedInlineItemCount += uncommittedContent.size(); 146 148 for (auto& uncommittedRun : uncommittedContent.runs()) 147 line ->append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth);149 line.append(uncommittedRun.inlineItem, uncommittedRun.logicalWidth); 148 150 uncommittedContent.reset(); 149 151 }; … … 153 155 ASSERT(committedInlineItemCount || lineHasFloatBox); 154 156 auto lastCommittedIndex = committedInlineItemCount ? Optional<unsigned> { lineInput.firstInlineItemIndex + (committedInlineItemCount - 1) } : WTF::nullopt; 155 return LineContent { lastCommittedIndex, WTFMove(floats), line ->close() };157 return LineContent { lastCommittedIndex, WTFMove(floats), line.close() }; 156 158 }; 157 159 LineBreaker lineBreaker; 158 160 // Iterate through the inline content and place the inline boxes on the current line. 159 161 for (auto inlineItemIndex = lineInput.firstInlineItemIndex; inlineItemIndex < lineInput.inlineItems.size(); ++inlineItemIndex) { 160 auto availableWidth = line ->availableWidth() - uncommittedContent.width();161 auto currentLogicalRight = line ->contentLogicalRight() + uncommittedContent.width();162 auto availableWidth = line.availableWidth() - uncommittedContent.width(); 163 auto currentLogicalRight = line.contentLogicalRight() + uncommittedContent.width(); 162 164 auto& inlineItem = lineInput.inlineItems[inlineItemIndex]; 163 165 auto itemLogicalWidth = inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight); 164 166 165 167 // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed. 166 auto lineIsConsideredEmpty = !line ->hasContent() && !lineHasFloatBox;167 auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line ->trailingTrimmableWidth(), lineIsConsideredEmpty });168 auto lineIsConsideredEmpty = !line.hasContent() && !lineHasFloatBox; 169 auto breakingContext = lineBreaker.breakingContext(*inlineItem, itemLogicalWidth, { availableWidth, currentLogicalRight, line.trailingTrimmableWidth(), lineIsConsideredEmpty }); 168 170 if (breakingContext.isAtBreakingOpportunity) 169 171 commitPendingContent(); … … 187 189 // Shrink availble space for current line and move existing inline runs. 188 190 auto floatBoxWidth = layoutState().displayBoxForLayoutBox(floatBox).marginBoxWidth(); 189 floatBox.isLeftFloatingPositioned() ? line ->moveLogicalLeft(floatBoxWidth) : line->moveLogicalRight(floatBoxWidth);191 floatBox.isLeftFloatingPositioned() ? line.moveLogicalLeft(floatBoxWidth) : line.moveLogicalRight(floatBoxWidth); 190 192 floats.append(makeWeakPtr(*inlineItem)); 191 193 ++committedInlineItemCount; … … 252 254 unsigned currentInlineItemIndex = 0; 253 255 while (currentInlineItemIndex < inlineItems.size()) { 254 auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Line Input::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems };256 auto lineInput = LineInput { { lineLogicalLeft, lineLogicalTop }, widthConstraint, Line::SkipVerticalAligment::No, currentInlineItemIndex, inlineItems }; 255 257 applyFloatConstraint(lineInput); 256 258 auto lineContent = placeInlineItems(lineInput); … … 274 276 unsigned currentInlineItemIndex = 0; 275 277 while (currentInlineItemIndex < inlineItems.size()) { 276 auto lineContent = placeInlineItems({ { }, widthConstraint, Line Input::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems });278 auto lineContent = placeInlineItems({ { }, widthConstraint, Line::SkipVerticalAligment::Yes, currentInlineItemIndex, inlineItems }); 277 279 currentInlineItemIndex = *lineContent.lastInlineItemIndex + 1; 278 280 LayoutUnit floatsWidth; -
trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp
r246540 r246633 45 45 } 46 46 47 Line::Line(const LayoutState& layoutState, LayoutUnit logicalLeft, LayoutUnit availableWidth)47 Line::Line(const LayoutState& layoutState, const InitialConstraints& initialConstraints, SkipVerticalAligment skipVerticalAligment) 48 48 : m_layoutState(layoutState) 49 49 , m_content(std::make_unique<Line::Content>()) 50 , m_logicalTopLeft(logicalLeft, 0) 51 , m_lineLogicalWidth(availableWidth) 52 , m_skipVerticalAligment(true) 53 { 54 } 55 56 Line::Line(const LayoutState& layoutState, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumHeight, LayoutUnit baselineOffset) 57 : m_layoutState(layoutState) 58 , m_content(std::make_unique<Line::Content>()) 59 , m_logicalTopLeft(topLeft) 60 , m_baseline({ baselineOffset, minimumHeight - baselineOffset }) 61 , m_contentLogicalHeight(minimumHeight) 62 , m_lineLogicalWidth(availableWidth) 50 , m_logicalTopLeft(initialConstraints.topLeft) 51 , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset }) 52 , m_contentLogicalHeight(initialConstraints.height) 53 , m_lineLogicalWidth(initialConstraints.availableWidth) 54 , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes) 63 55 { 64 56 } -
trunk/Source/WebCore/layout/inlineformatting/InlineLine.h
r246539 r246633 39 39 WTF_MAKE_ISO_ALLOCATED(Line); 40 40 public: 41 Line(const LayoutState&, const LayoutPoint& topLeft, LayoutUnit availableWidth, LayoutUnit minimumLineHeight, LayoutUnit baselineOffset); 42 Line(const LayoutState&, LayoutUnit logicalLeft, LayoutUnit availableWidth); 41 struct InitialConstraints { 42 LayoutPoint topLeft; 43 LayoutUnit availableWidth; 44 LayoutUnit height; 45 LayoutUnit baselineOffset; 46 }; 47 enum class SkipVerticalAligment { No, Yes }; 48 Line(const LayoutState&, const InitialConstraints&, SkipVerticalAligment); 43 49 44 50 class Content {
Note: See TracChangeset
for help on using the changeset viewer.