Changeset 285956 in webkit
- Timestamp:
- Nov 17, 2021, 2:55:08 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/FormattingConstraints.h (modified) (1 diff)
-
layout/formattingContexts/inline/InlineContentBreaker.cpp (modified) (1 diff)
-
layout/formattingContexts/inline/InlineContentBreaker.h (modified) (3 diffs)
-
layout/formattingContexts/inline/InlineFormattingContext.cpp (modified) (3 diffs)
-
layout/formattingContexts/inline/InlineFormattingContext.h (modified) (1 diff)
-
layout/formattingContexts/inline/InlineLineBuilder.cpp (modified) (4 diffs)
-
layout/formattingContexts/inline/InlineLineBuilder.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r285954 r285956 1 2021-11-17 Alan Bujtas <zalan@apple.com> 2 3 [LFC][IFC] Introduce enum class IntrinsicWidthMode 4 https://bugs.webkit.org/show_bug.cgi?id=233277 5 6 Reviewed by Antti Koivisto. 7 8 This is in preparation for being able to apply different glyph hanging behavior for min and max intrinsic width computation. 9 10 * layout/formattingContexts/FormattingConstraints.h: 11 * layout/formattingContexts/inline/InlineContentBreaker.cpp: 12 (WebCore::Layout::InlineContentBreaker::InlineContentBreaker): 13 * layout/formattingContexts/inline/InlineContentBreaker.h: 14 (WebCore::Layout::InlineContentBreaker::isInIntrinsicWidthMode const): 15 * layout/formattingContexts/inline/InlineFormattingContext.cpp: 16 (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints): 17 (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const): 18 * layout/formattingContexts/inline/InlineFormattingContext.h: 19 * layout/formattingContexts/inline/InlineLineBuilder.cpp: 20 (WebCore::Layout::LineBuilder::LineBuilder): 21 (WebCore::Layout::LineBuilder::computedIntrinsicWidth): 22 (WebCore::Layout::LineBuilder::placeInlineContent): 23 * layout/formattingContexts/inline/InlineLineBuilder.h: 24 (WebCore::Layout::LineBuilder::intrinsicWidthMode const): 25 (WebCore::Layout::LineBuilder::isInIntrinsicWidthMode const): 26 1 27 2021-11-17 Chris Dumez <cdumez@apple.com> 2 28 -
trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h
r278292 r285956 88 88 } 89 89 90 enum class IntrinsicWidthMode { 91 Minimum, 92 Maximum 93 }; 94 90 95 struct IntrinsicWidthConstraints { 91 96 void expand(LayoutUnit horizontalValue); -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp
r285933 r285956 126 126 } 127 127 128 InlineContentBreaker::InlineContentBreaker( bool isInIntrinsicWidthMode)129 : m_i sInIntrinsicWidthMode(isInIntrinsicWidthMode)128 InlineContentBreaker::InlineContentBreaker(std::optional<IntrinsicWidthMode> intrinsicWidthMode) 129 : m_intrinsicWidthMode(intrinsicWidthMode) 130 130 { 131 131 } -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h
r285930 r285956 28 28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT) 29 29 30 #include "FormattingConstraints.h" 30 31 #include "LayoutUnits.h" 31 32 #include "RenderStyle.h" … … 39 40 class InlineContentBreaker { 40 41 public: 41 InlineContentBreaker( bool isInIntrinsicWidthMode);42 InlineContentBreaker(std::optional<IntrinsicWidthMode>); 42 43 43 44 struct PartialRun { … … 151 152 OptionSet<WordBreakRule> wordBreakBehavior(const RenderStyle&, bool hasWrapOpportunityAtPreviousPosition) const; 152 153 bool shouldKeepEndOfLineWhitespace(const ContinuousContent&) const; 153 bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }154 bool isInIntrinsicWidthMode() const { return !!m_intrinsicWidthMode; } 154 155 155 bool m_isInIntrinsicWidthMode { false };156 std::optional<IntrinsicWidthMode> m_intrinsicWidthMode; 156 157 bool n_hyphenationIsDisabled { false }; 157 158 }; -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp
r285806 r285956 398 398 collectContentIfNeeded(); 399 399 400 auto maximumLineWidth = [&](auto availableWidth) {400 auto maximumLineWidth = [&](auto intrinsicWidthMode) { 401 401 // Switch to the min/max formatting root width values before formatting the lines. 402 402 for (auto* formattingRoot : formattingContextRootList) { 403 403 auto intrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).intrinsicWidthConstraintsForBox(*formattingRoot); 404 404 auto& boxGeometry = formattingState().boxGeometry(*formattingRoot); 405 auto contentWidth = ( availableWidth? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();405 auto contentWidth = (intrinsicWidthMode == IntrinsicWidthMode::Maximum ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding(); 406 406 boxGeometry.setContentBoxWidth(contentWidth); 407 407 } 408 return computedIntrinsicWidthForConstraint( availableWidth);408 return computedIntrinsicWidthForConstraint(intrinsicWidthMode); 409 409 }; 410 410 411 auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth( 0));412 auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth( maxInlineLayoutUnit()));411 auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Minimum)); 412 auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Maximum)); 413 413 auto constraints = formattingGeometry().constrainByMinMaxWidth(root(), { minimumContentWidth, maximumContentWidth }); 414 414 formattingState().setIntrinsicWidthConstraints(constraints); … … 416 416 } 417 417 418 InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(In lineLayoutUnit availableWidth) const418 InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(IntrinsicWidthMode intrinsicWidthMode) const 419 419 { 420 420 auto& inlineItems = formattingState().inlineItems(); 421 auto lineBuilder = LineBuilder { *this, inlineItems };421 auto lineBuilder = LineBuilder { *this, inlineItems, intrinsicWidthMode }; 422 422 auto layoutRange = LineBuilder::InlineItemRange { 0 , inlineItems.size() }; 423 423 auto maximumLineWidth = InlineLayoutUnit { }; … … 425 425 auto isFirstLine = true; 426 426 while (!layoutRange.isEmpty()) { 427 auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, availableWidth,isFirstLine);427 auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, isFirstLine); 428 428 layoutRange.start = intrinsicContent.inlineItemRange.end; 429 429 maximumLineWidth = std::max(maximumLineWidth, intrinsicContent.logicalWidth); -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h
r285162 r285956 66 66 67 67 void computeIntrinsicWidthForFormattingRoot(const Box&); 68 InlineLayoutUnit computedIntrinsicWidthForConstraint(In lineLayoutUnit availableWidth) const;68 InlineLayoutUnit computedIntrinsicWidthForConstraint(IntrinsicWidthMode) const; 69 69 70 70 void computeHorizontalMargin(const Box&, const HorizontalConstraints&); -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp
r285948 r285956 270 270 } 271 271 272 LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)273 : m_i sInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)272 LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode) 273 : m_intrinsicWidthMode(intrinsicWidthMode) 274 274 , m_inlineFormattingContext(inlineFormattingContext) 275 275 , m_inlineFormattingState(&inlineFormattingContext.formattingState()) … … 281 281 } 282 282 283 LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)284 : m_i sInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)283 LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode) 284 : m_intrinsicWidthMode(intrinsicWidthMode) 285 285 , m_inlineFormattingContext(inlineFormattingContext) 286 286 , m_line(inlineFormattingContext) … … 327 327 } 328 328 329 LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, InlineLayoutUnit availableWidth, bool isFirstLine) 330 { 331 auto lineConstraints = initialConstraintsForLine({ 0, 0, availableWidth, 0 }, isFirstLine); 329 LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, bool isFirstLine) 330 { 331 ASSERT(isInIntrinsicWidthMode()); 332 auto lineLogicalWidth = *intrinsicWidthMode() == IntrinsicWidthMode::Maximum ? maxInlineLayoutUnit() : 0.f; 333 auto lineConstraints = initialConstraintsForLine({ 0, 0, lineLogicalWidth, 0 }, isFirstLine); 332 334 initialize(lineConstraints, isFirstLine, needsLayoutRange.start, { }, { }); 333 335 … … 394 396 { 395 397 auto lineCandidate = LineCandidate { layoutState().shouldIgnoreTrailingLetterSpacing() }; 396 auto inlineContentBreaker = InlineContentBreaker { i sInIntrinsicWidthMode() };398 auto inlineContentBreaker = InlineContentBreaker { intrinsicWidthMode() }; 397 399 398 400 auto currentItemIndex = needsLayoutRange.start; -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h
r285930 r285956 28 28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT) 29 29 30 #include "FormattingConstraints.h" 30 31 #include "InlineContentBreaker.h" 31 32 #include "InlineFormattingState.h" … … 40 41 class LineBuilder { 41 42 public: 42 enum class IsInIntrinsicWidthMode { No, Yes }; 43 LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::No); 44 LineBuilder(const InlineFormattingContext&, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::Yes); 43 LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, std::optional<IntrinsicWidthMode> = std::nullopt); 44 LineBuilder(const InlineFormattingContext&, const InlineItems&, std::optional<IntrinsicWidthMode>); 45 45 46 46 struct InlineItemRange { … … 73 73 const FloatList& floats; 74 74 }; 75 IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, InlineLayoutUnit availableWidth,bool isFirstLine);75 IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, bool isFirstLine); 76 76 77 77 private: … … 113 113 bool isLastLineWithInlineContent(const InlineItemRange& lineRange, size_t lastInlineItemIndex, bool hasPartialTrailingContent) const; 114 114 115 bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; } 115 std::optional<IntrinsicWidthMode> intrinsicWidthMode() const { return m_intrinsicWidthMode; } 116 bool isInIntrinsicWidthMode() const { return !!intrinsicWidthMode(); } 116 117 117 118 const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; } … … 124 125 private: 125 126 bool m_isFirstLine { false }; 126 bool m_isInIntrinsicWidthMode { false };127 std::optional<IntrinsicWidthMode> m_intrinsicWidthMode; 127 128 const InlineFormattingContext& m_inlineFormattingContext; 128 129 InlineFormattingState* m_inlineFormattingState { nullptr };
Note:
See TracChangeset
for help on using the changeset viewer.