mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-27 11:27:21 -06:00
Opening the preset store decoded every imported tip at full resolution, and each tip then lived twice: in the session's library and in the store's snapshot of the last sync. A generated 600-brush library (16-bit tips, 800-2000 px, 2.27 GB decoded) cost about 4.5 GB after import and again after every restart. Library presets now hold their bitmaps as StoredTile references with a small saved preview (at most 96 px): photocraft-paint gains TipShape::Stored and Pattern::Stored (rendered with the full bitmap when loaded, else the preview), and the store writes each tip's size and preview with its group. Opening the store reads previews only; once a group is written its presets drop their full bitmaps. A tip is decoded when its brush is used (picking a preset, a stroke naming one, exporting) into a 256 MB least-recently-used cache. A loaded stored tip serialises as `sampled`, so tool presets, actions and brush.get keep the same JSON. Stores written before this change have no previews: their tips are decoded once at the next start, eight at a time, and the groups rewritten. A missing or corrupt tip file is now reported when the brush is used. Measured with crates/engine/examples/abr_memory.rs on the 600-brush library from crates/io/examples/gen_abr_library.rs (Windows, release): after import 4565 -> 38 MB working set, after restart 4551 -> 20 MB, after using 5 brushes 4560 -> 37 MB; store open 1.47 s -> 0.05 s. Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>