Changeset 282386 in webkit
- Timestamp:
- Sep 14, 2021, 6:19:06 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp (modified) (12 diffs)
-
layout/formattingContexts/inline/InlineDisplayContentBuilder.h (modified) (1 diff)
-
layout/formattingContexts/inline/InlineFormattingContext.cpp (modified) (1 diff)
-
layout/formattingContexts/inline/InlineFormattingState.h (modified) (1 diff)
-
layout/formattingContexts/inline/InlineLineRun.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r282382 r282386 1 2021-09-14 Alan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] InlineDisplayContentBuilder should not operate on the global inline run list 4 https://bugs.webkit.org/show_bug.cgi?id=230232 5 6 Reviewed by Antti Koivisto. 7 8 InlineDisplayContentBuilder builds one line worth of runs. It should not have access to the global (all runs in the formatting context) run list. 9 10 * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp: 11 (WebCore::Layout::InlineDisplayContentBuilder::build): 12 (WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent): 13 (WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes): 14 (WebCore::Layout::InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns): 15 * layout/formattingContexts/inline/InlineDisplayContentBuilder.h: 16 * layout/formattingContexts/inline/InlineFormattingContext.cpp: 17 (WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent): 18 * layout/formattingContexts/inline/InlineFormattingState.h: 19 (WebCore::Layout::InlineFormattingState::addRuns): 20 (WebCore::Layout::InlineFormattingState::addRun): Deleted. 21 * layout/formattingContexts/inline/InlineLineRun.h: 22 1 23 2021-09-14 Xabier Rodriguez Calvar <calvaris@igalia.com> 2 24 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp
r282306 r282386 43 43 } 44 44 45 void InlineDisplayContentBuilder::build(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex) 46 { 47 auto& formattingState = this->formattingState(); 45 InlineRuns InlineDisplayContentBuilder::build(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex) 46 { 47 InlineRuns runs; 48 runs.reserveInitialCapacity(lineContent.runs.size() + lineBox.nonRootInlineLevelBoxes().size() + 1); 49 48 50 // Every line starts with a root run, even the empty ones. 49 51 auto rootInlineBoxRect = lineBox.logicalRectForRootInlineBox(); 50 52 rootInlineBoxRect.moveBy(lineBoxLogicalTopLeft); 51 formattingState.addRun({ lineIndex, Run::Type::RootInlineBox, root(), rootInlineBoxRect, rootInlineBoxRect, { }, { }, lineBox.rootInlineBox().hasContent()}); 52 createRunsAndUpdateGeometryForLineSpanningInlineBoxes(lineBox, lineBoxLogicalTopLeft, lineIndex); 53 createRunsAndUpdateGeometryForLineContent(lineContent, lineBox, lineBoxLogicalTopLeft, lineIndex); 54 collectInkOverflowForInlineBoxRuns(lineBox); 55 } 56 57 void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex) 53 runs.append({ lineIndex, Run::Type::RootInlineBox, root(), rootInlineBoxRect, rootInlineBoxRect, { }, { }, lineBox.rootInlineBox().hasContent()}); 54 55 createRunsAndUpdateGeometryForLineSpanningInlineBoxes(lineBox, lineBoxLogicalTopLeft, lineIndex, runs); 56 createRunsAndUpdateGeometryForLineContent(lineContent, lineBox, lineBoxLogicalTopLeft, lineIndex, runs); 57 collectInkOverflowForInlineBoxRuns(lineBox, runs); 58 return runs; 59 } 60 61 void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns& runs) 58 62 { 59 63 auto& formattingState = this->formattingState(); … … 87 91 return text->needsHyphen ? makeString(content.substring(text->start, text->length), style.hyphenString()) : String(); 88 92 }; 89 formattingState.addRun({ lineIndex93 runs.append({ lineIndex 90 94 , Run::Type::Text 91 95 , layoutBox … … 102 106 ASSERT(lineRun.textContent() && is<InlineTextBox>(layoutBox)); 103 107 auto& text = lineRun.textContent(); 104 formattingState.addRun({ lineIndex108 runs.append({ lineIndex 105 109 , Run::Type::SoftLineBreak 106 110 , layoutBox … … 115 119 auto lineBreakBoxRect = lineBox.logicalRectForLineBreakBox(layoutBox); 116 120 lineBreakBoxRect.moveBy(lineBoxLogicalTopLeft); 117 formattingState.addRun({ lineIndex, Run::Type::LineBreakBox, layoutBox, lineBreakBoxRect, lineBreakBoxRect, lineRun.expansion(), { } });121 runs.append({ lineIndex, Run::Type::LineBreakBox, layoutBox, lineBreakBoxRect, lineBreakBoxRect, lineRun.expansion(), { } }); 118 122 119 123 auto& boxGeometry = formattingState.boxGeometry(layoutBox); … … 128 132 logicalBorderBox.moveBy(lineBoxLogicalTopLeft); 129 133 // FIXME: Add ink overflow support for atomic inline level boxes (e.g. box shadow). 130 formattingState.addRun({ lineIndex, Run::Type::AtomicInlineLevelBox, layoutBox, logicalBorderBox, logicalBorderBox, lineRun.expansion(), { } });134 runs.append({ lineIndex, Run::Type::AtomicInlineLevelBox, layoutBox, logicalBorderBox, logicalBorderBox, lineRun.expansion(), { } }); 131 135 132 136 auto borderBoxLogicalTopLeft = logicalBorderBox.topLeft(); … … 142 146 } 143 147 RELEASE_ASSERT(m_inlineBoxRunIndexMap.contains(&parentInlineBox)); 144 formattingState.runs()[m_inlineBoxRunIndexMap.get(&parentInlineBox)].adjustInkOverflow(logicalBorderBox);148 runs[m_inlineBoxRunIndexMap.get(&parentInlineBox)].adjustInkOverflow(logicalBorderBox); 145 149 }; 146 150 adjustParentInlineBoxInkOverflow(); … … 154 158 if (lineBox.hasContent()) { 155 159 // FIXME: It's expected to not have any runs on empty lines. We should reconsider this. 156 m_inlineBoxRunIndexMap.add(&layoutBox, formattingState.runs().size());157 formattingState.addRun({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, lineBox.inlineLevelBoxForLayoutBox(layoutBox).hasContent() });160 m_inlineBoxRunIndexMap.add(&layoutBox, runs.size()); 161 runs.append({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, lineBox.inlineLevelBoxForLayoutBox(layoutBox).hasContent() }); 158 162 } 159 163 … … 174 178 } 175 179 176 void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex )180 void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns& runs) 177 181 { 178 182 if (!lineBox.hasContent()) { … … 193 197 inlineBoxBorderBox.moveBy(lineBoxLogicalTopLeft); 194 198 195 m_inlineBoxRunIndexMap.add(&layoutBox, formattingState.runs().size());196 formattingState.addRun({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, inlineLevelBox.hasContent(), true });199 m_inlineBoxRunIndexMap.add(&layoutBox, runs.size()); 200 runs.append({ lineIndex, Run::Type::NonRootInlineBox, layoutBox, inlineBoxBorderBox, inlineBoxBorderBox, { }, { }, inlineLevelBox.hasContent(), true }); 197 201 198 202 auto inlineBoxSize = LayoutSize { LayoutUnit::fromFloatCeil(inlineBoxBorderBox.width()), LayoutUnit::fromFloatCeil(inlineBoxBorderBox.height()) }; … … 208 212 } 209 213 210 void InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns(const LineBox& lineBox )214 void InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns(const LineBox& lineBox, InlineRuns& runs) 211 215 { 212 216 if (m_inlineBoxRunIndexMap.isEmpty() || !lineBox.hasContent()) { … … 215 219 } 216 220 217 auto& formattingState = this->formattingState();218 221 auto& nonRootInlineLevelBoxes = lineBox.nonRootInlineLevelBoxes(); 219 222 // Visit the inline boxes and propagate ink overflow to their parents -except to the root inline box. … … 227 230 continue; 228 231 RELEASE_ASSERT(m_inlineBoxRunIndexMap.contains(&inlineBox) && m_inlineBoxRunIndexMap.contains(&parentInlineBox)); 229 auto& inkOverflow = formattingState.runs()[m_inlineBoxRunIndexMap.get(&inlineBox)].inkOverflow();230 auto& parentInlineBoxRun = formattingState.runs()[m_inlineBoxRunIndexMap.get(&parentInlineBox)];232 auto& inkOverflow = runs[m_inlineBoxRunIndexMap.get(&inlineBox)].inkOverflow(); 233 auto& parentInlineBoxRun = runs[m_inlineBoxRunIndexMap.get(&parentInlineBox)]; 231 234 parentInlineBoxRun.adjustInkOverflow(inkOverflow); 232 235 } -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h
r282141 r282386 42 42 InlineDisplayContentBuilder(const ContainerBox& formattingContextRoot, InlineFormattingState&); 43 43 44 voidbuild(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex);44 InlineRuns build(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex); 45 45 46 46 private: 47 void createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex );48 void createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex );49 void collectInkOverflowForInlineBoxRuns(const LineBox& );47 void createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns&); 48 void createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns&); 49 void collectInkOverflowForInlineBoxRuns(const LineBox&, InlineRuns&); 50 50 51 51 const ContainerBox& root() const { return m_formattingContextRoot; } -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp
r282348 r282386 571 571 { 572 572 auto& formattingState = this->formattingState(); 573 auto lineBoxAndGeometry = LineBoxBuilder(*this).build(lineContent); 574 auto lineBoxLogicalRect = lineBoxAndGeometry.lineGeometry.lineBoxLogicalRect(); 575 576 auto inlineContentBuilder = InlineDisplayContentBuilder { root(), formattingState }; 573 577 auto currentLineIndex = formattingState.lines().size(); 574 575 auto lineBoxAndGeometry = LineBoxBuilder(*this).build(lineContent); 578 formattingState.addRuns(inlineContentBuilder.build(lineContent, lineBoxAndGeometry.lineBox, lineBoxLogicalRect.topLeft(), currentLineIndex)); 576 579 formattingState.addLineBox(WTFMove(lineBoxAndGeometry.lineBox)); 577 580 formattingState.addLine(lineBoxAndGeometry.lineGeometry); 578 581 579 auto lineBoxLogicalRect = lineBoxAndGeometry.lineGeometry.lineBoxLogicalRect();580 581 InlineDisplayContentBuilder(root(), formattingState).build(lineContent, formattingState.lineBoxes().last(), lineBoxLogicalRect.topLeft(), currentLineIndex);582 582 return lineBoxLogicalRect; 583 583 } -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingState.h
r281800 r282386 63 63 const InlineRuns& runs() const { return m_runs; } 64 64 InlineRuns& runs() { return m_runs; } 65 void addRun (Run&& run) { m_runs.append(WTFMove(run)); }65 void addRuns(InlineRuns&& runs) { m_runs.appendVector(WTFMove(runs)); } 66 66 67 67 void setClearGapAfterLastLine(InlineLayoutUnit verticalGap); -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineRun.h
r282306 r282386 115 115 116 116 private: 117 const size_t m_lineIndex ;118 const Type m_type ;117 const size_t m_lineIndex { 0 }; 118 const Type m_type { Type::GenericInlineLevelBox }; 119 119 WeakPtr<const Layout::Box> m_layoutBox; 120 120 InlineRect m_logicalRect;
Note:
See TracChangeset
for help on using the changeset viewer.