From d40aa6400d7e8692516c2651687790a00deb727e Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector@hecrj.dev>
Date: Wed, 2 Oct 2024 15:45:21 +0200
Subject: Cull widget draw calls in `column` and `row`

---
 widget/src/column.rs | 19 ++++++++-----------
 widget/src/row.rs    | 19 ++++++++-----------
 2 files changed, 16 insertions(+), 22 deletions(-)

(limited to 'widget')

diff --git a/widget/src/column.rs b/widget/src/column.rs
index fc4653b9..213f68fc 100644
--- a/widget/src/column.rs
+++ b/widget/src/column.rs
@@ -320,24 +320,21 @@ where
         viewport: &Rectangle,
     ) {
         if let Some(clipped_viewport) = layout.bounds().intersection(viewport) {
+            let viewport = if self.clip {
+                &clipped_viewport
+            } else {
+                viewport
+            };
+
             for ((child, state), layout) in self
                 .children
                 .iter()
                 .zip(&tree.children)
                 .zip(layout.children())
+                .filter(|(_, layout)| layout.bounds().intersects(viewport))
             {
                 child.as_widget().draw(
-                    state,
-                    renderer,
-                    theme,
-                    style,
-                    layout,
-                    cursor,
-                    if self.clip {
-                        &clipped_viewport
-                    } else {
-                        viewport
-                    },
+                    state, renderer, theme, style, layout, cursor, viewport,
                 );
             }
         }
diff --git a/widget/src/row.rs b/widget/src/row.rs
index 75d5fb40..9c0fa97e 100644
--- a/widget/src/row.rs
+++ b/widget/src/row.rs
@@ -316,24 +316,21 @@ where
         viewport: &Rectangle,
     ) {
         if let Some(clipped_viewport) = layout.bounds().intersection(viewport) {
+            let viewport = if self.clip {
+                &clipped_viewport
+            } else {
+                viewport
+            };
+
             for ((child, state), layout) in self
                 .children
                 .iter()
                 .zip(&tree.children)
                 .zip(layout.children())
+                .filter(|(_, layout)| layout.bounds().intersects(viewport))
             {
                 child.as_widget().draw(
-                    state,
-                    renderer,
-                    theme,
-                    style,
-                    layout,
-                    cursor,
-                    if self.clip {
-                        &clipped_viewport
-                    } else {
-                        viewport
-                    },
+                    state, renderer, theme, style, layout, cursor, viewport,
                 );
             }
         }
-- 
cgit