mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-27 09:42:00 +01:00
241 lines
25 KiB
Markdown
241 lines
25 KiB
Markdown
# Roadmap
|
||
|
||
Status legend: ✅ done · 🟡 in progress · ⬜ not started. Updated 2026-10-08.
|
||
|
||
**Parity metrics.** `cargo xtask parity` measures how much of Photoshop's menu tree is *wired to a
|
||
command* and writes [`parity.md`](parity.md). It does **not** measure whether those commands behave
|
||
like Photoshop, feel right, or survive real files. Read it next to the PSD composite oracle, the
|
||
test count, and the [honest parity assessment](#honest-parity-assessment-2026-10-05) below, which
|
||
is the reference answer to "how close are we really". The weighted feature estimate in
|
||
[`parity-estimate.md`](parity-estimate.md) (~82%) counts feature surface and overstates user-facing
|
||
readiness; treat it as an upper bound.
|
||
|
||
| M | Status | Where we are |
|
||
|---|---|---|
|
||
| M0 Skeleton | ✅ | workspace, xtask (layers / wasm / ci / stats / corpus / parity), CI workflow |
|
||
| M1 Foundation | ✅ | geom, color (27 blend modes), raster (COW tiles, any depth), doc, ops, cms (ICC) |
|
||
| M2 PSD v1 | ✅ | photocraft-psd: 134/135 real files byte-exact round trip |
|
||
| M3 Viewer app | ✅ | egui shell (Pro / Studio / Classic themes), 13+ codecs, native and web (trunk) builds |
|
||
| M4 Native format + engine | ✅ | 500+ commands, `.pcraft` (incremental, autosave, crash recovery), CLI, persistent preferences |
|
||
| M5 GPU compositor | 🟡 | wgpu compositor drives the canvas, layer effects, vector masks, artboards, pattern fills and every clip case included (≤1/255 vs CPU); Multichannel documents fall back to the CPU |
|
||
| M6 Paint + select | 🟡 | brush engine, all selection tools, multi-layer selection, snapping + smart guides, free transform + warp; stylus pressure on Windows (WM_POINTER via winit), the web (Pointer Events, with tilt/twist), macOS (AppKit event monitor: pressure, tilt, rotation, eraser end) and Linux X11 (XInput2 raw valuators); on Linux Wayland a pen opens the window through Xwayland (native tablet-v2 still open, #79) |
|
||
| M7 Adjust + filters | 🟡 | 16 adjustment layers + destructive-only adjustments, 70+ filters incl. Blur Gallery, Actions record/replay, Fade |
|
||
| M8 PSD v2 | 🟡 | adjustments (incl. Selective Color, Color Lookup), fills, effects, patterns, text, shapes, smart objects, alpha channels; oracle 111/170 |
|
||
| M9 Text, vector, styles | 🟡 | type engine + Warp Text, shapes / pen / paths, all 10 effects on CPU and GPU (parity ≤1/255, 30/31 corpus effect files on the GPU) |
|
||
| M10 Smart features | 🟡 | classical Select Subject / Object, content-aware fill and scale, healing, auto-align / auto-blend; ML backend not started |
|
||
| M11 Automation + formats | 🟡 | MCP (headless + live bridge), batch, Image Processor, prefs over MCP; DoD test passes (10 agent tasks over MCP, `automation/tests/agent_tasks.rs`); since 2026-10-07 the CLI rejects unknown flags and answers `<subcommand> --help`, batch runs report same-name outputs instead of overwriting them, MCP `command_batch` steps can start background jobs, and headless saves never flatten over the opened file; JP2 / DICOM / DPX / C2PA pending |
|
||
| M12 Pro parity | 🟡 | CMYK / Lab / Indexed / Bitmap / Duotone, ICC + soft proofing, channels + Quick Mask, smart-object stack modes, artboards, layer comps; print, HDR, photomerge, timeline pending |
|
||
|
||
**Menu parity: 532 / 625 (85.1%)** on 2026-10-01, up from 224 (35.8%) the day before. See [`parity.md`](parity.md).
|
||
|
||
2026-10-08: Affinity `.af`, `.afdesign`, `.afphoto` and `.afpub` documents (container versions
|
||
8–12) open **natively** ([format notes](../crates/affinity/README.md)): pages and artboards, layers
|
||
and groups, curves and geometric shapes with fills, gradients and strokes, text as type layers,
|
||
placed images as smart objects, pixel layers and masks, as an 8-bit RGB document without a source
|
||
save path. Measured against the thumbnail Affinity embeds in each file, 21 pinned public documents
|
||
(`cargo xtask corpus --affinity`) differ by 0–4.6 of 255 on average. Layer effects, adjustments,
|
||
live filters, brush strokes, special shapes, master pages and CMYK/Lab/16-bit document colour are
|
||
approximated or left out, each with a warning; damaged or unknown files fall back to the embedded
|
||
preview. Affinity writing is not implemented: no Affinity installation was available to check
|
||
written files, so `.af` export stays unsupported.
|
||
|
||
2026-10-09: `corpus/affinity/` now has 39 pinned documents and 21 PNGs (20 rendered references and
|
||
one bitmap-fill texture): the prior 21 public documents plus 18 CC0 samples for #1606. The new
|
||
samples compare against their exported PNGs;
|
||
mean differences range from 0.44/255 (conical gradients) to 86.05/255 (RGB/32 reduced to 8-bit).
|
||
Clouds, hearts, cogs, callouts, arrows, double stars, tears, crescents, diamonds and circular segments
|
||
now import as parametric shapes; the special-shapes sample measures 5.68/255 against its PNG. The
|
||
remaining gaps in #1606 stay tracked with per-sample corpus ceilings.
|
||
|
||
## Honest parity assessment (2026-10-05)
|
||
|
||
This is the reference answer to "how close are we to Photoshop parity, really". Agents: read it
|
||
before picking work. Update it (with dated measurements) when the numbers move; don't restate the
|
||
menu-parity number in its place.
|
||
|
||
**Measured numbers live in the [scorecard](scorecard.md)** (`cargo xtask scorecard`, kept current
|
||
by CI): performance scenarios against their budgets, corpus floors, per-area checklists with
|
||
done / partial / missing counts, and the number of settings that do nothing. Where the scorecard
|
||
and the estimates below disagree, the scorecard's numbers supersede them. As of 2026-10-05 it
|
||
counts 67 of 129 preferences that nothing reads; 3 of the 25 budgeted performance scenarios meet
|
||
their #209–#211 targets (first baseline, taken on a heavily loaded machine), and the 150-layer
|
||
nudge scenario crashes the GPU compositor; the open area issues' checklists (#203–#220) are
|
||
almost entirely missing or partial.
|
||
|
||
2026-10-07: UI Font Size now applies to interface text, including CJK fallbacks, independently
|
||
of display and canvas zoom (#532). The current preference audit drops from 59 to 58 unread
|
||
settings out of 135; see the regenerated scorecard.
|
||
|
||
2026-10-09: Output-preserving Radial Blur direct sampling measured on a local
|
||
i7-9750H, 12 workers, 24 MP RGBA8, Good quality, amount 1: Spin 66.10 → 16.43 s
|
||
(4.02×), Zoom 19.19 → 5.35 s (3.59×), one paired run each, exact output equality.
|
||
These are local measurements at amount 1; see [method and limits](radial-blur-performance.md).
|
||
|
||
2026-10-10: native selection distance transforms measured 7.59–10.57x faster on six
|
||
24–36 MP synthetic masks on an AWS c7i.4xlarge (16 workers, three paired release runs).
|
||
The transform also corrects f32 envelope errors past coordinate 4096, including nonzero
|
||
distances at selected pixels. The parallel path needs an additional four bytes per pixel;
|
||
see [measurements, correctness and limits](selection-distance-performance.md).
|
||
|
||
**Bottom line.** Two days after 0.2.0 we had merged ~96 PRs and closed ~48 issues, but **real
|
||
Photoshop parity is still well below 50%**. The biggest gaps are AI, missing tools, professional
|
||
workflow depth and the plug-in ecosystem. Most fixes since 0.2.0 have passed our tests but have
|
||
**not yet been validated by users**, and this week proved our tests miss what users hit:
|
||
on first public use they found broken basics (text selection offset, 214 shortcut failures, panels
|
||
resizing themselves, an immovable crop frame, folders that wouldn't collapse, lag on layout PSDs)
|
||
that all counted as "live" in `parity.md`.
|
||
|
||
**Overall.** Feature surface: roughly **60–70%** of what a typical Photoshop user touches exists in
|
||
some form. "A professional could switch for daily work": roughly **25–35%**. True 1:1 parity is
|
||
**many months** of focused work, and some areas need product decisions rather than effort.
|
||
Confidence: moderate — the next users of 0.2.x will move these numbers either way.
|
||
|
||
### By dimension
|
||
|
||
2026-10-10: [Shape stroke controls](shape-strokes.md) expose existing Solid/Dashed/Dotted,
|
||
custom dash/gap, offset, caps, joins, alignment, miter-limit and opacity capabilities in
|
||
Shape/Pen options and Properties. Properties stages a cached canvas preview before one
|
||
undoable edit. Gradient fill controls from #1053 remain open; the Line tool still draws a
|
||
filled bar. This extends UI reachability and does not claim Photoshop-authored stroke parity.
|
||
|
||
| Dimension | Measured / evidence (2026-10-05) | Grade | Notes |
|
||
|---|---|---|---|
|
||
| Menu wiring | 626/626 menu items dispatch a command (`parity.md`) | high but shallow | Says nothing about behaviour. |
|
||
| PSD fidelity (rendering) | Corpus oracle 115/170 (68%): 30 differ, 26 have no usable reference, 1 import error. 2026-10-07: io corpus 146/170, psd-tools corpus 236/309 (was 229: Advanced Blending knockouts), Photoshop oracles 132/258 | medium | Push to 170/170 under way (effects/strokes, multi-instance effects, 16/32-bit and colour modes, references for skipped files). |
|
||
| PSD round trip | 169/169 re-import identically; every adjustment layer and blend mode round-trips | high (within corpus) | Floors in `crates/io/tests/corpus.rs`; raise, never lower. Corpora: `cargo xtask corpus --all` (ours: https://github.com/storytold/photocraft-corpus). |
|
||
| Paint.NET import | 2026-10-09: 14/14 local PDN3 textures preserve editable layers exactly through `.pcraft` and render within 2.142/255 of full-size previews; a supplied 5.x document (1280×720, 11 layers) passes editing/history/native saves and matches its thumbnail within 0.418/255 mean; all 14 blend modes exercised synthetically | medium (limited corpus) | Import only; metadata omitted. More current-version files and full-size exports needed. See [PDN support](pdn.md). |
|
||
| Smart filters / text / effect shapes in PSDs | Measured on our Photoshop-authored set (https://github.com/storytold/photocraft-corpus, `corpus/photoshop`, 258 files): see the per-group floors in `crates/io/tests/corpus.rs` and `crates/engine/tests/photoshop_oracles.rs`. Smart objects and smart filters now survive PSD save and open (41 corpus files, 206 smart objects, round trip strict; Photoshop opens our exports with live filters); re-rendering Photoshop's smart filters with ours matches 5/30 (was 1/30) | low–medium | Remaining re-render gaps are filter maths (Gaussian/Motion Blur, Unsharp Mask, Emboss, Add Noise RNG) and bicubic placement. |
|
||
| Core editing (layers, masks, selections, adjustments, filters, transforms) | Broad engine coverage; many interaction bugs fixed after 0.2.0 (adjustment dialogs, Curves, crop, Move/Transform modifiers, gesture origin) | medium | Fixes not yet user-validated. |
|
||
| UI / UX polish | Shortcut audit 214 → 0 failures; dock, Layers rows and menus reworked; first visual-QA sweep found 14 defects (#147–#157). 2026-10-07: the keyboard-only shortcuts with no menu item (⌥[ ⌥] ⌥, ⌥. layer navigation, ⇧⌥[ ⇧⌥] to extend the selection, 1–0 for opacity and ⇧ for flow or fill, ⇧[ ⇧] hardness, ⌥⌘T to transform a copy and ⌥⇧⌘T to step and repeat), ⌥-click colour sampling with painting tools, double-click a Layers row for Layer Style, File › New from Clipboard, a centred main window and remembered Liquify settings (#352, #417, #350, #368, #419, #418). 2026-10-09: canvas zoom is physical at any display scale — 100% is one document pixel per physical display pixel, and every screen-space overlay, cursor, scrollbar, navigator and fit follows it (#1943) | low–medium | Needs recurring visual QA with realistic documents. |
|
||
| Tools | 2026-10-09: Pencil, Mixer Brush, Patch, Content-Aware Move, Vertical Type, Pattern Stamp and Rotate View are toolbar tools. Remaining missing tools include Red Eye, Art History Brush, Freeform/Curvature Pen, Add/Delete Anchor Point tools, single row/column marquee, Color Sampler, Perspective Crop, type masks and Frame | low–medium | Patch has a live healing preview. Content-Aware Move is partial: Move/Extend, Structure/Color and Sample All Layers exist; Transform On Drop and a live result preview remain missing (`TOOL-213-4` in the scorecard). Magic/Background Eraser added; live gradients in progress (#180). Magnetic Lasso added 2026-10-08 (live-wire edge tracing, Width/Contrast/Frequency, `select.magneticLasso`). Pattern Stamp added 2026-10-08 (S flyout, `paint.patternStamp`, Aligned / Impressionist). Rotate View (2026-10-09) turns the canvas camera around its centre without rewriting pixels; Reset View and Match Rotation copy the angle. Crop rotation (2026-10-09, #1792): dragging outside the crop frame turns it (⇧ 15° steps, angle readout), and ↵ rotates the document and crops in one undo step (`image.crop` `angle`); the frame turns over the image as in Photoshop's Classic Mode, and the options-bar Straighten is still missing. |
|
||
| Painting | Brush model and Brush Settings panel near Photoshop; .abr/.grd import; persistent presets; pen pressure/tilt on Windows, web, macOS and X11 | medium | Native Wayland pen input open (#79; a pen opens the window through Xwayland meanwhile); X11 pressure confirmed by a user, macOS not yet verified on tablet hardware. |
|
||
| Text / typography | Engine works; caret placement and size editing fixed; OpenType features, text-on-path editing, composer parity partial | medium-low | Measure with the Photoshop-authored set. |
|
||
| Colour management | Colour-managed canvas (document → monitor), embedded CMYK profiles, linear EXR/HDR, 16-bit float canvas | medium-high | Monitor profile follows only at launch. |
|
||
| Performance | 14k+ px on the GPU at ~⅓ the memory; adjustment preview 285 ms → 4–9 ms; font-size edits 297 ms → 4.6 ms; 2026-10-07: 30 MP TIFF open (banded, parallel strip/tile decode) Deflate 345 → 32 ms, LZW 428 → 43 ms, BigTIFF and every IFD readable; 2026-10-09: 4.2 MP Indexed Color, 256 colours, full-resolution CPU preview p50 3018 → 1061 ms (Ryzen AI 7 350, three measured runs; GPU upload excluded) | medium-high on rasters | Complex layout documents still laggy (#125/#128); >16384 px GPU tiling in progress (#49). Native Indexed Color previews run on one background worker with stale-result rejection; large palettes can still take about a second to compute. Web previews remain synchronous. |
|
||
| Stability | Never-crash lint series, crash guard, `panic_hunt` fuzzing in the gate | medium-high | No field crash data yet. |
|
||
| Camera RAW | DNG, CR2, Sony ARW (lossless + compressed), Nikon NEF (lossless + lossy compressed), RW2, uncompressed ORF; 2026-10-09: uncompressed Fujifilm RAF, Bayer and X-Trans (edge-directed X-Trans demosaic; 26 MP X-Trans develop 306 ms on 12 cores) | medium | CR3, compressed RAF, Nikon "lossy after split" and calibrated colour for non-DNG cameras (no Fuji colour calibration: neutral fallback) still open (#50). |
|
||
| AI / generative | none | ~0% | Deferred by decision (#41). |
|
||
| Ecosystem | Sandboxed WebAssembly plug-ins instead of .8BF; no ExtendScript/UXP/.atn; no Adobe Fonts/Libraries/cloud docs | low | By design for 8BF; scripting compatibility open. |
|
||
| Platforms | macOS (notarized), Windows, Linux (AppImage/deb/rpm/Flatpak bundle), web | medium-high | Flathub later (#173); Windows signing material pending. |
|
||
| Localisation | 2026-10-07: 10 UI languages; menu, `tl!`, blend mode, preference and brush-section coverage enforced by tests; live switching and scoped Preferences previews | medium | Engine errors/status messages still partly English; CJK web fonts, browser-locale detection, and RTL remain open. |
|
||
|
||
2026-10-08: Motion Blur adds adaptive FFT convolution for wide streaks while retaining the
|
||
row kernel merged in [#902](https://github.com/storytold/photocraft/pull/902) for shorter
|
||
streaks and unsupported cases. Native release medians of three paired runs on an Intel
|
||
i7-9750H with 12 Rayon workers, synthetic RGBA8 at 30° / distance 1000: 24 MP
|
||
22.594 → 9.785 s (2.31×), and 1.5 MP
|
||
2.455 → 0.592 s (4.15×).
|
||
Full-image comparisons differ by at most one U8 code level; distance 64/256 retain the
|
||
byte-identical row output. These measure decode/halo/filter/write/prune, excluding UI proxy
|
||
creation, compositing and upload; the UI remains synchronous. FFT work is scheduled within
|
||
a conservative 512 MiB working-set estimate, excluding stored Surface tiles and row fallback
|
||
memory. The crossover is a heuristic; images dominated by near-cutoff alpha can need extra
|
||
scalar work. These measurements do not establish Photoshop filter parity.
|
||
|
||
2026-10-10: Proximity Match search medians on an AWS c7i.4xlarge improved 1.54–3.82x
|
||
for four synthetic stroke regions (50–300 px holes), with identical source displacements.
|
||
Bounding the mask table to the hole and pruning losing SSD candidates reduced table storage
|
||
by about 90–93 percent there. Full 24–36 MP kernel inputs improved 4.60–6.24x, but normal
|
||
engine strokes already use a cropped region. See [method and limits](proximity-match-performance.md).
|
||
|
||
2026-10-09: the Remove tool is in the J flyout (`paint.remove`, a background job). A stroke
|
||
around an object also removes what it encloses. The fill is non-local patch completion with
|
||
texture features (A. Newson et al., IPOL 2017: `crates/algo/src/nonlocal.rs`), finished by a
|
||
best-patch copy and gradient-domain seam hiding. On 20 holes in public-domain photos
|
||
(`remove_quality`, `docs/development.md` › Remove Tool quality) the fill keeps 0.89 of the
|
||
original's texture (Wexler/PatchMatch completion as Content-Aware Fill uses it: 0.54). On a 24 MP
|
||
document a 100 px ring takes 120 ms and a 1000 px ring 2.5 s (`remove_bench`). It is not
|
||
generative: large objects over complex structure fill less convincingly than Photoshop's AI mode
|
||
(#41).
|
||
|
||
2026-10-08: the tools update above is checked against the current toolbar groups in
|
||
[`panels.rs`](../crates/ui-egui/src/panels.rs), the Pencil and tool-cycle tests in
|
||
[`pencil_tests.rs`](../crates/ui-egui/src/pencil_tests.rs), Patch's live-preview test in
|
||
[`patch_preview.rs`](../crates/ui-egui/src/patch_preview.rs), and Vertical Type's point/paragraph
|
||
creation and undo test in [`type_tool_tests.rs`](../crates/ui-egui/src/type_tool_tests.rs).
|
||
These implementations remove the tools from the missing list; they do not establish Photoshop
|
||
behavioural parity. The historical estimates and corpus measurements in this assessment are
|
||
unchanged; current measured floors remain in the scorecard.
|
||
|
||
2026-10-07: Camera Raw PSD mapping covers relative custom white balance, Light/Presence,
|
||
parametric and four point curves, HSL, Color Grading, sharpening/noise detail, grain and numeric
|
||
post-crop vignette controls. Two revisions of one supplied Photoshop ACR 18.4 PSD preserve their
|
||
filter descriptors without edits. The updated revision stays opaque because of active manual
|
||
Optics and unverified vignette style; a descriptor projection verifies its supported controls.
|
||
Synthetic 8/16/32-bit PSD → edit → `.pcraft` → PSD tests preserve the filter stack, mask and
|
||
undo/redo. Unmapped Camera Raw fields/versions remain opaque; Photoshop
|
||
acceptance of generated exports and pixel parity are still unverified. Corpus floors above are
|
||
unchanged.
|
||
|
||
2026-10-10: Select and Mask's Shift Edge now computes the exact octagonal footprint
|
||
with a square window extreme plus a dyadically built Manhattan ball. On a c7i.4xlarge
|
||
(16 vCPUs), full tiled CPU refinement at radius 64 / Shift Edge +100% takes
|
||
3.019 s -> 0.762 s at 24 MP (3.96x),
|
||
3.706 s -> 0.921 s at 36 MP (4.02x).
|
||
Three alternating paired release runs include guide sampling, guided filtering,
|
||
boundary distances, quantization and assembly. Every output mask matches exactly.
|
||
The dense fractional 24 MP radius-64 dilation kernel improves 36.00x;
|
||
circular soft-mask kernels improve 20.76-172.16x at 24-36 MP, radii 4-64.
|
||
Bounded halo tiles reduce the large-mask workspace allocation bound from 192/288 MB
|
||
to about 115/163 MB, including output and 16 workers' scratch, excluding the source.
|
||
See [method and results](octagonal-mask-performance.md).
|
||
|
||
### Where we're going (priority order)
|
||
|
||
1. **Ship the fixes:** cut 0.2.1 once the current batch lands, so users validate them.
|
||
2. **PSD fidelity to 170/170** with round trips, plus the Photoshop-authored reference set for smart
|
||
filters, the text engine and effect shapes (https://github.com/storytold/photocraft-corpus, fetched by
|
||
`cargo xtask corpus --all`); enforce floors in `corpus.rs`.
|
||
3. **Workflow acceptance tests:** 30–50 real tasks (retouch a portrait, social post with text and
|
||
effects, composite with masks and adjustment layers, CMYK print prep…) scripted end to end and
|
||
checked against Photoshop's output on every build. Their pass rate becomes the headline parity
|
||
number.
|
||
4. **Tool coverage and workflow depth:** Pen variants (Direct Selection landed, #790) and
|
||
Perspective Crop; finish Content-Aware Move's Transform On Drop and live result preview.
|
||
Pencil, Mixer Brush, Patch, Vertical Type, Pattern Stamp and Rotate View are already available on the toolbar.
|
||
5. **Complex-document performance** (#125/#128) and GPU tiling beyond the texture limit (#49).
|
||
6. **Recurring visual QA** (`cargo run -p photocraft-engine --example designer_psd`) and fast
|
||
turnaround on user reports (OS, document size, layer count, screenshot).
|
||
7. Later / needs decisions: generative AI backend (#41), scripting compatibility (ExtendScript /
|
||
UXP / .atn), Flathub (#173), Wayland pen pressure (#79).
|
||
|
||
## Current focus (infrastructure before the long tail)
|
||
|
||
Landed on 2026-10-01:
|
||
- multi-layer selection, live smart objects + smart filters, alpha channels + Quick Mask;
|
||
- patterns, Warp, preferences, snapping, ~33 filters, the remaining core adjustments;
|
||
- Layer Comps and Artboards, GPU layer effects, Liquify / Puppet Warp / Perspective Warp;
|
||
- the PSD fidelity pass (oracle 102 → 111), the M11 MCP acceptance test, and the release pipeline
|
||
(`docs/releasing.md`).
|
||
|
||
Next:
|
||
1. **Follow "Where we're going" in the assessment above.** 0.2.0 shipped signed and notarized on
|
||
2026-10-05 (`docs/releasing.md`); Windows code-signing material still needs to be obtained.
|
||
2. **Fidelity**: the PSD oracle (113/170). Modern Brightness/Contrast and grayscale Levels
|
||
curves; chisel-soft / stroke-emboss bevel shapes; Photoshop's 8-bit blend rounding; non-Normal
|
||
modes in Lab documents; smart-filter maths against Photoshop's (re-render oracle 5/30).
|
||
3. **GPU**: only Multichannel documents and regions over the texture limit fall back to the CPU.
|
||
4. **Vanishing Point, Camera Raw / Lens Correction, Face-Aware Liquify** (needs a landmark model).
|
||
5. **Panels**: Patterns, Styles, Glyphs, Character/Paragraph Styles, Timeline; Custom Shape tool.
|
||
6. Print, Photomerge, Merge to HDR, video layers.
|
||
|
||
## Milestone definitions
|
||
|
||
Each milestone has a **definition of done (DoD)** and must leave `main` green on all Tier-1 platforms plus a wasm build.
|
||
|
||
| M | Name | Scope (key items) | DoD / acceptance |
|
||
|---|---|---|---|
|
||
| **M0** | Skeleton | Workspace, all crate stubs, lints, `xtask` (layers check, ci), CI matrix, testkit | `cargo test --workspace` green; `cargo check --target wasm32-unknown-unknown -p photocraft-engine -p photocraft-ui-egui` green; layering check passes |
|
||
| **M1** | Foundation | geom, color (formats, blend math for all 27 modes, sRGB/linear), raster (sparse COW tiles, U8/U16/F32), doc (full type model incl. CMYK/Lab/adjust/smart), ops (history) | Property tests (proptest) on tile COW and history; blend-mode reference tests against published formulas |
|
||
| **M2** | PSD v1 | `photocraft-psd`: header, resources, layer records, channel data (raw/RLE/ZIP/ZIP+pred), masks, groups (lsct), unicode names, unknown-block passthrough, merged image, PSB; writer | Round-trip byte-stability tests; synthetic PSD generator tests; fuzz target; ≥150 unit tests |
|
||
| **M3** | Viewer app | codecs (png/jpeg/tiff/webp/gif/bmp/tga/pnm/qoi/exr/hdr, all read+write), CPU compositor, egui shell (menu from registry, canvas pan/zoom, layers panel, history), open/save, native + web build | Opens PNG/JPEG/PSD, shows layers, toggles visibility, undo/redo, saves PNG/PSD; web build loads a file from the browser |
|
||
| **M4** | Native format + engine | `.pcraft` bundle, command registry with schemas, jobs/cancellation, snapshots via arc-swap, CLI (`convert`, `run`, `inspect`) | CLI parity tests: every GUI command also runs headless |
|
||
| **M5** | GPU compositor | wgpu planner backend, tile residency, parity tests vs CPU (all blend modes), viewport on GPU, mips | GPU vs CPU ≤1/255; pan/zoom 60 fps on a 100 MP / 20-layer document |
|
||
| **M6** | Paint + select | platform input (pen: macOS/Windows/Linux/web), brush engine v1, eraser, marquee/lasso/wand, move, free transform, crop | Brush latency <1 frame; selection-restricted paint tests |
|
||
| **M7** | Adjust + filters | 16 adjustment layers, first 30 filters, schema-generated dialogs + live preview, actions record/replay | Golden tests at 8/16/32f; action replay determinism |
|
||
| **M8** | PSD v2 | adjustment layers, fill layers, lfx2 effects (descriptor parser), text (EngineData) preserve+render, smart objects, vector masks | Composite-oracle pass rate ≥90% on corpus |
|
||
| **M9** | Text, vector, styles | parley text layers, shapes/pen/paths, all 10 layer effects on GPU | Visual goldens; PSD text round-trip |
|
||
| **M10** | Smart features | `ml` (ort native / ort-web on the web), Select Subject/Object/Sky, Remove BG, Remove tool, content-aware fill, healing, AI denoise, RAW develop | Quality benchmarks on a public dataset; timing budgets |
|
||
| **M11** | Automation + formats | MCP server, batch, scripting, remaining formats (JP2, DICOM, DPX…), C2PA | An agent completes 10 scripted edit tasks via MCP |
|
||
| **M12** | Pro parity | CMYK/Lab UI, print, HDR display, photomerge/HDR merge, timeline, layer comps, artboards, symmetry, neural filters | `xtask parity` ≥ 90% of Photoshop menu checklist |
|