Title: [294240] trunk/Source/WebCore
Revision
294240
Author
za...@apple.com
Date
2022-05-16 10:35:40 -0700 (Mon, 16 May 2022)

Log Message

[LFC][FFC] Add support for logical ordering
https://bugs.webkit.org/show_bug.cgi?id=240442

Reviewed by Antti Koivisto.

Let's reorder the logicalFlexItemList when the 'order' property has a non-initial value.

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

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (294239 => 294240)


--- trunk/Source/WebCore/ChangeLog	2022-05-16 17:30:34 UTC (rev 294239)
+++ trunk/Source/WebCore/ChangeLog	2022-05-16 17:35:40 UTC (rev 294240)
@@ -1,5 +1,17 @@
 2022-05-16  Alan Bujtas  <za...@apple.com>
 
+        [LFC][FFC] Add support for logical ordering
+        https://bugs.webkit.org/show_bug.cgi?id=240442
+
+        Reviewed by Antti Koivisto.
+
+        Let's reorder the logicalFlexItemList when the 'order' property has a non-initial value.
+
+        * layout/formattingContexts/flex/FlexFormattingContext.cpp:
+        (WebCore::Layout::FlexFormattingContext::layoutInFlowContentForIntegration):
+
+2022-05-16  Alan Bujtas  <za...@apple.com>
+
         [LFC][FFC] Add "flex-direction: column-reverse" basic visual/logical conversion
         https://bugs.webkit.org/show_bug.cgi?id=240434
 

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


--- trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp	2022-05-16 17:30:34 UTC (rev 294239)
+++ trunk/Source/WebCore/layout/formattingContexts/flex/FlexFormattingContext.cpp	2022-05-16 17:35:40 UTC (rev 294240)
@@ -121,7 +121,8 @@
 
 struct FlexItemLogicalBox {
     FlexRect rect;
-    const ContainerBox& flexItem;
+    int logicalOrder { 0 };
+    CheckedPtr<const ContainerBox> flexItem;
 };
 
 void FlexFormattingContext::layoutInFlowContentForIntegration(const ConstraintsForInFlowContent& constraints)
@@ -128,11 +129,12 @@
 {
     auto& formattingState = this->formattingState();
     Vector<FlexItemLogicalBox> logicalFlexItemList;
+    auto flexItemsNeedReordering = false;
 
-
     auto convertVisualToLogical = [&] {
         // FIXME: Convert visual (row/column) direction to logical.
         auto direction = root().style().flexDirection();
+        auto previousLogicalOrder = std::optional<int> { };
 
         for (auto& flexItem : childrenOfType<ContainerBox>(root())) {
             auto& flexItemGeometry = formattingState.boxGeometry(flexItem);
@@ -151,11 +153,26 @@
                 ASSERT_NOT_REACHED();
                 break;
             }
-            logicalFlexItemList.append({ { logicalSize }, flexItem });
+            auto flexItemOrder = flexItem.style().order();
+            flexItemsNeedReordering = flexItemsNeedReordering || flexItemOrder != previousLogicalOrder.value_or(0);
+            previousLogicalOrder = flexItemOrder;
+
+            logicalFlexItemList.append({ { logicalSize }, flexItemOrder, &flexItem });
+
         }
     };
     convertVisualToLogical();
 
+    auto reorderFlexItemsIfApplicable = [&] {
+        if (!flexItemsNeedReordering)
+            return;
+
+        std::stable_sort(logicalFlexItemList.begin(), logicalFlexItemList.end(), [&] (auto& a, auto& b) {
+            return a.logicalOrder < b.logicalOrder;
+        });
+    };
+    reorderFlexItemsIfApplicable();
+
     auto logicalLeft = LayoutUnit { };
     auto logicalTop = LayoutUnit { };
 
@@ -169,7 +186,7 @@
         auto logicalWidth = logicalFlexItemList.last().rect.right() - logicalFlexItemList.first().rect.left();
         auto direction = root().style().flexDirection();
         for (auto& logicalFlexItem : logicalFlexItemList) {
-            auto& flexItemGeometry = formattingState.boxGeometry(logicalFlexItem.flexItem);
+            auto& flexItemGeometry = formattingState.boxGeometry(*logicalFlexItem.flexItem);
             auto topLeft = LayoutPoint { };
 
             switch (direction) {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to