Changeset 246634 in webkit


Ignore:
Timestamp:
Jun 20, 2019 8:18:27 AM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Make the initial strut explicit
https://bugs.webkit.org/show_bug.cgi?id=199057
<rdar://problem/51927864>

Reviewed by Antti Koivisto.

The strut always sets the initial vertical constraints on the new line in strict mode. However in quirks mode
we can ignore it as long as there's no baseline type content on the line.

  • layout/inlineformatting/InlineFormattingContext.h:
  • layout/inlineformatting/InlineFormattingContextLineLayout.cpp:

(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):

  • layout/inlineformatting/InlineFormattingContextQuirks.cpp:

(WebCore::Layout::InlineFormattingContext::Quirks::lineHeightConstraints):

  • layout/inlineformatting/InlineLine.cpp:

(WebCore::Layout::Line::appendTextContent):
(WebCore::Layout::Line::appendHardLineBreak):
(WebCore::Layout::Line::adjustBaselineAndLineHeight):

  • layout/inlineformatting/InlineLine.h:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r246633 r246634  
     12019-06-20  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Make the initial strut explicit
     4        https://bugs.webkit.org/show_bug.cgi?id=199057
     5        <rdar://problem/51927864>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        The strut always sets the initial vertical constraints on the new line in strict mode. However in quirks mode
     10        we can ignore it as long as there's no baseline type content on the line. 
     11
     12        * layout/inlineformatting/InlineFormattingContext.h:
     13        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
     14        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
     15        * layout/inlineformatting/InlineFormattingContextQuirks.cpp:
     16        (WebCore::Layout::InlineFormattingContext::Quirks::lineHeightConstraints):
     17        * layout/inlineformatting/InlineLine.cpp:
     18        (WebCore::Layout::Line::appendTextContent):
     19        (WebCore::Layout::Line::appendHardLineBreak):
     20        (WebCore::Layout::Line::adjustBaselineAndLineHeight):
     21        * layout/inlineformatting/InlineLine.h:
     22
    1232019-06-20  Zalan Bujtas  <zalan@apple.com>
    224
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h

    r246633 r246634  
    9898    public:
    9999        static bool lineDescentNeedsCollapsing(const LayoutState&, const Line::Content&);
     100        static Line::InitialConstraints::HeightAndBaseline lineHeightConstraints(const LayoutState&, const Box& formattingRoot);
    100101    };
    101102
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp

    r246633 r246634  
    128128InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const
    129129{
    130     auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
    131     auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
    132130    auto initialLineConstraints = Line::InitialConstraints {
    133131        lineInput.horizontalConstraint.logicalTopLeft,
    134132        lineInput.horizontalConstraint.availableLogicalWidth,
    135         mimimumLineHeight,
    136         initialBaselineOffset
     133        Quirks::lineHeightConstraints(layoutState(), m_formattingRoot)
    137134    };
    138135    auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment };
  • trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp

    r246540 r246634  
    8383}
    8484
     85Line::InitialConstraints::HeightAndBaseline InlineFormattingContext::Quirks::lineHeightConstraints(const LayoutState& layoutState, const Box& formattingRoot)
     86{
     87    // computedLineHeight takes font-size into account when line-height is not set.
     88    // Strut is the imaginary box that we put on every line. It sets the initial vertical constraints for each new line.
     89    auto strutHeight = formattingRoot.style().computedLineHeight();
     90    auto strutBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), strutHeight).ascent;
     91    if (layoutState.inNoQuirksMode())
     92        return { strutHeight, strutBaselineOffset, { } };
     93
     94    auto lineHeight = formattingRoot.style().lineHeight();
     95    if (lineHeight.isPercentOrCalculated()) {
     96        auto initialBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), { }).ascent;
     97        return { initialBaselineOffset, initialBaselineOffset, LineBox::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
     98    }
     99    // FIXME: The only reason why we use intValue() here is to match current inline tree (integral)behavior.
     100    auto initialLineHeight = LayoutUnit { lineHeight.intValue() };
     101    auto initialBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), initialLineHeight).ascent;
     102    return { initialLineHeight, initialBaselineOffset, LineBox::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
     103}
     104
    85105}
    86106}
  • trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp

    r246633 r246634  
    4949    , m_content(std::make_unique<Line::Content>())
    5050    , m_logicalTopLeft(initialConstraints.topLeft)
    51     , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset })
    52     , m_contentLogicalHeight(initialConstraints.height)
     51    , m_baseline({ initialConstraints.heightAndBaseline.baselineOffset, initialConstraints.heightAndBaseline.height - initialConstraints.heightAndBaseline.baselineOffset })
     52    , m_initialStrut(initialConstraints.heightAndBaseline.strut)
     53    , m_contentLogicalHeight(initialConstraints.heightAndBaseline.height)
    5354    , m_lineLogicalWidth(initialConstraints.availableWidth)
    5455    , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
     
    255256    logicalRect.setLeft(contentLogicalRight());
    256257    logicalRect.setWidth(logicalWidth);
    257     if (!m_skipVerticalAligment)
    258         logicalRect.setHeight(inlineItemContentHeight(inlineItem));
     258    if (!m_skipVerticalAligment) {
     259        auto runHeight = inlineItemContentHeight(inlineItem);
     260        logicalRect.setHeight(runHeight);
     261        adjustBaselineAndLineHeight(inlineItem, runHeight);
     262    }
    259263
    260264    auto textContext = Content::Run::TextContext { inlineItem.start(), inlineItem.isCollapsed() ? 1 : inlineItem.length() };
     
    296300    logicalRect.setLeft(contentLogicalRight());
    297301    logicalRect.setWidth({ });
    298     if (!m_skipVerticalAligment)
     302    if (!m_skipVerticalAligment) {
     303        adjustBaselineAndLineHeight(inlineItem, { });
    299304        logicalRect.setHeight(logicalHeight());
     305    }
    300306    m_content->runs().append(std::make_unique<Content::Run>(inlineItem, logicalRect, Content::Run::TextContext { }, false, false));
    301307}
     
    303309void Line::adjustBaselineAndLineHeight(const InlineItem& inlineItem, LayoutUnit runHeight)
    304310{
    305     ASSERT(!inlineItem.isContainerEnd() && !inlineItem.isText());
     311    ASSERT(!inlineItem.isContainerEnd());
    306312    auto& layoutBox = inlineItem.layoutBox();
    307313    auto& style = layoutBox.style();
     
    315321            m_baseline.ascent = std::max(m_baseline.ascent, halfLeading.ascent);
    316322        m_contentLogicalHeight = std::max(m_contentLogicalHeight, baselineAlignedContentHeight());
     323        return;
     324    }
     325    // Apply initial strut if needed.
     326    if (inlineItem.isText() || inlineItem.isHardLineBreak()) {
     327        if (!m_initialStrut)
     328            return;
     329        m_baseline.ascent = std::max(m_initialStrut->ascent, m_baseline.ascent);
     330        m_baseline.descent = std::max(m_initialStrut->descent, m_baseline.descent);
     331        m_contentLogicalHeight = std::max(m_contentLogicalHeight, baselineAlignedContentHeight());
     332        m_initialStrut = { };
    317333        return;
    318334    }
  • trunk/Source/WebCore/layout/inlineformatting/InlineLine.h

    r246633 r246634  
    4242        LayoutPoint topLeft;
    4343        LayoutUnit availableWidth;
    44         LayoutUnit height;
    45         LayoutUnit baselineOffset;
     44        struct HeightAndBaseline {
     45            LayoutUnit height;
     46            LayoutUnit baselineOffset;
     47            Optional<LineBox::Baseline> strut;
     48        };
     49        HeightAndBaseline heightAndBaseline;
    4650    };
    4751    enum class SkipVerticalAligment { No, Yes };
     
    142146    LayoutUnit m_baselineTop;
    143147
     148    Optional<LineBox::Baseline> m_initialStrut;
    144149    LayoutUnit m_contentLogicalHeight;
    145150    LayoutUnit m_lineLogicalWidth;
Note: See TracChangeset for help on using the changeset viewer.