Changeset 286789 in webkit
- Timestamp:
- Dec 9, 2021, 11:01:10 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp (modified) (10 diffs)
-
layout/formattingContexts/inline/InlineDisplayContentBuilder.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286786 r286789 1 2021-12-09 Alan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Add support for ink overflow on bidi inline boxes 4 https://bugs.webkit.org/show_bug.cgi?id=233968 5 6 Reviewed by Antti Koivisto. 7 8 * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp: 9 (WebCore::Layout::InlineDisplayContentBuilder::appendInlineDisplayBoxAtBidiBoundary): 10 (WebCore::Layout::InlineDisplayContentBuilder::ensureDisplayBoxForContainer): 11 (WebCore::Layout::InlineDisplayContentBuilder::adjustVisualGeometryForChildNode): 12 (WebCore::Layout::InlineDisplayContentBuilder::processBidiContent): 13 * layout/formattingContexts/inline/InlineDisplayContentBuilder.h: 14 1 15 2021-12-09 Alan Bujtas <zalan@apple.com> 2 16 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp
r286786 r286789 129 129 , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen } 130 130 , true 131 , { } }); 131 , { } 132 }); 132 133 } 133 134 … … 146 147 , softLineBreakRunRect 147 148 , lineRun.expansion() 148 , InlineDisplay::Box::Text { text->start, text->length, downcast<InlineTextBox>(layoutBox).content() } }); 149 , InlineDisplay::Box::Text { text->start, text->length, downcast<InlineTextBox>(layoutBox).content() } 150 }); 149 151 } 150 152 … … 160 162 , lineBreakBoxRect 161 163 , lineRun.expansion() 162 , { } }); 164 , { } 165 }); 163 166 164 167 auto& boxGeometry = formattingState().boxGeometry(layoutBox); … … 186 189 , inkOverflow() 187 190 , lineRun.expansion() 188 , { } }); 191 , { } 192 }); 189 193 // Note that inline boxes are relative to the line and their top position can be negative. 190 194 // Atomic inline boxes are all set. Their margin/border/content box geometries are already computed. We just have to position them here. … … 237 241 , { } 238 242 , inlineBox.hasContent() 239 , isFirstLastBox(inlineBox) }); 243 , isFirstLastBox(inlineBox) 244 }); 240 245 // This inline box showed up first on this line. 241 246 setInlineBoxGeometry(layoutBox, inlineBoxBorderBox, true); … … 262 267 , { } 263 268 , inlineBox.hasContent() 264 , isFirstLastBox(inlineBox) }); 269 , isFirstLastBox(inlineBox) 270 }); 265 271 // Middle or end of the inline box. Let's stretch the box as needed. 266 272 setInlineBoxGeometry(layoutBox, inlineBoxBorderBox, false); 273 } 274 275 void InlineDisplayContentBuilder::appendInlineDisplayBoxAtBidiBoundary(const Box& layoutBox, DisplayBoxes& boxes) 276 { 277 // Geometries for inline boxes at bidi boundaries are computed at a post-process step. 278 boxes.append({ m_lineIndex 279 , InlineDisplay::Box::Type::NonRootInlineBox 280 , layoutBox 281 , UBIDI_DEFAULT_LTR 282 , { } 283 , { } 284 , { } 285 , { } 286 }); 267 287 } 268 288 … … 378 398 return *lowestCommonAncestor; 379 399 auto& enclosingDisplayBoxNodeForContainer = ensureDisplayBoxForContainer(containerBox.parent(), ancestorStack, boxes); 380 boxes.append({ m_lineIndex, InlineDisplay::Box::Type::NonRootInlineBox, containerBox, UBIDI_DEFAULT_LTR, { }, { }, { }, { }, true, { } });400 appendInlineDisplayBoxAtBidiBoundary(containerBox, boxes); 381 401 return createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack(containerBox, boxes.size() - 1, enclosingDisplayBoxNodeForContainer, ancestorStack); 382 402 } … … 404 424 auto logicalRect = lineBox.logicalBorderBoxForInlineBox(layoutBox, boxGeometry); 405 425 auto visualRect = InlineRect { lineBoxLogicalTop + logicalRect.top(), contentRightInVisualOrder, { }, logicalRect.height() }; 406 // FIXME: Add support for ink overflow.407 426 if (!displayBox.isFirstForLayoutBox()) 408 427 return displayBox.setLogicalRect(visualRect, visualRect); … … 427 446 }; 428 447 afterInlineBoxContent(); 448 449 auto computeInkOverflow = [&] { 450 auto inkOverflow = displayBox.logicalRect(); 451 m_contentHasInkOverflow = computeBoxShadowInkOverflow(!m_lineIndex ? layoutBox.firstLineStyle() : layoutBox.style(), inkOverflow) || m_contentHasInkOverflow; 452 displayBox.adjustInkOverflow(inkOverflow); 453 }; 454 computeInkOverflow(); 429 455 430 456 setInlineBoxGeometry(layoutBox, displayBox.logicalRect(), displayBox.isFirstForLayoutBox()); … … 499 525 } 500 526 if (lineRun.isInlineBoxStart() || lineRun.isLineSpanningInlineBoxStart()) { 501 boxes.append({ m_lineIndex, InlineDisplay::Box::Type::NonRootInlineBox, layoutBox, UBIDI_DEFAULT_LTR, { }, { }, { }, { }, true, { } });527 appendInlineDisplayBoxAtBidiBoundary(layoutBox, boxes); 502 528 createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack(downcast<ContainerBox>(layoutBox), boxes.size() - 1, parentDisplayBoxNode, ancestorStack); 503 529 continue; -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h
r286784 r286789 60 60 void appendInlineBoxDisplayBox(const Line::Run&, const InlineLevelBox&, const InlineRect&, bool linehasContent, DisplayBoxes&); 61 61 void appendSpanningInlineBoxDisplayBox(const Line::Run&, const InlineLevelBox&, const InlineRect&, DisplayBoxes&); 62 void appendInlineDisplayBoxAtBidiBoundary(const Box&, DisplayBoxes&); 62 63 63 64 void setInlineBoxGeometry(const Box&, const InlineRect&, bool isFirstInlineBoxFragment);
Note:
See TracChangeset
for help on using the changeset viewer.