Commit Graph
462 Commits
Author SHA1 Message Date
irisandClaude Opus 5 43f6bda92d Record the fifth #11 review
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:53:00 -04:00
irisandClaude Opus 5 8daf1bcac1 Record the fourth #11 review and the agreed texture design
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:15:59 -04:00
iris 26f86bc6f7 Rewrite the Iris extraction handoff for a fresh session
Current as of PR #11's fourth review, which is deliberately unread: the
first instruction is to fetch it. Records what #11 became over three
rounds of review, since that shape is what the new review is about, and
where the headless rig actually lives, since a rendering claim cannot be
verified without it.

Drops the finished detail -- PR #10's contents, the source-history
archaeology that has been consumed -- and points at the machine-wide
pre-submit-review gate rather than restating it.
2026-09-13 15:50:09 -04:00
iris bc555f9ded Record the #11 review and the pre-submit gate in the handoff 2026-09-13 12:48:24 -04:00
iris a9d63babe4 Record the two open Iris extraction PRs in the handoff 2026-09-13 04:01:47 -04:00
iris e774b465fd Document Iris extraction handoff 2026-09-13 03:45:02 -04:00
iris 50d214e5b1 Move Iris to its standalone repository 2026-09-12 23:16:47 -04:00
iris 715c86e7e2 iris: eliminate retained-frame heap churn 2026-09-12 22:44:03 -04:00
iris badd758d9b iris: retain next-frame staging allocation 2026-09-12 22:11:38 -04:00
iris 45cdfed293 iris: keep redraw comments current 2026-09-12 22:06:13 -04:00
iris 77b39a97e3 iris: process dirty widgets one at a time 2026-09-12 22:05:06 -04:00
iris b1416d86bf iris: drive animation from painter frame time 2026-09-12 21:37:47 -04:00
iris 9fe6aca1f1 iris: make span compaction explicit 2026-09-12 21:18:09 -04:00
iris 9097744a7c iris: give alignment examples full width 2026-09-12 21:03:27 -04:00
iris adb8276ef4 iris: keep text overflow masks horizontal 2026-09-12 20:59:54 -04:00
iris 93c106e2f8 iris: clip ellipsized text at cluster boundaries 2026-09-12 20:54:26 -04:00
iris 1f0a7b5f94 iris: add positioned text overflow 2026-09-12 19:58:02 -04:00
iris cb5f11d21a iris: separate layout allocation from lengths 2026-09-12 19:35:18 -04:00
iris 90dffce514 iris: add replaceable glyph atlas buckets 2026-09-12 18:10:55 -04:00
iris c97df72015 iris: share resource handle bookkeeping 2026-09-12 17:13:49 -04:00
iris a8093b002b iris: move text state into shared resources 2026-09-12 14:18:12 -04:00
iris 4cbe7baea0 iris: make font families application-named strings 2026-09-12 13:09:31 -04:00
iris bdc9c914c4 iris: load application-owned fonts 2026-09-11 14:14:41 -04:00
iris f7e7950908 Reuse Android builds and discard staging 2026-09-11 13:56:32 -04:00
iris 779f5c63d3 Organize Iris support files 2026-09-11 13:06:52 -04:00
iris 0ead062379 Rename app_init to android_init 2026-09-11 12:36:50 -04:00
iris aa33d55a70 Default DesktopApp to the standard UI state 2026-09-11 12:31:52 -04:00
iris 6efd0cf0aa Align desktop initializer arguments with builders 2026-09-11 12:30:33 -04:00
iris ecf74055c7 Simplify Iris app initialization and task updates 2026-09-11 12:28:33 -04:00
iris 8218e84b62 Run Iris examples on desktop and Android 2026-09-11 11:33:04 -04:00
iris df1290904b Add Iris Android APK tooling 2026-09-11 03:44:06 -04:00
iris e137f38a5d Return the tabs demo to one example 2026-09-11 02:18:34 -04:00
iris 213a0debb7 Use one standard Iris resource bundle 2026-09-11 02:09:17 -04:00
iris d8bb1699a8 Make the Rust client the sole app 2026-09-11 01:18:24 -04:00
iris a8602c1626 Clean up shared UI runtime state 2026-09-11 00:55:33 -04:00
iris f49b284b46 iris: fold render state into Ui 2026-09-10 23:58:43 -04:00
iris 599d33287c Add scoped overlay hosts 2026-09-10 18:49:03 -04:00
iris b53a17c436 Require commits for completed work 2026-09-10 18:41:56 -04:00
iris de92fccba5 Add retained paints and shared text selection 2026-09-10 18:35:24 -04:00
iris 25370731d0 Prune commentary and stale Rust port notes 2026-09-10 00:44:13 -04:00
iris 5428cd75c9 Prune Iris TODO and prioritize color correctness 2026-09-09 23:35:12 -04:00
iris 8c6e2ed9cf docs: record final phone benchmark comparison 2026-09-09 22:57:50 -04:00
iris 4bc23172fd Make Iris layout dependencies explicit 2026-09-09 22:35:03 -04:00
iris e5fee03da8 Stop composer layout recursion on spaces 2026-09-09 19:54:53 -04:00
iris 5ece49b8d9 Settle growing layout branches in one frame 2026-09-09 16:54:39 -04:00
iris e212ed8d02 Document separate benchmark publication repo 2026-09-09 16:23:38 -04:00
iris f5183af306 Expose Iris benchmark in Dev Updater 2026-09-09 16:19:46 -04:00
iris fffed42f9e Move LazySpan rows through one retained offset 2026-09-09 16:15:09 -04:00
iris 0aa03cf621 Redesign span layout around retained placement 2026-09-09 15:11:57 -04:00
iris ae0af8f5e3 iris: ScrollArea measures its content instead of drawing it twice
A container that probes a child's size was still doing it with a real
draw, so `Painter::measure` existed and almost nothing used it. Tracing
every draw of one streamed frame: 1,083 `Widget::draw` calls over 113
distinct widgets, the worst drawn 11 times at nesting depth 7-8, every
one of them mode `Draw` and none of them dirty. The cache was working --
each of the 11 was offered a genuinely different region, alternating
between an oversized probe box and a real one.

ScrollArea::draw was one of the two sources. It drew its whole content
at a box built from a stale hint, read the length back, corrected the
scroll position, and drew the content again where it belonged. The first
of those is now a measurement.

The other half is the measure fast path. A widget's reported size is a
function of its own state and the size it was offered, not of where it
was offered -- so an undirtied widget already drawn at a region of this
size has already answered, and `active.size` is the answer. This is the
same assumption `mov` makes one branch further down (same offered size,
therefore identical output, therefore a translation); it is only stated
as a size here rather than acted on as a move. Without it a measurement
costs a full recursive walk, which is what made the nesting compound.

A measurement now also peeks at the redraw mark instead of consuming it
-- it is not the redraw the mark asked for, and swallowing it would
leave the widget stale until something marked it again.

453 draws from 1,083, and the streamed frame is p50 1.18ms (from 1.22ms,
and 2.20ms before this run of work). The headless phone render is
byte-identical to the previous commit's on the real GPU.

What is deliberately NOT here: the same change to `Span::draw`'s phase 1,
which is the remaining 2x and which moves the layout by a few pixels.
The layout stays intact -- it is a position difference, not a broken
frame -- but which of the two is correct was not established, and the
suspicion (that phase 2 now takes `mov`, and `mov` accumulates deltas
where a redraw recomputes) points at a bug in `mov` rather than in
`Span`. Written up in docs/IRIS_TODO.md with Iris's target shape for
`Span`: no probe phase at all for `abs` children, and a `rest` child
forcing a reposition pass rather than a redraw.
2026-09-09 12:08:20 -04:00