mirror of
https://github.com/storytold/figcraft.git
synced 2026-10-24 10:27:00 -06:00
docs: zoom previews in the roadmap, gaps and control protocol (M8)
Refs #295
This commit is contained in:
@@ -131,6 +131,7 @@ Ranked; detail and milestones in [`docs/roadmap.md`](docs/roadmap.md).
|
||||
|
||||
## Progress log
|
||||
|
||||
- **2026-10-14** · Coarse zoom previews (M8, #295): a new zoom can't reuse the retained canvas image, and the old one, re-projected, covers 1/64 of the view after a zoom out from 800% to 100%, so the page colour showed until the full render was done. When renders from scratch take a frame or more, the render thread first renders the whole view with a quarter of the pixels each way (kept apart from the full image, so pans and edits still build on it) and then refines it unless a newer request waits; the web build does the two in consecutive frames; pixel preview gets none. The canvas never shows an image of another file or page, and a late preview never replaces a refined image at the zoom asked for. `ui.inspect` gives `canvas.quality`, `previewLatencyMs` and `refineLatencyMs`; `zoom_preview_tests`. Measured on Windows (600 layers with shadows, background blurs and glass, 904×860 canvas): 800% → 100% shows the whole view 7–15 ms after the request and the refined image at 63–69 ms (a 56 ms render). Numbers unchanged.
|
||||
- **2026-10-14** · Home screen recent files as cards (M7): each card shows the picture its file carries on its first page's colour, the file's icon, name and "Edited ... ago"; sort by name, creation or last change either way; a table view; a click selects, a double-click or Enter opens, arrow keys move; Open, Show in folder and Remove from recents on right-click. Numbers unchanged.
|
||||
- **2026-10-13** · Vector edit mode regions (M4): with the Move tool, the filled area under the pointer is hatched with "/" lines in the selection colour, clipped by the area's own fill rule so holes stay clear; the hatch goes near points (3.5 px) and segments (2 px), and its spacing follows octave folding (8 px at every power-of-two zoom), fixed to the shape. A click selects the area with its points (they move with it but keep the unselected look), Shift adds or removes one, a press on a selected area drags the whole selection as one undo step, and a click on an empty spot clears the areas and stays in edit mode. `vector.edit.select {regions}` and `vector.edit.state` (`regions`, `regionVertices`, `regionHover`); `vector_regions_tests` and `regions_tests`. Numbers unchanged.
|
||||
- **2026-10-14** · SVG/PDF export depth (M0.9, #208): visible descendants deeper than 256 levels below an exported root are refused before bounds or drawing, including masks and raster fallbacks. SVG has a checked API; the engine and CLI report the limit and suggest selecting an inner layer. Existing destination files survive refusal. Boundary, inner-root, hidden-subtree, multi-root/page and command/CLI regressions cover the change. Numbers unchanged.
|
||||
@@ -312,6 +313,7 @@ Ranked; detail and milestones in [`docs/roadmap.md`](docs/roadmap.md).
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-14 | minor | Coarse zoom previews (M8, #295): when renders from scratch are slow, a new zoom shows the whole view coarsely first, then the refined image; images of another file or page never show. Numbers unchanged |
|
||||
| 2026-10-14 | minor | Home screen recent files as cards (M7): each card shows the picture its file carries on its first page's colour, the file's icon, name and "Edited ... ago"; sort by name, creation or last change either way; a table view; a click selects, a double-click or Enter opens, arrow keys move; Open, Show in folder and Remove from recents on right-click. Numbers unchanged. |
|
||||
| 2026-10-14 | minor | Lost images reported on loading (#207): a `.figcraft` file whose image member is damaged, too large or missing no longer loads in silence; each lost image (up to 20, then a count) is listed in `repairs` on `file.open` with its hash and the reason, and the app shows it as a toast. Saving still writes the file without the lost images. Numbers unchanged |
|
||||
| 2026-10-14 | minor | SVG import budgets (#190): gzipped SVG is unpacked by FigCraft within 64 MiB before parsing (it was unpacked without a limit), so the nesting check sees the real document; SVG documents embedded in `<image>` data URIs share one 32 MiB budget and at most 4 levels, and one past a budget is left out. Linked files stay unread. Numbers unchanged |
|
||||
|
||||
@@ -93,7 +93,10 @@ ellipse, its arc handles `arcHandles`, for a selected rectangle, frame, polygon
|
||||
an idle window draws none) with the most frequent repaint requests behind them (`repaintCauses`:
|
||||
`[{at: "file:line", count}]`, every request made in the frame before each one, delayed ones such as
|
||||
the autosave deadline included; egui's `context.rs` begin-pass line means input events) and what the last canvas render had to do (`canvas.renderWork`: `full`, `partial` with
|
||||
the `pixels` re-rendered after a pan or an edit, or `reused`). While a prototype plays, `presenter`
|
||||
the `pixels` re-rendered after a pan or an edit, or `reused`), whether the canvas shows a coarse
|
||||
zoom preview or the refined image (`canvas.quality`: `preview` or `refined`) and the time from
|
||||
asking for a render to the frame showing its preview and its refined image (`canvas.previewLatencyMs`,
|
||||
`canvas.refineLatencyMs`; `null` until there was one). While a prototype plays, `presenter`
|
||||
(full window) and `preview` (the preview pane) hold the player's state: the `current` frame and its
|
||||
`name`, `start`, `history`, open `overlays`, how many delayed mouse triggers are `waiting`, the screen's `scroll` offset and `scrollRange`, the
|
||||
`device` (and whether it is turned to `landscape`, its `deviceColor`) and the `viewport` of the frame
|
||||
|
||||
+3
-1
@@ -193,7 +193,9 @@ No alpha blockers: the alpha gate in [`roadmap.md`](roadmap.md#alpha-gate) passe
|
||||
|
||||
### 7. CPU canvas where Figma uses the GPU
|
||||
- **Missing:** GPU rendering of the canvas. FigCraft renders with tiny-skia on the CPU (banded,
|
||||
parallel, retained) and shows the image through wgpu.
|
||||
parallel, retained) and shows the image through wgpu. A new zoom can't reuse the retained
|
||||
image; when renders from scratch take a frame or more, the whole view is previewed with a
|
||||
sixteenth of the pixels first, then refined.
|
||||
- **Evidence (measured, `cargo xtask bench`):** a 50k-layer page ~8 ms zoomed out with levels of
|
||||
detail, single-layer edits at 10k layers ~0.2 ms; full 1440×900 renders 7–15 ms at 10k layers.
|
||||
Heavy effects (glass, background blur, noise) and 4K/5K canvases at 2x are where CPU time grows.
|
||||
|
||||
Reference in New Issue
Block a user