gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 1114HTML 1040Markdown 12TOML 94698 Definiciones

Move parent size over to Number

c7741b29a8beb1c9689b277a33d3e28c452241ca · por Emil Sjölander · (hace 7 años) · padre 080855712 · ver el árbol en este commit

Delta semántico · 3

src/algo.rs

src/number.rs

2 archivos · +56 −24

diff --git a/src/algo.rs b/src/algo.rs
index 7e3209b5d..6219ad836 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -81,8 +81,8 @@ pub fn compute(root: &style::Node) -> layout::Node {
         root,
         root.width.resolve(Undefined).unwrap_or(f32::NAN),
         root.height.resolve(Undefined).unwrap_or(f32::NAN),
-        f32::NAN,
-        f32::NAN,
+        Undefined,
+        Undefined,
         Undefined,
     );
 
@@ -100,8 +100,8 @@ pub fn compute(root: &style::Node) -> layout::Node {
             .maybe_max(root.min_height.resolve(Undefined))
             .maybe_min(root.max_height.resolve(Undefined))
             .unwrap_or(f32::NAN),
-        f32::NAN,
-        f32::NAN,
+        Undefined,
+        Undefined,
         Undefined,
     );
 
@@ -153,8 +153,8 @@ fn compute_internal(
     // the inner node_width / node_height of the parent and should
     // not be exceeded by this node unless node_width / node_height
     // parameters say otherwise.
-    parent_inner_width: f32,
-    parent_inner_height: f32,
+    parent_inner_width: Number,
+    parent_inner_height: Number,
 
     // This will always be the parent width except for the case when
     // the child is in an absolute context. This value should only
@@ -264,12 +264,12 @@ fn compute_internal(
     //    in that dimension and use that value. This might result in an infinite value.
 
     let available_main = {
-        let base = if node_main.is_finite() { node_main } else { parent_inner_main - margin_main };
+        let base = if node_main.is_finite() { Defined(node_main) } else { parent_inner_main - margin_main };
         base - padding_main - border_main
     };
 
     let available_cross = {
-        let base = if node_cross.is_finite() { node_cross } else { parent_inner_cross - margin_cross };
+        let base = if node_cross.is_finite() { Defined(node_cross) } else { parent_inner_cross - margin_cross };
         base - padding_cross - border_cross
     };
 
@@ -455,10 +455,12 @@ fn compute_internal(
             for child in flex_items {
                 line_length += child.hypothetical_outer_main_size;
 
-                if line_length > available_main && line.items.len() > 0 {
-                    line_length = child.hypothetical_outer_main_size;
-                    lines.push(line);
-                    line = FlexLine { items: vec![], cross_size: 0.0, offset_cross: 0.0 };
+                if let Defined(main) = available_main {
+                    if line_length > main && line.items.len() > 0 {
+                        line_length = child.hypothetical_outer_main_size;
+                        lines.push(line);
+                        line = FlexLine { items: vec![], cross_size: 0.0, offset_cross: 0.0 };
+                    }
                 }
 
                 line.items.push(child);
@@ -724,10 +726,9 @@ fn compute_internal(
 
         let size = longest_line + padding_main + border_main;
 
-        if available_main.is_finite() && flex_lines.len() > 1 && size < available_main {
-            available_main
-        } else {
-            size
+        match available_main {
+            Defined(val) if flex_lines.len() > 1 && size < val => val,
+            _ => size,
         }
     };
 
@@ -752,8 +753,8 @@ fn compute_internal(
                 child.node,
                 if node.flex_direction.is_row() { child.target_main_size } else { child_cross },
                 if node.flex_direction.is_row() { child_cross } else { child.target_main_size },
-                if node.flex_direction.is_row() { container_main_size } else { available_cross },
-                if node.flex_direction.is_row() { available_cross } else { container_main_size },
+                if node.flex_direction.is_row() { Number::from_f32(container_main_size) } else { available_cross },
+                if node.flex_direction.is_row() { available_cross } else { Number::from_f32(container_main_size) },
                 percent_calc_base_child,
             )
             .size;
@@ -787,8 +788,16 @@ fn compute_internal(
                 child.node,
                 if node.flex_direction.is_row() { child.target_main_size } else { child.hypothetical_inner_cross_size },
                 if node.flex_direction.is_row() { child.hypothetical_inner_cross_size } else { child.target_main_size },
-                if node.flex_direction.is_row() { container_main_size } else { node_cross },
-                if node.flex_direction.is_row() { node_cross } else { container_main_size },
+                if node.flex_direction.is_row() {
+                    Number::from_f32(container_main_size)
+                } else {
+                    Number::from_f32(node_cross)
+                },
+                if node.flex_direction.is_row() {
+                    Number::from_f32(node_cross)
+                } else {
+                    Number::from_f32(container_main_size)
+                },
                 percent_calc_base_child,
             );
             child.baseline = calc_baseline(&layout::Node {
@@ -1180,8 +1189,16 @@ fn compute_internal(
                             child.node,
                             if node.flex_direction.is_row() { child.target_main_size } else { child.target_cross_size },
                             if node.flex_direction.is_row() { child.target_cross_size } else { child.target_main_size },
-                            if node.flex_direction.is_row() { container_main_size } else { container_cross_size },
-                            if node.flex_direction.is_row() { container_cross_size } else { container_main_size },
+                            if node.flex_direction.is_row() {
+                                Number::from_f32(container_main_size)
+                            } else {
+                                Number::from_f32(container_main_size)
+                            },
+                            if node.flex_direction.is_row() {
+                                Number::from_f32(container_main_size)
+                            } else {
+                                Number::from_f32(container_main_size)
+                            },
                             percent_calc_base_child,
                         );
 
@@ -1308,8 +1325,16 @@ fn compute_internal(
             child,
             width,
             height,
-            if node.flex_direction.is_row() { container_main_size } else { container_cross_size },
-            if node.flex_direction.is_row() { container_cross_size } else { container_main_size },
+            if node.flex_direction.is_row() {
+                Number::from_f32(container_main_size)
+            } else {
+                Number::from_f32(container_cross_size)
+            },
+            if node.flex_direction.is_row() {
+                Number::from_f32(container_cross_size)
+            } else {
+                Number::from_f32(container_main_size)
+            },
             width_percent_calc,
         );
 
diff --git a/src/number.rs b/src/number.rs
index df99196cc..84660e2c4 100644
--- a/src/number.rs
+++ b/src/number.rs
@@ -27,6 +27,13 @@ impl Number {
         }
     }
 
+    pub fn is_undefined(self) -> bool {
+        match self {
+            Number::Defined(_) => false,
+            Number::Undefined => true,
+        }
+    }
+
     pub fn from_f32(from: f32) -> Number {
         if from.is_nan() {
             Number::Undefined