`DrawInfo::px` was the child's rel base in pixels, resolved at all four construction sites on every draw and read only by three diagnostics -- each of which called it the box: `diag::draw_request`'s `pixel_size`, printed by `trace_unsettled` as "draw in"; and two `debug_assert` messages saying "clips to" and "drew in". A rel base and a box differ wherever a parent hands down part of its own, which is every child of a span, so all three said something that was not true. The field is gone and each site reads `region.to_px(window)`, which is the box it claimed to be printing and costs nothing outside a failing assert. The trace field is `region_px`. `Placing::window` existed only to resolve that value and follows it out. The 23-line counter block inside `try_reuse`'s "outside its range" branch is `diag::outside`, beside the other diagnostics, so the decision reads as its six checks. fmt, workspace clippy under `-D warnings` with and without `layout-diagnostics`, and the workspace tests under both are clean. The cold dump over 400 depth-5 trees is byte-identical: 34,492 boxes. The trace now prints "draw in 189.00x176.00" beside a region 189 by 176.
141 lines
4.2 KiB
Rust
141 lines
4.2 KiB
Rust
//! Traces the six-widget tree in `unsettled.rs`, to see what box its text is
|
|
//! actually drawn in on a first frame against a settled one.
|
|
|
|
#![cfg(feature = "layout-diagnostics")]
|
|
|
|
use iris::core::layout_diagnostics::{self as diag, TraceEvent};
|
|
use iris::harness::Harness;
|
|
use iris::prelude::*;
|
|
|
|
fn plant(h: &mut Harness) -> Vec<WidgetId> {
|
|
let plain = wtext("Wrapping").size(16).wrap(false).add(&mut h.rsc);
|
|
let wrapped = wtext("Wrapping shapes").size(16).wrap(true).add(&mut h.rsc);
|
|
let sized = wrapped.width(76).add(&mut h.rsc);
|
|
let aligned = sized;
|
|
h.rsc
|
|
.widgets_mut()
|
|
.set_alignment(sized, Axis::X, AxisAlign::POS);
|
|
h.rsc
|
|
.widgets_mut()
|
|
.set_alignment(sized, Axis::Y, AxisAlign::POS);
|
|
let stack = Stack {
|
|
children: vec![plain.add_strong(&mut h.rsc), aligned.add_strong(&mut h.rsc)],
|
|
size: StackSize::Child(0),
|
|
}
|
|
.add(&mut h.rsc);
|
|
let root = (stack,).span(Dir::RIGHT).add(&mut h.rsc);
|
|
h.state.root = Some(root.add_strong(&mut h.rsc));
|
|
vec![
|
|
plain.id(),
|
|
wrapped.id(),
|
|
sized.id(),
|
|
aligned.id(),
|
|
stack.id(),
|
|
root.id(),
|
|
]
|
|
}
|
|
|
|
fn dump(label: &str, report: &diag::Report, text: WidgetId) {
|
|
println!("--- {label} ---");
|
|
for event in report.traces() {
|
|
match event {
|
|
TraceEvent::DrawRequest {
|
|
id,
|
|
region,
|
|
region_px,
|
|
..
|
|
} if *id == text => {
|
|
println!(
|
|
" draw in {:.2}x{:.2} region {region:?}",
|
|
region_px.x, region_px.y
|
|
)
|
|
}
|
|
TraceEvent::SizeReported { id, size } if *id == text => {
|
|
println!(" reported {size}")
|
|
}
|
|
TraceEvent::SizeRead { id, reader, size } if *id == text => {
|
|
println!(" size read by {reader:?}: {size}")
|
|
}
|
|
TraceEvent::RegionNode { id, parent, region } if *id == text => {
|
|
println!(" region node under {parent:?} at {region:?}")
|
|
}
|
|
TraceEvent::Reuse { id, outcome } if *id == text => println!(" reuse: {outcome:?}"),
|
|
_ => {}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
#[ignore = "a diagnostic, not a check"]
|
|
fn what_box_the_text_is_drawn_in() {
|
|
diag::clear_traced_widgets();
|
|
let _ = diag::take();
|
|
let mut h = Harness::new((640, 900));
|
|
let ids = plant(&mut h);
|
|
let text = ids[1];
|
|
diag::trace_widget(text);
|
|
let _ = diag::take();
|
|
|
|
h.frame();
|
|
dump("first frame", &diag::take(), text);
|
|
|
|
for _ in 0..2 {
|
|
for &id in &ids {
|
|
h.rsc.widgets_mut().get_dyn_mut(id);
|
|
}
|
|
let _ = diag::take();
|
|
h.frame();
|
|
dump("repaint", &diag::take(), text);
|
|
}
|
|
diag::clear_traced_widgets();
|
|
}
|
|
|
|
fn plant_fixed(h: &mut Harness) -> Vec<WidgetId> {
|
|
let words = "Wrapping shapes one source into as many lines as the box leaves";
|
|
let text = wtext(words).size(16).wrap(true).add(&mut h.rsc);
|
|
let aligned = text;
|
|
h.rsc
|
|
.widgets_mut()
|
|
.set_alignment(text, Axis::X, AxisAlign::NEG);
|
|
let inner = (aligned,).span(Dir::RIGHT).add(&mut h.rsc);
|
|
let sized = inner.sized((189, 176)).add(&mut h.rsc);
|
|
let filler = rect(Color::RED).add(&mut h.rsc);
|
|
let root = (filler, sized).span(Dir::RIGHT).add(&mut h.rsc);
|
|
h.state.root = Some(root.add_strong(&mut h.rsc));
|
|
vec![
|
|
text.id(),
|
|
aligned.id(),
|
|
inner.id(),
|
|
sized.id(),
|
|
filler.id(),
|
|
root.id(),
|
|
]
|
|
}
|
|
|
|
#[test]
|
|
#[ignore = "a diagnostic, not a check"]
|
|
fn what_box_the_fixed_text_is_drawn_in() {
|
|
diag::clear_traced_widgets();
|
|
let _ = diag::take();
|
|
let mut h = Harness::new((1920, 1200));
|
|
let ids = plant_fixed(&mut h);
|
|
let text = ids[0];
|
|
diag::trace_widget(text);
|
|
let _ = diag::take();
|
|
|
|
h.frame();
|
|
dump("first frame at 1920", &diag::take(), text);
|
|
h.resize((640, 900));
|
|
h.frame();
|
|
dump("after resize to 640", &diag::take(), text);
|
|
|
|
let mut cold = Harness::new((640, 900));
|
|
let cids = plant_fixed(&mut cold);
|
|
diag::clear_traced_widgets();
|
|
diag::trace_widget(cids[0]);
|
|
let _ = diag::take();
|
|
cold.frame();
|
|
dump("cold at 640", &diag::take(), cids[0]);
|
|
diag::clear_traced_widgets();
|
|
}
|