⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286534 in webkit


Ignore:
Timestamp:
Dec 4, 2021, 8:51:39 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Compute isFirstBox/isLastBox for text content
https://bugs.webkit.org/show_bug.cgi?id=233850

Reviewed by Antti Koivisto.

This is in preparation for helping the iterator interface to compute renderer (layout box) boundaries for text content.

  • layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:

(WebCore::Layout::InlineDisplayContentBuilder::appendTextDisplayBox):
(WebCore::Layout::InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent):

  • layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
  • layout/formattingContexts/inline/InlineFormattingContext.cpp:

(WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
(WebCore::Layout::InlineFormattingContext::lineLayoutForIntergration):

  • layout/formattingContexts/inline/display/InlineDisplayBox.h:

(WebCore::InlineDisplay::Box::setIsFirstBox):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286532 r286534  
     12021-12-04  Alan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Compute isFirstBox/isLastBox for text content
     4        https://bugs.webkit.org/show_bug.cgi?id=233850
     5
     6        Reviewed by Antti Koivisto.
     7
     8        This is in preparation for helping the iterator interface to compute renderer (layout box) boundaries for text content.
     9
     10        * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
     11        (WebCore::Layout::InlineDisplayContentBuilder::appendTextDisplayBox):
     12        (WebCore::Layout::InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent):
     13        * layout/formattingContexts/inline/InlineDisplayContentBuilder.h:
     14        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
     15        (WebCore::Layout::InlineFormattingContext::layoutInFlowContent):
     16        (WebCore::Layout::InlineFormattingContext::lineLayoutForIntergration):
     17        * layout/formattingContexts/inline/display/InlineDisplayBox.h:
     18        (WebCore::InlineDisplay::Box::setIsFirstBox):
     19
    1202021-12-04  Antoine Quint  <graouts@webkit.org>
    221
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp

    r286529 r286534  
    124124        , inkOverflow()
    125125        , lineRun.expansion()
    126         , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen } });
     126        , InlineDisplay::Box::Text { text->start, text->length, content, adjustedContentToRender(), text->needsHyphen }
     127        , true
     128        , { } });
    127129}
    128130
     
    650652}
    651653
     654void InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(DisplayBoxes& boxes)
     655{
     656    HashMap<const Box*, size_t> lastDisplayBoxForInlineTextBoxIndexes;
     657    ASSERT(boxes[0].isRootInlineBox());
     658    for (size_t index = 1; index < boxes.size(); ++index) {
     659        auto& displayBox = boxes[index];
     660        // FIXME: Transition the inline box isFirst/isLast computation here as well.
     661        if (!displayBox.isText())
     662            continue;
     663        auto& layoutBox = displayBox.layoutBox();
     664        if (!lastDisplayBoxForInlineTextBoxIndexes.contains(&layoutBox))
     665            displayBox.setIsFirstBox(true);
     666        lastDisplayBoxForInlineTextBoxIndexes.set(&layoutBox, index);
     667    }
     668    for (auto lastDisplayBoxForInlineTextBoxIndex : lastDisplayBoxForInlineTextBoxIndexes)
     669        boxes[lastDisplayBoxForInlineTextBoxIndex.value].setIsLastBox(true);
     670}
     671
    652672}
    653673}
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h

    r286500 r286534  
    4444    DisplayBoxes build(const LineBuilder::LineContent&, const LineBox&, const InlineRect& lineBoxLogicalRect, const size_t lineIndex);
    4545
     46    static void computeIsFirstIsLastBoxForInlineContent(DisplayBoxes&);
     47
    4648private:
    4749    void processNonBidiContent(const LineBuilder::LineContent&, const LineBox&, const InlineLayoutPoint& lineBoxLogicalTopLeft, DisplayBoxes&);
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp

    r286178 r286534  
    146146    lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
    147147    computeStaticPositionForOutOfFlowContent(formattingState().outOfFlowBoxes());
     148    InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(formattingState().boxes());
    148149    LOG_WITH_STREAM(FormattingContextLayout, stream << "[End] -> inline formatting context -> formatting root(" << &root() << ")");
    149150}
     
    156157    lineLayout(inlineItems, { 0, inlineItems.size() }, constraints);
    157158    computeStaticPositionForOutOfFlowContent(formattingState().outOfFlowBoxes());
     159    InlineDisplayContentBuilder::computeIsFirstIsLastBoxForInlineContent(formattingState().boxes());
    158160}
    159161
  • trunk/Source/WebCore/layout/formattingContexts/inline/display/InlineDisplayBox.h

    r286518 r286534  
    131131
    132132    void setIsLastBox(bool isLastBox) { m_isLastWithinInlineLevelBox = isLastBox; }
     133    void setIsFirstBox(bool isFirstBox) { m_isFirstWithinInlineLevelBox = isFirstBox; }
    133134
    134135private:
Note: See TracChangeset for help on using the changeset viewer.