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

Changeset 282386 in webkit


Ignore:
Timestamp:
Sep 14, 2021, 6:19:06 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] InlineDisplayContentBuilder should not operate on the global inline run list
​https://bugs.webkit.org/show_bug.cgi?id=230232

Reviewed by Antti Koivisto.

InlineDisplayContentBuilder builds one line worth of runs. It should not have access to the global (all runs in the formatting context) run list.

  • layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:

(WebCore::Layout::InlineDisplayContentBuilder::build):
(WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent):
(WebCore::Layout::InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes):
(WebCore::Layout::InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns):

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

(WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent):

  • layout/formattingContexts/inline/InlineFormattingState.h:

(WebCore::Layout::InlineFormattingState::addRuns):
(WebCore::Layout::InlineFormattingState::addRun): Deleted.

  • layout/formattingContexts/inline/InlineLineRun.h:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r282382 r282386  
     12021-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
    1232021-09-14  Xabier Rodriguez Calvar  <calvaris@igalia.com>
    224
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp

    r282306 r282386  
    4343}
    4444
    45 void InlineDisplayContentBuilder::build(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex)
    46 {
    47     auto& formattingState = this->formattingState();
     45InlineRuns 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
    4850    // Every line starts with a root run, even the empty ones.
    4951    auto rootInlineBoxRect = lineBox.logicalRectForRootInlineBox();
    5052    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
     61void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineContent(const LineBuilder::LineContent& lineContent, const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns& runs)
    5862{
    5963    auto& formattingState = this->formattingState();
    … …  
    8791                return text->needsHyphen ? makeString(content.substring(text->start, text->length), style.hyphenString()) : String();
    8892            };
    89             formattingState.addRun({ lineIndex
     93            runs.append({ lineIndex
    9094                , Run::Type::Text
    9195                , layoutBox
    … …  
    102106            ASSERT(lineRun.textContent() && is<InlineTextBox>(layoutBox));
    103107            auto& text = lineRun.textContent();
    104             formattingState.addRun({ lineIndex
     108            runs.append({ lineIndex
    105109                , Run::Type::SoftLineBreak
    106110                , layoutBox
    … …  
    115119            auto lineBreakBoxRect = lineBox.logicalRectForLineBreakBox(layoutBox);
    116120            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(), { } });
    118122
    119123            auto& boxGeometry = formattingState.boxGeometry(layoutBox);
    … …  
    128132            logicalBorderBox.moveBy(lineBoxLogicalTopLeft);
    129133            // 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(), { } });
    131135
    132136            auto borderBoxLogicalTopLeft = logicalBorderBox.topLeft();
    … …  
    142146                }
    143147                RELEASE_ASSERT(m_inlineBoxRunIndexMap.contains(&parentInlineBox));
    144                 formattingState.runs()[m_inlineBoxRunIndexMap.get(&parentInlineBox)].adjustInkOverflow(logicalBorderBox);
     148                runs[m_inlineBoxRunIndexMap.get(&parentInlineBox)].adjustInkOverflow(logicalBorderBox);
    145149            };
    146150            adjustParentInlineBoxInkOverflow();
    … …  
    154158            if (lineBox.hasContent()) {
    155159                // 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() });
    158162            }
    159163
    … …  
    174178}
    175179
    176 void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex)
     180void InlineDisplayContentBuilder::createRunsAndUpdateGeometryForLineSpanningInlineBoxes(const LineBox& lineBox, const InlineLayoutPoint& lineBoxLogicalTopLeft, const size_t lineIndex, InlineRuns& runs)
    177181{
    178182    if (!lineBox.hasContent()) {
    … …  
    193197        inlineBoxBorderBox.moveBy(lineBoxLogicalTopLeft);
    194198
    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 });
    197201
    198202        auto inlineBoxSize = LayoutSize { LayoutUnit::fromFloatCeil(inlineBoxBorderBox.width()), LayoutUnit::fromFloatCeil(inlineBoxBorderBox.height()) };
    … …  
    208212}
    209213
    210 void InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns(const LineBox& lineBox)
     214void InlineDisplayContentBuilder::collectInkOverflowForInlineBoxRuns(const LineBox& lineBox, InlineRuns& runs)
    211215{
    212216    if (m_inlineBoxRunIndexMap.isEmpty() || !lineBox.hasContent()) {
    … …  
    215219    }
    216220
    217     auto& formattingState = this->formattingState();
    218221    auto& nonRootInlineLevelBoxes = lineBox.nonRootInlineLevelBoxes();
    219222    // Visit the inline boxes and propagate ink overflow to their parents -except to the root inline box.
    … …  
    227230            continue;
    228231        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)];
    231234        parentInlineBoxRun.adjustInkOverflow(inkOverflow);
    232235    }
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.h

    r282141 r282386  
    4242    InlineDisplayContentBuilder(const ContainerBox& formattingContextRoot, InlineFormattingState&);
    4343
    44     void build(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);
    4545
    4646private:
    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&);
    5050
    5151    const ContainerBox& root() const { return m_formattingContextRoot; }
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp

    r282348 r282386  
    571571{
    572572    auto& formattingState = this->formattingState();
     573    auto lineBoxAndGeometry = LineBoxBuilder(*this).build(lineContent);
     574    auto lineBoxLogicalRect = lineBoxAndGeometry.lineGeometry.lineBoxLogicalRect();
     575
     576    auto inlineContentBuilder = InlineDisplayContentBuilder { root(), formattingState };
    573577    auto currentLineIndex = formattingState.lines().size();
    574 
    575     auto lineBoxAndGeometry = LineBoxBuilder(*this).build(lineContent);
     578    formattingState.addRuns(inlineContentBuilder.build(lineContent, lineBoxAndGeometry.lineBox, lineBoxLogicalRect.topLeft(), currentLineIndex));
    576579    formattingState.addLineBox(WTFMove(lineBoxAndGeometry.lineBox));
    577580    formattingState.addLine(lineBoxAndGeometry.lineGeometry);
    578581
    579     auto lineBoxLogicalRect = lineBoxAndGeometry.lineGeometry.lineBoxLogicalRect();
    580 
    581     InlineDisplayContentBuilder(root(), formattingState).build(lineContent, formattingState.lineBoxes().last(), lineBoxLogicalRect.topLeft(), currentLineIndex);
    582582    return lineBoxLogicalRect;
    583583}
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingState.h

    r281800 r282386  
    6363    const InlineRuns& runs() const { return m_runs; }
    6464    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)); }
    6666
    6767    void setClearGapAfterLastLine(InlineLayoutUnit verticalGap);
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineRun.h

    r282306 r282386  
    115115
    116116private:
    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 };
    119119    WeakPtr<const Layout::Box> m_layoutBox;
    120120    InlineRect m_logicalRect;
Note: See TracChangeset for help on using the changeset viewer.