render: resolve cell appearance per row of cells, shared with the painter #176
No reviewers
Labels
No labels
Area/ci
Area/cli
Area/client
Area/client-core
Area/daemon
Area/deps
Area/docs
Area/grid
Area/manual
Area/nix
Area/protocol
Area/pty
Area/render
Area/shaping
Area/skills
Area/transport
Area/vt
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Performance
Kind/Security
Kind/Testing
perf-regression-accepted
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Blocked
Status
Need More Info
Status
Upstream
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
felis-terminal/felis!176
Loading…
Reference in a new issue
No description provided.
Delete branch "render/cell-appearance"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The cell painter decides how a cell looks (reverse, cursor and its color, selection, the bidi warning, faint, SGR 58, link underline, CONCEAL, preedit cover, reserved rows), but only over a
ScreenBuffer. felis-web-component re-derives those rules in TypeScript and already disagrees with native (faint ×0.6 toward black vs 50/50 toward the cell bg; no selection, block-cursor, bidi-warning or SGR 58 rules), and its scrollback rows exist only as decoded packed rows, never in aScreenBuffer. This lifts the per-cell rules into a row-level resolver that the painter itself calls, and makes it buildable for wasm32.felis_render_core::appearance:RowCells(a cell slice +StyleTable+ClusterTable, blank past the slice;of_screenbuilds it from a screen row),FrameState→ per-rowRowFrame(plainfor scrollback),resolve_cell/resolve_row→CellAppearance(fg/bg,bg_is_ground,glyph_visible,disposition, cursor marker with its color, link underline, underline/strikethrough/overline each with its effective color after suppression). The painter keeps only pixel math.glyphsfeature (default on) gatespainter,glyphs,box_drawingand the felis-shaping/foldhash edges;appearance,palette,display_list,overlay,atlasbuild without them.just check-portable(pr.yml, release.yml) now runscargo clippy -p felis-render-core --no-default-features --target wasm32-unknown-unknown.palette::linear_to_srgb_byte/linear_rgba_to_srgb8so a DOM client writes the bytes the native sRGB surface would.Evidence
encode_row→decode_rowinto a freshStyleTable(the browser's scrollback path) resolve identically to the live row, under a plain frame and a live cursor + selection frame. Targeted tests for the suppression rules, preeditSkip, stale tail past occupancy, short slices; exhaustive sRGB round trip.paint_frame(full runs, alternating, base = main): full 200x60 −27%, one dirty row −25%, cursor move −25%; cells now come from the row slice instead of a per-accessScreenBuffer::cell, andchar_spanruns only when a selection or preedit is on the row.just checkandjust check-windowsgreen locally; sol review PASS (its one non-blocking doc finding fixed in the last commit).The web client adopts it in its own repository next: first a pin bump to this merge, then emitting resolved colors in its row JSON.