Title: [294994] trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp
Revision
294994
Author
za...@apple.com
Date
2022-05-28 05:43:31 -0700 (Sat, 28 May 2022)

Log Message

Introduce ShrinkingFlexItem structure
https://bugs.webkit.org/show_bug.cgi?id=241033

Reviewed by Antti Koivisto.

This local structure caches some of the shrinking related values.

* Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp:
(WebCore::Layout::FlexFormattingContext::computeLogicalWidthForShrinkingFlexItems):

Canonical link: https://commits.webkit.org/251094@main

Modified Paths

Diff

Modified: trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp (294993 => 294994)


--- trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp	2022-05-28 10:43:58 UTC (rev 294993)
+++ trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp	2022-05-28 12:43:31 UTC (rev 294994)
@@ -211,8 +211,15 @@
     auto totalShrink = 0.f;
     auto totalFlexibleSpace = LayoutUnit { };
     auto flexShrinkBase = 0.f;
-    Vector<size_t> shrinkingItems;
 
+    struct ShrinkingFlexItem {
+        float flexShrink { 0 };
+        LayoutUnit minimumSize;
+        LayoutUnit flexBasis;
+        LogicalFlexItem& flexItem;
+    };
+    Vector<ShrinkingFlexItem> shrinkingItems;
+
     auto computeTotalShrinkAndOverflowingSpace = [&] {
         // Collect flex items with non-zero flex-shrink value. flex-shrink: 0 flex items
         // don't participate in content flexing.
@@ -219,9 +226,10 @@
         for (size_t index = 0; index < logicalFlexItemList.size(); ++index) {
             auto& flexItem = logicalFlexItemList[index];
             auto baseSize = flexItem.rect.width();
-            if (auto flexShrink = flexItem.layoutBox->style().flexShrink()) {
-                shrinkingItems.append(index);
-                totalShrink += flexShrink * baseSize;
+            if (auto shrinkValue = flexItem.layoutBox->style().flexShrink()) {
+                auto flexShrink = shrinkValue * baseSize;
+                shrinkingItems.append({ flexShrink, formattingState.intrinsicWidthConstraintsForBox(*flexItem.layoutBox)->minimum, baseSize, flexItem });
+                totalShrink += flexShrink;
                 totalFlexibleSpace += baseSize;
             } else
                 availableSpace -= baseSize;
@@ -234,17 +242,12 @@
     auto adjustShrinkBase = [&] {
         // Now that we know how much each flex item needs to be shrunk, let's check
         // if they hit their minimum content width (i.e. whether they can be sized that small).
-        for (auto flexItemIndex : shrinkingItems) {
-            auto& flexItem = logicalFlexItemList[flexItemIndex];
-
-            auto baseSize = flexItem.rect.width();
-            auto flexShrink = flexItem.layoutBox->style().flexShrink() * baseSize;
-            auto flexedSize = baseSize - (flexShrink * flexShrinkBase);
-            auto minimumSize = formattingState.intrinsicWidthConstraintsForBox(*flexItem.layoutBox)->minimum;
-            if (minimumSize >= flexedSize) {
-                totalShrink -= flexShrink;
-                totalFlexibleSpace -= baseSize;
-                availableSpace -= minimumSize;
+        for (auto& shirinkingFlex : shrinkingItems) {
+            auto flexedSize = shirinkingFlex.flexBasis - (shirinkingFlex.flexShrink * flexShrinkBase);
+            if (shirinkingFlex.minimumSize > flexedSize) {
+                totalShrink -= shirinkingFlex.flexShrink;
+                totalFlexibleSpace -= shirinkingFlex.flexBasis;
+                availableSpace -= shirinkingFlex.minimumSize;
             }
         }
         flexShrinkBase = totalShrink ? (totalFlexibleSpace - availableSpace) / totalShrink : 0.f;
@@ -253,14 +256,9 @@
 
     auto computeLogicalWidth = [&] {
         // Adjust the total grow width by the overflow value (shrink) except when min content with disagrees.
-        for (auto flexItemIndex : shrinkingItems) {
-            auto& flexItem = logicalFlexItemList[flexItemIndex];
-
-            auto baseSize = flexItem.rect.width();
-            auto flexShrink = flexItem.layoutBox->style().flexShrink() * baseSize;
-            auto flexedSize = LayoutUnit { baseSize - (flexShrink * flexShrinkBase) };
-            auto minimumSize = formattingState.intrinsicWidthConstraintsForBox(*flexItem.layoutBox)->minimum;
-            flexItem.rect.setWidth(std::max(minimumSize, flexedSize));
+        for (auto& shirinkingFlex : shrinkingItems) {
+            auto flexedSize = LayoutUnit { shirinkingFlex.flexBasis - (shirinkingFlex.flexShrink * flexShrinkBase) };
+            shirinkingFlex.flexItem.rect.setWidth(std::max(shirinkingFlex.minimumSize, flexedSize));
         }
     };
     computeLogicalWidth();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to