gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 497HTML 254C 19JavaScript 81329 Sutichaykuna

Move container size to geometry

532760140acaa17786b205b0dfa27696aae63d07 · ruwaq Emil Sjölander · (7 wata ñawpaq) · tayta 7c911a234 · kay commitpi sach'ata qhaway

Semántico sayk'uy · 1

src/algo.rs

1 qillqakuna · +32 −29

diff --git a/src/algo.rs b/src/algo.rs
index d748ee01a..e7ea6ab32 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -152,6 +152,8 @@ fn compute_internal(
     };
 
     let percent_calc_base_child = node_inner_size.width;
+    let mut container_size = Size { width: 0.0, height: 0.0 };
+    let mut inner_container_size = Size { width: 0.0, height: 0.0 };
 
     // 9.2. Line Length Determination
 
@@ -593,20 +595,23 @@ fn compute_internal(
     });
 
     // Not part of the spec from what i can see but seems correct
-    let container_main_size = node_size.main(dir).or_else({
-        let longest_line = flex_lines.iter().fold(f32::MIN, |acc, line| {
-            let length: f32 = line.items.iter().map(|item| item.outer_target_size.main(dir)).sum();
-            acc.max(length)
-        });
+    container_size.set_main(
+        dir,
+        node_size.main(dir).or_else({
+            let longest_line = flex_lines.iter().fold(f32::MIN, |acc, line| {
+                let length: f32 = line.items.iter().map(|item| item.outer_target_size.main(dir)).sum();
+                acc.max(length)
+            });
 
-        let size = longest_line + padding_border.main(dir);
-        match available_space.main(dir) {
-            Defined(val) if flex_lines.len() > 1 && size < val => val,
-            _ => size,
-        }
-    });
+            let size = longest_line + padding_border.main(dir);
+            match available_space.main(dir) {
+                Defined(val) if flex_lines.len() > 1 && size < val => val,
+                _ => size,
+            }
+        }),
+    );
 
-    let inner_container_main_size = container_main_size - padding_border.main(dir);
+    inner_container_size.set_main(dir, container_size.main(dir) - padding_border.main(dir));
 
     // 9.4. Cross Size Determination
 
@@ -627,8 +632,8 @@ fn compute_internal(
                         height: if is_row { child_cross } else { child.target_size.height.to_number() },
                     },
                     Size {
-                        width: if is_row { container_main_size.to_number() } else { available_space.width },
-                        height: if is_row { available_space.height } else { container_main_size.to_number() },
+                        width: if is_row { container_size.main(dir).to_number() } else { available_space.width },
+                        height: if is_row { available_space.height } else { container_size.main(dir).to_number() },
                     },
                     percent_calc_base_child,
                 )
@@ -672,8 +677,8 @@ fn compute_internal(
                     },
                 },
                 Size {
-                    width: if is_row { container_main_size.to_number() } else { node_size.width },
-                    height: if is_row { node_size.height } else { container_main_size.to_number() },
+                    width: if is_row { container_size.main(dir).to_number() } else { node_size.width },
+                    height: if is_row { node_size.height } else { container_size.main(dir).to_number() },
                 },
                 percent_calc_base_child,
             );
@@ -805,7 +810,7 @@ fn compute_internal(
 
     flex_lines.iter_mut().for_each(|line| {
         let used_space: f32 = line.items.iter().map(|child| child.outer_target_size.main(dir)).sum();
-        let free_space = inner_container_main_size - used_space;
+        let free_space = inner_container_size.main(dir) - used_space;
         let mut num_auto_margins = 0;
 
         line.items.iter_mut().for_each(|child| {
@@ -983,12 +988,13 @@ fn compute_internal(
     //       min and max cross sizes of the flex container.
 
     let total_cross_size: f32 = flex_lines.iter().map(|line| line.cross_size).sum();
-    let container_cross_size = node_size.cross(dir).or_else(total_cross_size + padding_border.cross(dir));
-    let inner_container_cross_size = container_cross_size - padding_border.cross(dir);
+
+    container_size.set_cross(dir, node_size.cross(dir).or_else(total_cross_size + padding_border.cross(dir)));
+    inner_container_size.set_cross(dir, container_size.cross(dir) - padding_border.cross(dir));
 
     // 16. Align all flex lines per align-content.
 
-    let free_space = inner_container_cross_size - total_cross_size;
+    let free_space = inner_container_size.cross(dir) - total_cross_size;
     let num_lines = flex_lines.len();
 
     let align_line = |(i, line): (usize, &mut FlexLine)| {
@@ -1040,9 +1046,6 @@ fn compute_internal(
         flex_lines.iter_mut().enumerate().for_each(align_line);
     }
 
-    let container_width = if is_row { container_main_size } else { container_cross_size };
-    let container_height = if is_column { container_main_size } else { container_cross_size };
-
     // Do a final layout pass and gather the resulting layouts
     let mut children: Vec<layout::Node> = {
         let mut lines: Vec<Vec<layout::Node>> = vec![];
@@ -1057,7 +1060,7 @@ fn compute_internal(
                 let result = compute_internal(
                     child.node,
                     Size { width: child.target_size.width.to_number(), height: child.target_size.height.to_number() },
-                    Size { width: container_width.to_number(), height: container_height.to_number() },
+                    Size { width: container_size.width.to_number(), height: container_size.height.to_number() },
                     percent_calc_base_child,
                 );
 
@@ -1118,8 +1121,8 @@ fn compute_internal(
         .iter()
         .filter(|child| child.position_type == PositionType::Absolute)
         .map(|child| {
-            let container_width = container_width.to_number();
-            let container_height = container_height.to_number();
+            let container_width = container_size.width.to_number();
+            let container_height = container_size.height.to_number();
 
             let start = child.position.start.resolve(container_width) + child.margin.start.resolve(container_width);
             let end = child.position.end.resolve(container_width) + child.margin.end.resolve(container_width);
@@ -1154,14 +1157,14 @@ fn compute_internal(
                 container_width,
             );
 
-            let free_main_space = container_main_size
+            let free_main_space = container_size.main(dir)
                 - result
                     .size
                     .main(dir)
                     .maybe_max(child.min_main_size(dir).resolve(percent_calc_base_child))
                     .maybe_min(child.max_main_size(dir).resolve(percent_calc_base_child));
 
-            let free_cross_space = container_cross_size
+            let free_cross_space = container_size.cross(dir)
                 - result
                     .size
                     .cross(dir)
@@ -1230,5 +1233,5 @@ fn compute_internal(
     // the child order they were defined. This has to be fixed.
     children.append(&mut absolute_children);
 
-    ComputeResult { size: Size { width: container_width, height: container_height }, children }
+    ComputeResult { size: container_size, children }
 }