about summary refs log tree commit diff stats
path: root/src/css/layout.nim
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-03-15 00:42:28 +0100
committerbptato <nincsnevem662@gmail.com>2025-03-15 01:25:49 +0100
commit62193f54a05d1b922caa6733edc86ea3ff3af9bf (patch)
tree4fecc41d593c5435f64fb4697d94eed673e8f8fe /src/css/layout.nim
parent3f1b6edb306ecb31fc44fe5d391ea8d3bcafe88c (diff)
downloadchawan-62193f54a05d1b922caa6733edc86ea3ff3af9bf.tar.gz
layout: eliminate pointless flex relayouts
Diffstat (limited to 'src/css/layout.nim')
-rw-r--r--src/css/layout.nim17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/css/layout.nim b/src/css/layout.nim
index e5b06cd8..289c57a3 100644
--- a/src/css/layout.nim
+++ b/src/css/layout.nim
@@ -2689,6 +2689,7 @@ proc redistributeMainSize(mctx: var FlexMainContext; diff: LUnit;
   var diff = diff
   var totalWeight = mctx.totalWeight[wt]
   let odim = dim.opposite
+  var relayout: seq[int] = @[]
   while (wt == fwtGrow and diff > 0 or wt == fwtShrink and diff < 0) and
       totalWeight > 0:
     # redo maxSize calculation; we only need height here
@@ -2704,7 +2705,8 @@ proc redistributeMainSize(mctx: var FlexMainContext; diff: LUnit;
     # one)
     totalWeight = 0
     diff = 0
-    for it in mctx.pending.mitems:
+    relayout.setLen(0)
+    for i, it in mctx.pending.mpairs:
       if it.weights[wt] == 0:
         mctx.updateMaxSizes(it.child, it.sizes)
         continue
@@ -2734,10 +2736,15 @@ proc redistributeMainSize(mctx: var FlexMainContext; diff: LUnit;
       it.sizes.space[dim] = stretch(u)
       # override minimum intrinsic size clamping too
       totalWeight += it.weights[wt]
-      #TODO we should call this only on freeze, and then put another loop to
-      # the end for non-frozen items
-      lctx.layoutFlexItem(it.child, it.sizes)
-      mctx.updateMaxSizes(it.child, it.sizes)
+      if it.weights[wt] == 0: # frozen, relayout immediately
+        lctx.layoutFlexItem(it.child, it.sizes)
+        mctx.updateMaxSizes(it.child, it.sizes)
+      else: # delay relayout
+        relayout.add(i)
+    for i in relayout:
+      let child = mctx.pending[i].child
+      lctx.layoutFlexItem(child, mctx.pending[i].sizes)
+      mctx.updateMaxSizes(child, mctx.pending[i].sizes)
 
 proc flushMain(fctx: var FlexContext; mctx: var FlexMainContext;
     sizes: ResolvedSizes) =