Changeset 246634 in webkit
- Timestamp:
- Jun 20, 2019 8:18:27 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r246633 r246634 1 2019-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 1 23 2019-06-20 Zalan Bujtas <zalan@apple.com> 2 24 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r246633 r246634 98 98 public: 99 99 static bool lineDescentNeedsCollapsing(const LayoutState&, const Line::Content&); 100 static Line::InitialConstraints::HeightAndBaseline lineHeightConstraints(const LayoutState&, const Box& formattingRoot); 100 101 }; 101 102 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp
r246633 r246634 128 128 InlineFormattingContext::LineLayout::LineContent InlineFormattingContext::LineLayout::placeInlineItems(const LineInput& lineInput) const 129 129 { 130 auto mimimumLineHeight = m_formattingRoot.style().computedLineHeight();131 auto initialBaselineOffset = Line::halfLeadingMetrics(m_formattingRoot.style().fontMetrics(), mimimumLineHeight).ascent;132 130 auto initialLineConstraints = Line::InitialConstraints { 133 131 lineInput.horizontalConstraint.logicalTopLeft, 134 132 lineInput.horizontalConstraint.availableLogicalWidth, 135 mimimumLineHeight, 136 initialBaselineOffset 133 Quirks::lineHeightConstraints(layoutState(), m_formattingRoot) 137 134 }; 138 135 auto line = Line { layoutState(), initialLineConstraints, lineInput.skipVerticalAligment }; -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextQuirks.cpp
r246540 r246634 83 83 } 84 84 85 Line::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 85 105 } 86 106 } -
trunk/Source/WebCore/layout/inlineformatting/InlineLine.cpp
r246633 r246634 49 49 , m_content(std::make_unique<Line::Content>()) 50 50 , 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) 53 54 , m_lineLogicalWidth(initialConstraints.availableWidth) 54 55 , m_skipVerticalAligment(skipVerticalAligment == SkipVerticalAligment::Yes) … … 255 256 logicalRect.setLeft(contentLogicalRight()); 256 257 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 } 259 263 260 264 auto textContext = Content::Run::TextContext { inlineItem.start(), inlineItem.isCollapsed() ? 1 : inlineItem.length() }; … … 296 300 logicalRect.setLeft(contentLogicalRight()); 297 301 logicalRect.setWidth({ }); 298 if (!m_skipVerticalAligment) 302 if (!m_skipVerticalAligment) { 303 adjustBaselineAndLineHeight(inlineItem, { }); 299 304 logicalRect.setHeight(logicalHeight()); 305 } 300 306 m_content->runs().append(std::make_unique<Content::Run>(inlineItem, logicalRect, Content::Run::TextContext { }, false, false)); 301 307 } … … 303 309 void Line::adjustBaselineAndLineHeight(const InlineItem& inlineItem, LayoutUnit runHeight) 304 310 { 305 ASSERT(!inlineItem.isContainerEnd() && !inlineItem.isText());311 ASSERT(!inlineItem.isContainerEnd()); 306 312 auto& layoutBox = inlineItem.layoutBox(); 307 313 auto& style = layoutBox.style(); … … 315 321 m_baseline.ascent = std::max(m_baseline.ascent, halfLeading.ascent); 316 322 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 = { }; 317 333 return; 318 334 } -
trunk/Source/WebCore/layout/inlineformatting/InlineLine.h
r246633 r246634 42 42 LayoutPoint topLeft; 43 43 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; 46 50 }; 47 51 enum class SkipVerticalAligment { No, Yes }; … … 142 146 LayoutUnit m_baselineTop; 143 147 148 Optional<LineBox::Baseline> m_initialStrut; 144 149 LayoutUnit m_contentLogicalHeight; 145 150 LayoutUnit m_lineLogicalWidth;
Note: See TracChangeset
for help on using the changeset viewer.