gioser

tawasuyu/taffy

A high performance rust-powered UI layout library

HTML 5544Rust 88Markdown 11TOML 91926 Definiciones

fix(grid): distribute_space_up_to_limits descuenta lo ya repartido

La funcion reparte espacio libre entre pistas hasta su limite en varias
iteraciones, acumulando lo entregado en track.item_incurred_increase. Las dos
cuentas que deciden cuanto le cabe a cada pista miraban
track_affected_property(track) pelado, sin sumarle lo ya acumulado: el margen
restante (min_increase_limit) quedaba inflado en todo lo que la pista ya habia
crecido, y el guarda que aplica el incremento dejaba pasar pistas que el filtro
de elegibilidad de arriba ya habia congelado.

Traza (contenedor 352, bases [87, 140], limites [147, 197], libre 125): la 1a
iteracion da +57 a cada una -> [144, 197] y sobran 11; en la 2a solo la pista 0
es elegible, pero su margen se calcula 147-87 = 60 cuando son 3, y el guarda
compara 87+11 <= 147 cuando deberia comparar 144+11 -> las DOS se llevan +11.
Salida [155, 208] = 363 en un contenedor de 352 cuyos limites sumaban 344.

Es DioxusLabs/taffy#1000. Con esto el caso del issue (contenedor 928,
max-contents [400, 674]) pasa de [528, 528] = 1056 a [400, 528] = 928 exacto.
Suite completa verde: 4421 generados, 105 unitarios, 43 hand-written, 5 doc.

25b52db5805616a331f958f7cd197c43baeae901 · por Sergio · (hace 2 meses) · padre bb351fcc0 · ver el árbol en este commit

Delta semántico · 1

src/compute/grid/track_sizing.rs

1 archivos · +8 −2

diff --git a/src/compute/grid/track_sizing.rs b/src/compute/grid/track_sizing.rs
index 10e3ea20d..9d8ad0766 100644
--- a/src/compute/grid/track_sizing.rs
+++ b/src/compute/grid/track_sizing.rs
@@ -1399,7 +1399,10 @@ fn distribute_space_up_to_limits(
             .iter()
             .filter(|track| track_affected_property(track) + track.item_incurred_increase < track_limit(track))
             .filter(|track| track_is_affected(track))
-            .map(|track| (track_limit(track) - track_affected_property(track)) / track_distribution_proportion(track))
+            .map(|track| {
+                (track_limit(track) - track_affected_property(track) - track.item_incurred_increase)
+                    / track_distribution_proportion(track)
+            })
             .min_by(|a, b| a.total_cmp(b))
             .unwrap(); // We will never pass an empty track list to this function
         let iteration_item_incurred_increase =
@@ -1407,7 +1410,10 @@ fn distribute_space_up_to_limits(
 
         for track in tracks.iter_mut().filter(|track| track_is_affected(track)) {
             let increase = iteration_item_incurred_increase * track_distribution_proportion(track);
-            if increase > 0.0 && track_affected_property(track) + increase <= track_limit(track) + THRESHOLD {
+            if increase > 0.0
+                && track_affected_property(track) + track.item_incurred_increase + increase
+                    <= track_limit(track) + THRESHOLD
+            {
                 track.item_incurred_increase += increase;
                 space_to_distribute -= increase;
             }