Title: [246634] trunk/Source/WebCore
Revision
246634
Author
[email protected]
Date
2019-06-20 08:18:27 -0700 (Thu, 20 Jun 2019)

Log 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246633 => 246634)


--- trunk/Source/WebCore/ChangeLog	2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/ChangeLog	2019-06-20 15:18:27 UTC (rev 246634)
@@ -1,5 +1,27 @@
 2019-06-20  Zalan Bujtas  <[email protected]>
 
+        [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:
+
+2019-06-20  Zalan Bujtas  <[email protected]>
+
         [LFC][IFC] Introduce Line::InitialConstraints
         https://bugs.webkit.org/show_bug.cgi?id=199056
         <rdar://problem/51927597>

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h (246633 => 246634)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h	2019-06-20 15:18:27 UTC (rev 246634)
@@ -97,6 +97,7 @@
     class Quirks {
     public:
         static bool lineDescentNeedsCollapsing(const LayoutState&, const Line::Content&);
+        static Line::InitialConstraints::HeightAndBaseline lineHeightConstraints(const LayoutState&, const Box& formattingRoot);
     };
 
     class Geometry : public FormattingContext::Geometry {

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246633 => 246634)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-20 15:18:27 UTC (rev 246634)
@@ -127,13 +127,10 @@
 
 InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const
 {
-    auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();
-    auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;
     auto initialLineConstraints = Line::InitialConstraints {
         lineInput.horizontalConstraint.logicalTopLeft,
         lineInput.horizontalConstraint.availableLogicalWidth,
-        mimimumLineHeight,
-        initialBaselineOffset
+        Quirks::lineHeightConstraints(layoutState(), m_formattingRoot)
     };
     auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment };
 

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp (246633 => 246634)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp	2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp	2019-06-20 15:18:27 UTC (rev 246634)
@@ -82,7 +82,27 @@
     return true;
 }
 
+Line::InitialConstraints::HeightAndBaseline InlineFormattingContext::Quirks::lineHeightConstraints(const LayoutState& layoutState, const Box& formattingRoot)
+{
+    // computedLineHeight takes font-size into account when line-height is not set.
+    // Strut is the imaginary box that we put on every line. It sets the initial vertical constraints for each new line.
+    auto strutHeight = formattingRoot.style().computedLineHeight();
+    auto strutBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), strutHeight).ascent;
+    if (layoutState.inNoQuirksMode())
+        return { strutHeight, strutBaselineOffset, { } };
+
+    auto lineHeight = formattingRoot.style().lineHeight();
+    if (lineHeight.isPercentOrCalculated()) {
+        auto initialBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), { }).ascent;
+        return { initialBaselineOffset, initialBaselineOffset, LineBox::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
+    }
+    // FIXME: The only reason why we use intValue() here is to match current inline tree (integral)behavior.
+    auto initialLineHeight = LayoutUnit { lineHeight.intValue() };
+    auto initialBaselineOffset = Line::halfLeadingMetrics(formattingRoot.style().fontMetrics(), initialLineHeight).ascent;
+    return { initialLineHeight, initialBaselineOffset, LineBox::Baseline { strutBaselineOffset, strutHeight - strutBaselineOffset } };
 }
+
 }
+}
 
 #endif

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp (246633 => 246634)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp	2019-06-20 15:18:27 UTC (rev 246634)
@@ -48,8 +48,9 @@
     : m_layoutState(layoutState)
     , m_content(std::make_unique<Line::Content>())
     , m_logicalTopLeft(initialConstraints.topLeft)
-    , m_baseline({ initialConstraints.baselineOffset, initialConstraints.height - initialConstraints.baselineOffset })
-    , m_contentLogicalHeight(initialConstraints.height)
+    , m_baseline({ initialConstraints.heightAndBaseline.baselineOffset, initialConstraints.heightAndBaseline.height - initialConstraints.heightAndBaseline.baselineOffset })
+    , m_initialStrut(initialConstraints.heightAndBaseline.strut)
+    , m_contentLogicalHeight(initialConstraints.heightAndBaseline.height)
     , m_lineLogicalWidth(initialConstraints.availableWidth)
     , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes)
 {
@@ -254,8 +255,11 @@
     auto logicalRect = Display::Rect { };
     logicalRect.setLeft(contentLogicalRight());
     logicalRect.setWidth(logicalWidth);
-    if (!m_skipVerticalAligment)
-        logicalRect.setHeight(inlineItemContentHeight(inlineItem));
+    if (!m_skipVerticalAligment) {
+        auto runHeight = inlineItemContentHeight(inlineItem);
+        logicalRect.setHeight(runHeight);
+        adjustBaselineAndLineHeight(inlineItem, runHeight);
+    }
 
     auto textContext = Content::Run::TextContext { inlineItem.start(), inlineItem.isCollapsed() ? 1 : inlineItem.length() };
     auto lineItem = std::make_unique<Content::Run>(inlineItem, logicalRect, textContext, isCompletelyCollapsed, canBeExtended);
@@ -295,14 +299,16 @@
     auto logicalRect = Display::Rect { };
     logicalRect.setLeft(contentLogicalRight());
     logicalRect.setWidth({ });
-    if (!m_skipVerticalAligment)
+    if (!m_skipVerticalAligment) {
+        adjustBaselineAndLineHeight(inlineItem, { });
         logicalRect.setHeight(logicalHeight());
+    }
     m_content->runs().append(std::make_unique<Content::Run>(inlineItem, logicalRect, Content::Run::TextContext { }, false, false));
 }
 
 void Line::adjustBaselineAndLineHeight(const InlineItem& inlineItem, LayoutUnit runHeight)
 {
-    ASSERT(!inlineItem.isContainerEnd() && !inlineItem.isText());
+    ASSERT(!inlineItem.isContainerEnd());
     auto& layoutBox = inlineItem.layoutBox();
     auto& style = layoutBox.style();
 
@@ -316,6 +322,16 @@
         m_contentLogicalHeight = std::max(m_contentLogicalHeight, baselineAlignedContentHeight());
         return;
     }
+    // Apply initial strut if needed.
+    if (inlineItem.isText() || inlineItem.isHardLineBreak()) {
+        if (!m_initialStrut)
+            return;
+        m_baseline.ascent = std::max(m_initialStrut->ascent, m_baseline.ascent);
+        m_baseline.descent = std::max(m_initialStrut->descent, m_baseline.descent);
+        m_contentLogicalHeight = std::max(m_contentLogicalHeight, baselineAlignedContentHeight());
+        m_initialStrut = { };
+        return;
+    }
     // Replaced and non-replaced inline level box.
     switch (inlineItem.style().verticalAlign()) {
     case VerticalAlign::Baseline:

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLine.h (246633 => 246634)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-06-20 13:59:12 UTC (rev 246633)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLine.h	2019-06-20 15:18:27 UTC (rev 246634)
@@ -41,8 +41,12 @@
     struct InitialConstraints {
         LayoutPoint topLeft;
         LayoutUnit availableWidth;
-        LayoutUnit height;
-        LayoutUnit baselineOffset;
+        struct HeightAndBaseline {
+            LayoutUnit height;
+            LayoutUnit baselineOffset;
+            Optional<LineBox::Baseline> strut;
+        };
+        HeightAndBaseline heightAndBaseline;
     };
     enum class SkipVerticalAligment { No, Yes };
     Line(const LayoutState&, const InitialConstraints&, SkipVerticalAligment);
@@ -141,6 +145,7 @@
     LineBox::Baseline m_baseline;
     LayoutUnit m_baselineTop;
 
+    Optional<LineBox::Baseline> m_initialStrut;
     LayoutUnit m_contentLogicalHeight;
     LayoutUnit m_lineLogicalWidth;
     bool m_skipVerticalAligment { false };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to