Document per-axis retained layout
This commit is contained in:
1 parent
974d6c7a52
commit
ecce4448f0
2 files changed
+43
-14
No files matched your search
+13
-9
@@ -106,8 +106,11 @@ stands rather than new machinery:
|
||||
and the primitive's stored `rel`/`abs` pair every frame, already, on the GPU.
|
||||
A widget laid out purely in `rel`/`abs` terms is therefore already correct
|
||||
after a resize with zero CPU work. Calls to `Painter::px_size` and
|
||||
`Painter::output_size` mark the active widget as reading concrete pixels;
|
||||
only those widgets become dirty when the output actually changes.
|
||||
`Painter::output_size` mark both concrete-pixel axes; `px_len(axis)` and
|
||||
`output_len(axis)` mark only the axis actually read. Only widgets whose read
|
||||
axes changed by more than 0.05 physical pixels become dirty. The comparison
|
||||
is against each widget's last actual draw, so smaller changes accumulate
|
||||
rather than disappearing event by event.
|
||||
|
||||
All pixel-dependent leaves are marked before layout begins, along with every
|
||||
chain of parents that read their sizes. Resize then settles the shallowest
|
||||
@@ -145,18 +148,19 @@ An exact `size_hint` stops propagation when both axes still equal the retained
|
||||
size. Otherwise propagation is deliberately conservative: the child may have
|
||||
changed size, and only its dependent ancestors can assign the final boxes.
|
||||
Unchanged descendants still take `draw_inner`'s retained skip-or-move path.
|
||||
For a stacking container, retained child lengths are cached per axis: a child's
|
||||
width remains reusable while the parent changes width, and its height remains
|
||||
reusable while the parent changes height. A change on the orthogonal axis does
|
||||
invalidate it in both directions. This is a generic constraint rule, not a
|
||||
text exception; wrapped text is merely the common example of height depending
|
||||
on width.
|
||||
An active widget also retains which offered-box and output axes flowed into
|
||||
the size it reported, directly or through a child size it read. A container
|
||||
may use that answer for the same prospective box when every observed input is
|
||||
still within 0.05 physical pixels; content dirtiness anywhere in its size
|
||||
dependency subtree rejects the answer. This is a generic constraint rule, not
|
||||
a text exception. Wrapped text is merely the common example: it reads width,
|
||||
so changing only height leaves its answer valid.
|
||||
|
||||
### 4. Wrapped text, and "needs child height before choosing width"
|
||||
|
||||
**Wrapped text is not a special case any more; it already reads as one
|
||||
draw.** `TextView::render` (`iris/src/widget/text/mod.rs:57-76`) already
|
||||
does exactly what single-draw asks for: it reads `ctx.px_size().x` as the
|
||||
does exactly what single-draw asks for: it reads `ctx.px_len(Axis::X)` as the
|
||||
wrap width, shapes once, and memoizes the shaped layout keyed on that width
|
||||
plus a changed-flag on the buffer and attrs (`:63-69`) — a second call with
|
||||
the same width is a hash-map-style cache hit, not a re-shape. Under the new
|
||||
|
||||
Reference in new issue
Block a user