Title: [285956] trunk/Source/WebCore
Revision
285956
Author
[email protected]
Date
2021-11-17 14:55:08 -0800 (Wed, 17 Nov 2021)

Log Message

[LFC][IFC] Introduce enum class IntrinsicWidthMode
https://bugs.webkit.org/show_bug.cgi?id=233277

Reviewed by Antti Koivisto.

This is in preparation for being able to apply different glyph hanging behavior for min and max intrinsic width computation.

* layout/formattingContexts/FormattingConstraints.h:
* layout/formattingContexts/inline/InlineContentBreaker.cpp:
(WebCore::Layout::InlineContentBreaker::InlineContentBreaker):
* layout/formattingContexts/inline/InlineContentBreaker.h:
(WebCore::Layout::InlineContentBreaker::isInIntrinsicWidthMode const):
* layout/formattingContexts/inline/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints):
(WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
* layout/formattingContexts/inline/InlineFormattingContext.h:
* layout/formattingContexts/inline/InlineLineBuilder.cpp:
(WebCore::Layout::LineBuilder::LineBuilder):
(WebCore::Layout::LineBuilder::computedIntrinsicWidth):
(WebCore::Layout::LineBuilder::placeInlineContent):
* layout/formattingContexts/inline/InlineLineBuilder.h:
(WebCore::Layout::LineBuilder::intrinsicWidthMode const):
(WebCore::Layout::LineBuilder::isInIntrinsicWidthMode const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285955 => 285956)


--- trunk/Source/WebCore/ChangeLog	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/ChangeLog	2021-11-17 22:55:08 UTC (rev 285956)
@@ -1,3 +1,29 @@
+2021-11-17  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] Introduce enum class IntrinsicWidthMode
+        https://bugs.webkit.org/show_bug.cgi?id=233277
+
+        Reviewed by Antti Koivisto.
+
+        This is in preparation for being able to apply different glyph hanging behavior for min and max intrinsic width computation.
+
+        * layout/formattingContexts/FormattingConstraints.h:
+        * layout/formattingContexts/inline/InlineContentBreaker.cpp:
+        (WebCore::Layout::InlineContentBreaker::InlineContentBreaker):
+        * layout/formattingContexts/inline/InlineContentBreaker.h:
+        (WebCore::Layout::InlineContentBreaker::isInIntrinsicWidthMode const):
+        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints):
+        (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
+        * layout/formattingContexts/inline/InlineFormattingContext.h:
+        * layout/formattingContexts/inline/InlineLineBuilder.cpp:
+        (WebCore::Layout::LineBuilder::LineBuilder):
+        (WebCore::Layout::LineBuilder::computedIntrinsicWidth):
+        (WebCore::Layout::LineBuilder::placeInlineContent):
+        * layout/formattingContexts/inline/InlineLineBuilder.h:
+        (WebCore::Layout::LineBuilder::intrinsicWidthMode const):
+        (WebCore::Layout::LineBuilder::isInIntrinsicWidthMode const):
+
 2021-11-17  Chris Dumez  <[email protected]>
 
         Web Locks API does get enabled in Service Workers when running layout tests

Modified: trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h	2021-11-17 22:55:08 UTC (rev 285956)
@@ -87,6 +87,11 @@
 {
 }
 
+enum class IntrinsicWidthMode {
+    Minimum,
+    Maximum
+};
+
 struct IntrinsicWidthConstraints {
     void expand(LayoutUnit horizontalValue);
     IntrinsicWidthConstraints& operator+=(const IntrinsicWidthConstraints&);

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp	2021-11-17 22:55:08 UTC (rev 285956)
@@ -125,8 +125,8 @@
     return { };
 }
 
-InlineContentBreaker::InlineContentBreaker(bool isInIntrinsicWidthMode)
-    : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode)
+InlineContentBreaker::InlineContentBreaker(std::optional<IntrinsicWidthMode> intrinsicWidthMode)
+    : m_intrinsicWidthMode(intrinsicWidthMode)
 {
 }
 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h	2021-11-17 22:55:08 UTC (rev 285956)
@@ -27,6 +27,7 @@
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
+#include "FormattingConstraints.h"
 #include "LayoutUnits.h"
 #include "RenderStyle.h"
 
@@ -38,7 +39,7 @@
 
 class InlineContentBreaker {
 public:
-    InlineContentBreaker(bool isInIntrinsicWidthMode);
+    InlineContentBreaker(std::optional<IntrinsicWidthMode>);
 
     struct PartialRun {
         size_t length { 0 };
@@ -150,9 +151,9 @@
     };
     OptionSet<WordBreakRule> wordBreakBehavior(const RenderStyle&, bool hasWrapOpportunityAtPreviousPosition) const;
     bool shouldKeepEndOfLineWhitespace(const ContinuousContent&) const;
-    bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
+    bool isInIntrinsicWidthMode() const { return !!m_intrinsicWidthMode; }
 
-    bool m_isInIntrinsicWidthMode { false };
+    std::optional<IntrinsicWidthMode> m_intrinsicWidthMode;
     bool n_hyphenationIsDisabled { false };
 };
 

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp	2021-11-17 22:55:08 UTC (rev 285956)
@@ -397,34 +397,34 @@
 
     collectContentIfNeeded();
 
-    auto maximumLineWidth = [&](auto availableWidth) {
+    auto maximumLineWidth = [&](auto intrinsicWidthMode) {
         // Switch to the min/max formatting root width values before formatting the lines.
         for (auto* formattingRoot : formattingContextRootList) {
             auto intrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).intrinsicWidthConstraintsForBox(*formattingRoot);
             auto& boxGeometry = formattingState().boxGeometry(*formattingRoot);
-            auto contentWidth = (availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();
+            auto contentWidth = (intrinsicWidthMode == IntrinsicWidthMode::Maximum ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();
             boxGeometry.setContentBoxWidth(contentWidth);
         }
-        return computedIntrinsicWidthForConstraint(availableWidth);
+        return computedIntrinsicWidthForConstraint(intrinsicWidthMode);
     };
 
-    auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(0));
-    auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(maxInlineLayoutUnit()));
+    auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Minimum));
+    auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Maximum));
     auto constraints = formattingGeometry().constrainByMinMaxWidth(root(), { minimumContentWidth, maximumContentWidth });
     formattingState().setIntrinsicWidthConstraints(constraints);
     return constraints;
 }
 
-InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const
+InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(IntrinsicWidthMode intrinsicWidthMode) const
 {
     auto& inlineItems = formattingState().inlineItems();
-    auto lineBuilder = LineBuilder { *this, inlineItems };
+    auto lineBuilder = LineBuilder { *this, inlineItems, intrinsicWidthMode };
     auto layoutRange = LineBuilder::InlineItemRange { 0 , inlineItems.size() };
     auto maximumLineWidth = InlineLayoutUnit { };
     auto maximumFloatWidth = LayoutUnit { };
     auto isFirstLine = true;
     while (!layoutRange.isEmpty()) {
-        auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, availableWidth, isFirstLine);
+        auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, isFirstLine);
         layoutRange.start = intrinsicContent.inlineItemRange.end;
         maximumLineWidth = std::max(maximumLineWidth, intrinsicContent.logicalWidth);
         isFirstLine = false;

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h	2021-11-17 22:55:08 UTC (rev 285956)
@@ -65,7 +65,7 @@
     void computeStaticPositionForOutOfFlowContent(const FormattingState::OutOfFlowBoxList&);
 
     void computeIntrinsicWidthForFormattingRoot(const Box&);
-    InlineLayoutUnit computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const;
+    InlineLayoutUnit computedIntrinsicWidthForConstraint(IntrinsicWidthMode) const;
 
     void computeHorizontalMargin(const Box&, const HorizontalConstraints&);
     void computeHeightAndMargin(const Box&, const HorizontalConstraints&);

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp	2021-11-17 22:55:08 UTC (rev 285956)
@@ -269,8 +269,8 @@
     return boxGeometry.marginBoxWidth();
 }
 
-LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
-    : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
+LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode)
+    : m_intrinsicWidthMode(intrinsicWidthMode)
     , m_inlineFormattingContext(inlineFormattingContext)
     , m_inlineFormattingState(&inlineFormattingContext.formattingState())
     , m_floatingState(&floatingState)
@@ -280,8 +280,8 @@
 {
 }
 
-LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
-    : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
+LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode)
+    : m_intrinsicWidthMode(intrinsicWidthMode)
     , m_inlineFormattingContext(inlineFormattingContext)
     , m_line(inlineFormattingContext)
     , m_inlineItems(inlineItems)
@@ -326,9 +326,11 @@
         , lineRuns };
 }
 
-LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, InlineLayoutUnit availableWidth, bool isFirstLine)
+LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, bool isFirstLine)
 {
-    auto lineConstraints = initialConstraintsForLine({ 0, 0, availableWidth, 0 }, isFirstLine);
+    ASSERT(isInIntrinsicWidthMode());
+    auto lineLogicalWidth = *intrinsicWidthMode() == IntrinsicWidthMode::Maximum ? maxInlineLayoutUnit() : 0.f;
+    auto lineConstraints = initialConstraintsForLine({ 0, 0, lineLogicalWidth, 0 }, isFirstLine);
     initialize(lineConstraints, isFirstLine, needsLayoutRange.start, { }, { });
 
     auto committedContent = placeInlineContent(needsLayoutRange);
@@ -393,7 +395,7 @@
 LineBuilder::CommittedContent LineBuilder::placeInlineContent(const InlineItemRange& needsLayoutRange)
 {
     auto lineCandidate = LineCandidate { layoutState().shouldIgnoreTrailingLetterSpacing() };
-    auto inlineContentBreaker = InlineContentBreaker { isInIntrinsicWidthMode() };
+    auto inlineContentBreaker = InlineContentBreaker { intrinsicWidthMode() };
 
     auto currentItemIndex = needsLayoutRange.start;
     size_t committedInlineItemCount = 0;

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h (285955 => 285956)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h	2021-11-17 22:51:04 UTC (rev 285955)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h	2021-11-17 22:55:08 UTC (rev 285956)
@@ -27,6 +27,7 @@
 
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
+#include "FormattingConstraints.h"
 #include "InlineContentBreaker.h"
 #include "InlineFormattingState.h"
 #include "InlineLine.h"
@@ -39,9 +40,8 @@
 
 class LineBuilder {
 public:
-    enum class IsInIntrinsicWidthMode { No, Yes };
-    LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::No);
-    LineBuilder(const InlineFormattingContext&, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::Yes);
+    LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, std::optional<IntrinsicWidthMode> = std::nullopt);
+    LineBuilder(const InlineFormattingContext&, const InlineItems&, std::optional<IntrinsicWidthMode>);
 
     struct InlineItemRange {
         bool isEmpty() const { return start == end; }
@@ -72,7 +72,7 @@
         InlineLayoutUnit logicalWidth { 0 };
         const FloatList& floats;
     };
-    IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, InlineLayoutUnit availableWidth, bool isFirstLine);
+    IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, bool isFirstLine);
 
 private:
     void candidateContentForLine(LineCandidate&, size_t inlineItemIndex, const InlineItemRange& needsLayoutRange, InlineLayoutUnit currentLogicalRight);
@@ -112,7 +112,8 @@
     InlineLayoutUnit inlineItemWidth(const InlineItem&, InlineLayoutUnit contentLogicalLeft) const;
     bool isLastLineWithInlineContent(const InlineItemRange& lineRange, size_t lastInlineItemIndex, bool hasPartialTrailingContent) const;
 
-    bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
+    std::optional<IntrinsicWidthMode> intrinsicWidthMode() const { return m_intrinsicWidthMode; }
+    bool isInIntrinsicWidthMode() const { return !!intrinsicWidthMode(); }
 
     const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
     InlineFormattingState* formattingState() { return m_inlineFormattingState; }
@@ -123,7 +124,7 @@
 
 private:
     bool m_isFirstLine { false };
-    bool m_isInIntrinsicWidthMode { false };
+    std::optional<IntrinsicWidthMode> m_intrinsicWidthMode;
     const InlineFormattingContext& m_inlineFormattingContext;
     InlineFormattingState* m_inlineFormattingState { nullptr };
     FloatingState* m_floatingState { nullptr };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to