tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 501HTML 254C 19JavaScript 81412 Definiciones

Only do two pass layout when needed

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

Delta semántico · 2

src/algo.rs

  • cambió por dentro fn compute pub

src/style.rs

2 archivos · +50 −29

diff --git a/src/algo.rs b/src/algo.rs
index 03e538436..2d12c63c5 100644
--- a/src/algo.rs
+++ b/src/algo.rs
@@ -55,36 +55,49 @@ struct FlexLine<'a> {
 }
 
 pub fn compute(root: &style::Node, size: Size<Number>) -> layout::Node {
-    // TODO - Don't do two passes here just to handle min/max.
-    // Probably want to pass min/max down as top level paramerer instead.
-    let first_pass = compute_internal(
-        root,
-        Size { width: root.size.width.resolve(size.width), height: root.size.height.resolve(size.height) },
-        size,
-        size.width,
-        false,
-    );
+    let has_root_min_max = root.min_size.width.is_defined()
+        || root.min_size.height.is_defined()
+        || root.max_size.width.is_defined()
+        || root.max_size.height.is_defined();
+
+    let result = if has_root_min_max {
+        let first_pass = compute_internal(
+            root,
+            Size { width: root.size.width.resolve(size.width), height: root.size.height.resolve(size.height) },
+            size,
+            size.width,
+            false,
+        );
 
-    let result = compute_internal(
-        root,
-        Size {
-            width: first_pass
-                .size
-                .width
-                .maybe_max(root.min_size.width.resolve(size.width))
-                .maybe_min(root.max_size.width.resolve(size.width))
-                .to_number(),
-            height: first_pass
-                .size
-                .height
-                .maybe_max(root.min_size.height.resolve(size.height))
-                .maybe_min(root.max_size.height.resolve(size.height))
-                .to_number(),
-        },
-        size,
-        size.width,
-        true,
-    );
+        compute_internal(
+            root,
+            Size {
+                width: first_pass
+                    .size
+                    .width
+                    .maybe_max(root.min_size.width.resolve(size.width))
+                    .maybe_min(root.max_size.width.resolve(size.width))
+                    .to_number(),
+                height: first_pass
+                    .size
+                    .height
+                    .maybe_max(root.min_size.height.resolve(size.height))
+                    .maybe_min(root.max_size.height.resolve(size.height))
+                    .to_number(),
+            },
+            size,
+            size.width,
+            true,
+        )
+    } else {
+        compute_internal(
+            root,
+            Size { width: root.size.width.resolve(size.width), height: root.size.height.resolve(size.height) },
+            size,
+            size.width,
+            true,
+        )
+    };
 
     let mut layout = layout::Node {
         order: 0,
diff --git a/src/style.rs b/src/style.rs
index 2665d0ee5..8234fcaac 100644
--- a/src/style.rs
+++ b/src/style.rs
@@ -178,6 +178,14 @@ impl Dimension {
             _ => Number::Undefined,
         }
     }
+
+    pub(crate) fn is_defined(self) -> bool {
+        match self {
+            Dimension::Points(_) => true,
+            Dimension::Percent(_) => true,
+            _ => false,
+        }
+    }
 }
 
 impl Default for Rect<Dimension> {