Add a fixed-point number for layout to decide on
Layout reaches one place by more than one route -- a box composed down the chain, and the same box summed from what its children asked for -- and the two land a few bits apart in floats. Where that decides something structural rather than something positional, a warm tree disagrees with a cold one: `5ed9e87` is the instance, and its margin is a patch over the representation rather than a fix to it. `Fixed<SHIFT>` is a count of `1 / 2^SHIFT`s in an `i32`. Adding and subtracting are exact, a multiply rounds once back onto the same steps, and two routes that come within half a step land on the same number -- so the comparisons downstream can ask for equality rather than for nearness. `Px = Fixed<6>` and `Rel = Fixed<24>`: a sixty-fourth of a pixel is finer than a display and still exact in `f32` up to 262,144 px, and twenty-four bits of fraction matches `f32` at a half, beats it above one where anchors sit, and leaves +/-128 of range to sum relative children in. Nothing uses it yet. The arithmetic saturates rather than wrapping, because a clamped coordinate keeps the ordering a wrapped one inverts, and the ends are what an unbounded interval will be written with. Checked: fmt, clippy, 99 tests including ten for this type -- the round trip through `f32`, halves rounding away from zero either side, saturation at both ends, and 20,000 additions landing exactly where the count says. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5ed9e874a3
commit
7548139861
2 files changed
+351
No files matched your search
@@ -15,6 +15,7 @@ pub mod layout_diagnostics;
|
||||
|
||||
mod attr;
|
||||
mod event;
|
||||
mod fixed;
|
||||
mod num;
|
||||
mod orientation;
|
||||
mod primitive;
|
||||
@@ -26,6 +27,7 @@ pub mod util;
|
||||
|
||||
pub use attr::*;
|
||||
pub use event::*;
|
||||
pub use fixed::*;
|
||||
pub use num::*;
|
||||
pub use orientation::*;
|
||||
pub use primitive::*;
|
||||
|
||||
Reference in new issue
Block a user