Changeset 286820 in webkit
- Timestamp:
- Dec 9, 2021, 5:02:59 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineItemsBuilder.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286816 r286820 1 2021-12-09 Alan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Stop using the last-bidi value for opaque inline items 4 https://bugs.webkit.org/show_bug.cgi?id=234043 5 6 Reviewed by Antti Koivisto. 7 8 Now that we only need to guess the bidi level for empty inline boxes, let's stop applying the "keep tracking 9 the last bidi level from the end" logic. It may work for non-empty inline boxes (when the last bidi value 10 comes from an actual content run), but it is somewhat incorrect for empty inline boxes. 11 12 e.g. <span id=visually-second>‮END OF CONTENT</span><span id=visually-first></span> 13 14 The "visually-first" inline box's "guessed" bidi level comes from the root direction (since it's the very list run) 15 making it LTR while the RTL override character (‮) makes it RTL. It produces incorrect visual ordering for 16 these inline boxes. 17 18 * layout/formattingContexts/inline/InlineItemsBuilder.cpp: 19 (WebCore::Layout::InlineItemsBuilder::breakAndComputeBidiLevels): 20 1 21 2021-12-09 Alex Christensen <achristensen@webkit.org> 2 22 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp
r286807 r286820 289 289 for (; inlineItemIndex < inlineItemOffsets.size(); ++inlineItemIndex) { 290 290 auto offset = inlineItemOffsets[inlineItemIndex]; 291 auto& inlineItem = inlineItems[inlineItemIndex]; 291 292 if (!offset) { 292 293 // This is an opaque item. Let's post-process it. 293 294 hasSeenOpaqueItem = true; 295 inlineItem.setBidiLevel(bidiLevelForRange); 294 296 continue; 295 297 } … … 298 300 break; 299 301 } 300 auto& inlineItem = inlineItems[inlineItemIndex];301 302 inlineItem.setBidiLevel(bidiLevelForRange); 302 303 if (!inlineItem.isText()) … … 325 326 Vector<InlineBoxHasContent> inlineBoxContentFlagStack; 326 327 inlineBoxContentFlagStack.reserveInitialCapacity(inlineItems.size()); 327 auto lastBidiLevel = rootBidiLevel;328 328 for (auto index = inlineItems.size(); index--;) { 329 329 auto& inlineItem = inlineItems[index]; 330 330 if (inlineItemOffsets[index]) { 331 lastBidiLevel = inlineItem.bidiLevel();332 331 inlineBoxContentFlagStack.fill(InlineBoxHasContent::Yes); 333 332 continue; … … 336 335 ASSERT(!inlineBoxContentFlagStack.isEmpty()); 337 336 // Inline box start (e.g <span>) uses its content bidi level (next inline item). 338 inlineItems[index].setBidiLevel(inlineBoxContentFlagStack.takeLast() == InlineBoxHasContent::Yes ? InlineItem::opaqueBidiLevel : lastBidiLevel); 337 if (inlineBoxContentFlagStack.takeLast() == InlineBoxHasContent::Yes) 338 inlineItems[index].setBidiLevel(InlineItem::opaqueBidiLevel); 339 339 continue; 340 340 }
Note:
See TracChangeset
for help on using the changeset viewer.