WebKit Bugzilla
Attachment 372554 Details for
Bug 199057
: [LFC][IFC] Make the initial strut explicit
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-199057-20190620074757.patch (text/plain), 10.08 KB, created by
zalan
on 2019-06-20 07:47:59 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
zalan
Created:
2019-06-20 07:47:59 PDT
Size:
10.08 KB
patch
obsolete
>Subversion Revision: 246633 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 379724352c35c6c2346a586b1eb2c73f175e481c..e62420cbdc90ed1a7fed9b099970da9397b2a81a 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,25 @@ >+2019-06-20 Zalan Bujtas <zalan@apple.com> >+ >+ [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 <zalan@apple.com> > > [LFC][IFC] Introduce Line::InitialConstraints >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >index 3a8cd394a3cccc8bda87e91f912ab6866f3917ee..240d1629539282ebebc326664a028712ded26c2b 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h >@@ -97,6 +97,7 @@ private: > 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 { >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >index 914ed3011f768c6d0e24690590d0c2fd68a0ea88..1dc3c067adf437609a3cb74e26c65b9680bedd5c 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp >@@ -127,13 +127,10 @@ static LayoutUnit inlineItemWidth(const LayoutState& layoutState, const InlineIt > > 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 }; > >diff --git a/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp b/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp >index 13ec8e8bba4a0878584cf817b551b24f77579913..c2a7903910c77c2921d81f11c03366e76a0018a1 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp >@@ -82,6 +82,26 @@ bool InlineFormattingContext::Quirks::lineDescentNeedsCollapsing(const LayoutSta > 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 } }; >+} >+ > } > } > >diff --git a/Source/WebCore/layout/inlineformatting/InlineLine.cpp b/Source/WebCore/layout/inlineformatting/InlineLine.cpp >index 66fca2f5ba478152b132d6e0ddbb5e45ae3e9361..c0cd5da060038e760f4f6feaccb1b58ecb5ddb12 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineLine.cpp >+++ b/Source/WebCore/layout/inlineformatting/InlineLine.cpp >@@ -48,8 +48,9 @@ Line::Line(const LayoutState& layoutState, const InitialConstraints& initialCons > : 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 @@ void Line::appendTextContent(const InlineTextItem& inlineItem, LayoutUnit logica > 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 @@ void Line::appendHardLineBreak(const InlineItem& inlineItem) > 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 @@ void Line::adjustBaselineAndLineHeight(const InlineItem& inlineItem, LayoutUnit > 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: >diff --git a/Source/WebCore/layout/inlineformatting/InlineLine.h b/Source/WebCore/layout/inlineformatting/InlineLine.h >index c3e601ace6343d3dfcdb150778847e38d5689c0f..08f908a2144dbfe603ae49203ddf1845a5723c58 100644 >--- a/Source/WebCore/layout/inlineformatting/InlineLine.h >+++ b/Source/WebCore/layout/inlineformatting/InlineLine.h >@@ -41,8 +41,12 @@ public: > 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 @@ private: > LineBox::Baseline m_baseline; > LayoutUnit m_baselineTop; > >+ Optional<LineBox::Baseline> m_initialStrut; > LayoutUnit m_contentLogicalHeight; > LayoutUnit m_lineLogicalWidth; > bool m_skipVerticalAligment { false };
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 199057
:
372529
| 372554