use super::*;
impl Renderer {
pub(super) fn measure_free(
&mut self,
runs: &mut Runs,
id: u32,
known: Size<Option<f32>>,
) -> Size<f32> {
let mut run = runs.take(id);
let [t, r, b, l] = run.padding;
let (pw, ph) = (l + r, t + b);
let known = Size {
width: known.width.map(|w| w.max(pw)),
height: known.height.map(|h| h.max(ph)),
};
let mut cb = (known.width.unwrap_or(pw), known.height.unwrap_or(ph));
let stale: Vec<OrderKey> = std::mem::take(&mut run.stale)
.into_iter()
.filter(|k| run.children.contains_key(k))
.collect();
run.gone = false;
for k in &stale {
run.relaid.insert(k.clone());
self.free_child(runs, &mut run, k, cb);
}
let (hw, hh) = run.hug;
for _ in 0..64 {
let new = (
known.width.unwrap_or(if hw {
greatest(&run.rights).max(pw)
} else {
pw
}),
known.height.unwrap_or(if hh {
greatest(&run.bottoms).max(ph)
} else {
ph
}),
);
if new == cb {
break;
}
cb = new;
let sensitive: Vec<OrderKey> = run.overs.iter().cloned().collect();
for k in &sensitive {
self.free_child(runs, &mut run, k, cb);
}
}
let sensitive: Vec<OrderKey> = run.overs.iter().cloned().collect();
for k in &sensitive {
self.free_child(runs, &mut run, k, cb);
}
run.cb = cb;
runs.put(id, run);
Size {
width: cb.0,
height: cb.1,
}
}
fn free_child(&mut self, runs: &mut Runs, run: &mut RunLayout, key: &OrderKey, cb: (f32, f32)) {
let sens = run.children[key].sens;
if sens {
run.overs.insert(key.clone());
} else {
run.overs.remove(key);
}
let shape = Shape {
room: AvailableSpace::Definite(cb.0),
least: false,
line: Some(cb.1),
basis: None,
main: None,
};
let (wrap, node, last) = {
let c = &run.children[key];
(c.wrap, c.node, c.last)
};
if last.is_some() && (!sens || last == Some(shape)) {
return;
}
let mut style = run.tree.style(wrap).expect("style").clone();
style.size = Size {
width: Dimension::length(cb.0),
height: Dimension::length(cb.1),
};
run.tree.set_style(wrap, style).expect("style");
let available = Size {
width: AvailableSpace::Definite(cb.0),
height: AvailableSpace::Definite(cb.1),
};
self.settle_in(runs, &mut run.tree, wrap, available, &[]);
run.children.get_mut(key).expect("a child").last = Some(shape);
run.relaid.insert(key.clone());
let l = run.tree.unrounded_layout(node);
let b = [l.location.x, l.location.y, l.size.width, l.size.height];
if let Some(old) = run.boxes.insert(key.clone(), b) {
uncount(&mut run.rights, old[0] + old[2]);
uncount(&mut run.bottoms, old[1] + old[3]);
}
count(&mut run.rights, b[0] + b[2]);
count(&mut run.bottoms, b[1] + b[3]);
}
pub(in crate::render) fn relay_free(&mut self, runs: &mut Runs, rid: u32, key: &OrderKey) {
let mut run = runs.take(rid);
let cb = run.cb;
self.free_child(runs, &mut run, key, cb);
runs.put(rid, run);
}
}