mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-14 11:16:53 -04:00
Progress docs: target-app parity, gaps, alpha gate, readiness by audience (#2696)
Progress docs per craftrules standards/progress-docs.md: target-app parity (merges parity-estimate.md), gaps, roadmap with alpha gate, readiness by audience (full / mainstream / essentials) with Opus 5.5 hours, and UI, brush, format, hardware and localization parity docs. docs/parity.md is now docs/parity-checklist.md. The Windows test failure (file_dialog::tests::save_dialogs_remember_where_each_document_was_last_saved) is pre-existing on main: the test hard-codes POSIX paths. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
5ab78e8ce1
commit
939c8f2c70
26 files changed
+1636
-361
No files matched your search
@@ -11,8 +11,12 @@ PhotoCraft is an open-source, native, Photoshop-comparable image editor written
|
||||
| `docs/contributing.md` | Rules: clean-room, tests, layering, style, commits; the "add a command" checklist |
|
||||
| `docs/control-protocol.md` | JSON control channel: how agents drive and screenshot the running app |
|
||||
| `docs/ui-design.md` | Design tokens, themes, widgets, and how to match Photoshop's look |
|
||||
| `docs/roadmap.md` | Honest parity assessment (where we're lacking, where we're going), milestones, **current focus** |
|
||||
| `docs/parity.md` | Generated list of every Photoshop menu item, live or missing |
|
||||
| `ROADMAP.md` | One-page summary: stage, the two parity numbers, every dimension, languages, what's next |
|
||||
| `docs/target-app-parity.md` | The authoritative parity assessment against Photoshop 2026: numbers, weights, evidence, hours |
|
||||
| `docs/gaps.md` | Every known shortfall, ranked: the work list to pick from |
|
||||
| `docs/roadmap.md` | Milestones, **current focus**, what's next with estimates |
|
||||
| `docs/ui-parity.md`, `docs/brush-parity.md`, `docs/context-menu-parity.md`, `docs/file-format-parity.md`, `docs/hardware-parity.md`, `docs/localization-parity.md` | Per-dimension parity checklists |
|
||||
| `docs/parity-checklist.md` | Generated list of every Photoshop menu item, live or missing |
|
||||
| `docs/scorecard.md` | Generated scorecard: performance budgets and numbers, corpus floors, per-area checklists (tools, files, UI, type, automation, reliability, distribution), settings that do nothing |
|
||||
| `crates/<name>/README.md` (where present) | Public API of that crate |
|
||||
| [photocraft-corpus](https://github.com/storytold/photocraft-corpus) + `docs/development.md` › Test corpora | Real-file test oracles (our Photoshop-authored PSDs); with psd-tools, ag-psd and PngSuite fetched into `corpus/` by `cargo xtask corpus --all` at the pins in `xtask/src/corpus_pins.rs` |
|
||||
@@ -70,15 +74,16 @@ People trust PhotoCraft with their work, and a crash loses it. A malformed file,
|
||||
|
||||
Priorities: important infrastructure first, then low-hanging parity, then the long tail.
|
||||
|
||||
0. **Read `docs/roadmap.md` → "Honest parity assessment" first.** It says, dimension by dimension,
|
||||
where PhotoCraft is lacking and the priority order of where we're going. `docs/parity.md`
|
||||
(menu wiring) is not a measure of behaviour. When your work moves a measured number (PSD oracle,
|
||||
round trips, workflow tests, performance), update that section with the dated figure.
|
||||
0. **Read `ROADMAP.md`, then `docs/gaps.md`.** `docs/target-app-parity.md` says, dimension by
|
||||
dimension, where PhotoCraft is lacking; `docs/gaps.md` ranks the work. `docs/parity-checklist.md`
|
||||
(menu wiring) is not a measure of behaviour. When your work moves a number or closes a gap,
|
||||
update the parity doc and gap entry it belongs to, with the date, and bump their status line
|
||||
and revision history (craftrules `standards/progress-docs.md`).
|
||||
1. **Check `docs/scorecard.md`** before picking work: each area's `missing` and `partial` rows,
|
||||
the performance scenarios that are over budget or not measurable yet, and the count of
|
||||
settings that do nothing. Its numbers are measured; prefer them to estimates.
|
||||
2. `docs/roadmap.md` → **Current focus**.
|
||||
3. `cargo xtask parity` → `docs/parity.md` lists every missing menu item, grouped by menu. Low-hanging fruit is usually a missing command whose algorithm already exists in `algo`, `paint`, `vector` or `text`.
|
||||
3. `cargo xtask parity` → `docs/parity-checklist.md` lists every missing menu item, grouped by menu. Low-hanging fruit is usually a missing command whose algorithm already exists in `algo`, `paint`, `vector` or `text`.
|
||||
4. `log/devlog.md` → the "Still open" bullets of recent entries.
|
||||
|
||||
When parity rises, raise `FLOOR` in `crates/ui-egui/src/parity.rs` (never lower it).
|
||||
@@ -90,7 +95,7 @@ cargo test -p <crates you touched>
|
||||
cargo clippy -p <crates> --all-targets -- -D warnings
|
||||
cargo xtask layers
|
||||
cargo xtask wasm # if you touched L0–L6
|
||||
cargo xtask parity # if you added commands; commit the regenerated docs/parity.md
|
||||
cargo xtask parity # if you added commands; commit the regenerated docs/parity-checklist.md
|
||||
cargo test -p photocraft-engine --test panic_hunt -- --ignored # if you added/changed commands: no panic on adversarial input (Rule 9)
|
||||
cargo xtask scorecard # if you moved a number: flip the checklist row in scorecard/*.toml, raise a
|
||||
# corpus floor, fix a dead preference, or meet a budget (then set enforce = true
|
||||
@@ -119,7 +124,8 @@ Then append a terse entry to `log/devlog.md` (what landed, numbers, what's still
|
||||
|
||||
|
||||
- `docs/roadmap.md`: milestones M0–M12, status and the current focus.
|
||||
- `docs/parity.md`: generated Photoshop menu coverage.
|
||||
- `ROADMAP.md`, `docs/target-app-parity.md`, `docs/gaps.md` and the `docs/*-parity.md` checklists: where we stand against Photoshop.
|
||||
- `docs/parity-checklist.md`: generated Photoshop menu coverage.
|
||||
- `docs/scorecard.md`: generated scorecard (sources: `scorecard/*.toml`, `perf/budgets.toml`, `perf/baseline.json`, corpus floors, prefs audit).
|
||||
- `docs/releasing.md`: cutting a release (`cargo xtask version`, the `release` branch), signing secrets, packaging scripts in `packaging/`.
|
||||
- `../craftrules/release/playbook.md`: how every storytold app builds signed release binaries (the canonical recipe; `docs/release-playbook.md` just points there); `docs/releasing.md` is PhotoCraft's specifics.
|
||||
|
||||
@@ -298,7 +298,7 @@ photocraft
|
||||
Maintainers: [`docs/releasing.md`](docs/releasing.md) explains how releases are built, signed and published.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Status:** PhotoCraft is in early alpha, and we want to be straight about where it stands: much of Photoshop's feature surface exists in some form, but **it is not yet a Photoshop replacement for daily professional work**. The biggest gaps are AI/generative features, about twenty missing tools, depth in typography and pro workflows, and plug-in compatibility. Every Photoshop menu item is wired to a command ([`docs/parity.md`](docs/parity.md)), but that measures wiring, not behaviour. The honest, dimension-by-dimension picture and where we're going next are in the [roadmap's parity assessment](docs/roadmap.md#honest-parity-assessment-2026-10-05). Expect rough edges, and please file issues (include your OS, document size, layer count and a screenshot). You can also tell us what broke on [Discord](https://discord.gg/artcraft).
|
||||
> **Status:** PhotoCraft is in early alpha, and we want to be straight about where it stands: much of Photoshop's feature surface exists in some form, but **it is not yet a Photoshop replacement for daily professional work**. The biggest gaps are AI/generative features, 15 missing tools, depth in typography and pro workflows, and plug-in compatibility. Every Photoshop menu item is wired to a command ([`docs/parity-checklist.md`](docs/parity-checklist.md)), but that measures wiring, not behaviour. The honest, dimension-by-dimension picture and where we're going next are in the [roadmap](ROADMAP.md) and [parity assessment](docs/target-app-parity.md). Expect rough edges, and please file issues (include your OS, document size, layer count and a screenshot). You can also tell us what broke on [Discord](https://discord.gg/artcraft).
|
||||
|
||||
## Documentation
|
||||
|
||||
|
||||
+141
@@ -0,0 +1,141 @@
|
||||
# PhotoCraft roadmap
|
||||
|
||||
**Stage: alpha** · next: beta, ~30 points (ready for real work ~45% → ~75%, with reliable PSD) and ~1,100–1,800 h away
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: full re-measure against Photoshop 2026 27.11.0) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
PhotoCraft's one-page summary of how close it is to Adobe Photoshop 2026 (27.11.0, measured from
|
||||
the installed app on 2026-10-10) at version 0.6.0. Detail: [target-app parity](docs/target-app-parity.md)
|
||||
(methodology, weights, evidence), [gaps](docs/gaps.md) (the ranked work list),
|
||||
[roadmap](docs/roadmap.md) (milestones, current focus), [scorecard](docs/scorecard.md) and
|
||||
[menu checklist](docs/parity-checklist.md) (both generated and measured),
|
||||
[architecture](docs/architecture.md).
|
||||
|
||||
Hours are Opus 5.5 agent wall-clock hours for one agent working sequentially, calibrated from this
|
||||
repository's 1,004 merged PRs (see [calibration](docs/target-app-parity.md#remaining-effort-and-calibration)).
|
||||
About 80% of the work parallelizes.
|
||||
|
||||
## Headline numbers
|
||||
|
||||
| | Value | Kind |
|
||||
|---|---|---|
|
||||
| **Feature breadth** | **~76%** | partly measured: menus 628/628, tools 53/68, panels 30/35, formats 13+4 of 31 |
|
||||
| **Ready for real work** | **~45%** (40–50%) | estimated: weighted by dimension below |
|
||||
| Mainstream practitioner | ~43% (38–48%) | estimated: weekly areas of a typical pro, with discounts ([method](docs/target-app-parity.md#mainstream-practitioner-43)) |
|
||||
| Essentials user | ~61% (55–67%) | estimated: core features only ([method](docs/target-app-parity.md#essentials-user-61)) |
|
||||
| Remaining to **beta** | **~1,100–1,800 h** | estimated |
|
||||
| Remaining to **full parity** | **~2,300–4,100 h** | estimated; AI and plug-ins need owner decisions |
|
||||
|
||||
### Readiness by audience
|
||||
|
||||
| Audience | Ready % | Opus 5.5 agent-hours to ~95% | Work that dominates |
|
||||
|---|---:|---:|---|
|
||||
| Full target (ready for real work) | ~45% (additive weighted sum: 46%) | 2,300–4,100 | Everything below, plus AI tier, plug-in/scripting ecosystem, video, localization, hardware |
|
||||
| Mainstream practitioner | ~43% | 1,700–2,800 | Depth in the 11 weekly areas (1,180–2,000), performance budgets, stability on real machines, PSD exchange with Photoshop |
|
||||
| Essentials user | ~61% | 400–700 | Startup and GPU robustness, brush and transform responsiveness, Type tool, discoverability (flyouts, commit buttons), AVIF/PDF open |
|
||||
|
||||
Hours calibrated as in [Remaining effort](docs/target-app-parity.md#remaining-effort-and-calibration) (2–9 h per checklist
|
||||
item, 8–20 h per format or subsystem, from the repo's 1,004 merged PRs); each tier is a subset of
|
||||
the one above. About 80% parallelizes (independent crates and command modules); performance
|
||||
architecture and the PSD writer are the serial parts.
|
||||
|
||||
**Why alpha.** Core workflows (open, layer, select, paint, adjust, filter, type, save) work end to
|
||||
end, and breadth is high, but users of 0.5/0.6 have 579 open issues, 22 of 25 performance budgets
|
||||
are missed, and PSDs we write are not yet reliably accepted by Photoshop (#1281, #2469). Beta
|
||||
needs ~75% ready and no blocking PSD gap. The [alpha gate](docs/roadmap.md#alpha-gate) passes: all six core workflows
|
||||
(retouch, composite, cut-out, design, paint, PSD exchange) complete end to end and save and reopen;
|
||||
four are partial in depth, none blocked.
|
||||
|
||||
## By dimension
|
||||
|
||||
| Dimension | % ready | Hours to full | Doc |
|
||||
|---|---:|---:|---|
|
||||
| Features (depth) | 55% (breadth 76%) | 600–1,000 | [target-app-parity](docs/target-app-parity.md#feature-areas) |
|
||||
| UI/UX fidelity (tools, handles, modifiers, brush feel, panels) | 40% | 350–600 | [ui-parity](docs/ui-parity.md), [brush-parity](docs/brush-parity.md), [context-menu-parity](docs/context-menu-parity.md) |
|
||||
| File formats | 60% (presence ~80%) | 300–500 | [file-format-parity](docs/file-format-parity.md) |
|
||||
| Hardware (GPU, pen, displays) | 50% | 80–150 | [hardware-parity](docs/hardware-parity.md) |
|
||||
| Localization | 55% | 80–140 | [localization-parity](docs/localization-parity.md) |
|
||||
| Performance | 25% (3/25 budgets met, measured) | 200–350 | [scorecard](docs/scorecard.md#performance) |
|
||||
| Stability | 45% | 150–250 | [gaps](docs/gaps.md#g3-user-reported-bug-backlog) |
|
||||
| Platforms | 80% | 30–60 | [scorecard](docs/scorecard.md#distribution) |
|
||||
| Ecosystem / plug-ins / scripting | 15% | 250–450 | [gaps](docs/gaps.md#g16-plug-in-compatibility) |
|
||||
| AI features | 10% | 300–600 | [gaps](docs/gaps.md#g15-ai-and-generative-features) |
|
||||
|
||||
## Features
|
||||
|
||||
| Area | % ready | Hours |
|
||||
|---|---:|---:|
|
||||
| Layers, masks, blend modes, smart objects, styles | 65% | 150–250 |
|
||||
| Selections, Select and Mask, channels | 55% | 120–200 |
|
||||
| Painting and brush engine | 55% | 150–250 |
|
||||
| Retouching (healing, clone, patch, remove, content-aware) | 50% | 100–180 |
|
||||
| Transform, warp, puppet, liquify | 55% | 100–180 |
|
||||
| Adjustments and filters | 70% | 120–200 |
|
||||
| Type | 40% | 120–200 |
|
||||
| Vector shapes and paths | 55% | 80–140 |
|
||||
| Colour management and modes | 70% | 60–100 |
|
||||
| Camera Raw and computational photo | 45% | 120–200 |
|
||||
| Automation, actions, scripting | 45% | 120–200 |
|
||||
| File I/O | 60% | 300–500 |
|
||||
| Print, export, Save for Web | 50% | 60–100 |
|
||||
| Video / timeline, data-driven graphics | 30% | 100–200 |
|
||||
| Workspace, panels, preferences | 40% | 150–250 |
|
||||
| AI / generative | 10% | 300–600 |
|
||||
|
||||
Rows and evidence: [target-app-parity › Feature areas](docs/target-app-parity.md#feature-areas).
|
||||
|
||||
## Languages
|
||||
|
||||
Measured with the `cargo xtask i18n-coverage` key universe (1,608 keys). `partial` everywhere
|
||||
because engine messages are still English. Detail: [localization-parity](docs/localization-parity.md).
|
||||
|
||||
| Language | Code | UI strings | Status |
|
||||
|---|---|---:|---|
|
||||
| English | `en` | 100% | full |
|
||||
| Simplified Chinese | `zh-hans` | 100% | partial |
|
||||
| Spanish | `es` | 100% | partial |
|
||||
| Hindi | `hi` | 0% | none |
|
||||
| Arabic | `ar` | 0% (no RTL UI) | none |
|
||||
| French | `fr` | 100% | partial |
|
||||
| Portuguese (Brazil) | `pt-br` | 100% | partial |
|
||||
| Indonesian | `id` | 100% | partial |
|
||||
| Japanese | `ja` | 100% | partial |
|
||||
| German | `de` | 100% | partial |
|
||||
| Korean | `ko` | 100% | partial |
|
||||
| Vietnamese | `vi` | 0% | none |
|
||||
|
||||
Also shipped: Traditional Chinese, Russian, Ukrainian, Czech, Polish, Greek, Dutch, Italian (8).
|
||||
|
||||
## Upcoming
|
||||
|
||||
| Rank | Milestone | Estimate |
|
||||
|---|---|---:|
|
||||
| 1 | PSD that Photoshop trusts: Save As corruption, Photoshop re-open check, Photoshop-oracle floor 133 → 200+ of 256 | 150–250 h |
|
||||
| 2 | Performance budgets: the 22 over-budget scenarios and the 150-layer GPU crash | 200–350 h |
|
||||
| 3 | User bug backlog to under 100 open | 250–400 h |
|
||||
| 4 | Brush and transform feel (brush-parity, ui-parity rows) | 160–290 h |
|
||||
| 5 | The 15 missing tools | 60–100 h |
|
||||
|
||||
Detail and the next releases: [docs/roadmap.md](docs/roadmap.md).
|
||||
|
||||
## Progress log
|
||||
|
||||
| Date | Entry |
|
||||
|---|---|
|
||||
| 2026-10-10 | Full re-measure against Photoshop 2026 27.11.0 (installed bundle inspected): breadth ~76%, ready ~45%, alpha. Progress docs reorganized to the craftrules standard (`parity.md` → `parity-checklist.md`, `parity-estimate.md` merged into `target-app-parity.md`). 0.6.0 released. |
|
||||
| 2026-10-09 | Remove tool, Rotate View, crop rotation; OpenRaster and Paint.NET; 39 Affinity documents in the corpus |
|
||||
| 2026-10-08 | 0.5.0. Affinity import; Magnetic Lasso, Pattern Stamp, Mixer Brush, Pencil, Patch, Vertical Type on the toolbar |
|
||||
| 2026-10-07 | 0.3.0. 10 UI languages; shortcut audit 214 → 0 failures; TIFF decode 10× faster |
|
||||
| 2026-10-05 | 0.2.0, first signed and notarized release. Honest assessment: ready for real work 25–35% |
|
||||
| 2026-10-03 | Menu breadth 625/625 |
|
||||
| 2026-10-01 | Menu breadth 224 → 532 of 625 in a day |
|
||||
| 2026-09-30 | First commit |
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | minor | Readiness by audience with hours per tier |
|
||||
| 2026-10-10 | minor | Mainstream-practitioner and essentials-user numbers added |
|
||||
| 2026-10-10 | minor | Alpha gate result (passes; stays alpha) in the stage explanation |
|
||||
| 2026-10-10 | major | First version, per craftrules `standards/progress-docs.md` |
|
||||
@@ -1,6 +1,6 @@
|
||||
# Roadmap
|
||||
|
||||
The live product roadmap, milestone definitions, parity measurements, and current focus are maintained in [`docs/roadmap.md`](https://github.com/storytold/photocraft/blob/main/docs/roadmap.md). Menu coverage is generated into [`docs/parity.md`](https://github.com/storytold/photocraft/blob/main/docs/parity.md) by `cargo xtask parity`.
|
||||
The live product roadmap, milestone definitions, parity measurements, and current focus are maintained in [`docs/roadmap.md`](https://github.com/storytold/photocraft/blob/main/docs/roadmap.md). Menu coverage is generated into [`docs/parity-checklist.md`](https://github.com/storytold/photocraft/blob/main/docs/parity-checklist.md) by `cargo xtask parity`.
|
||||
|
||||
Security hardening is cross-cutting rather than a replacement for those product milestones. The current security sequence is:
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//! Print Photoshop menu parity and optionally write the Markdown report.
|
||||
//!
|
||||
//! ```sh
|
||||
//! cargo run -p photocraft-ui-egui --example parity -- [--write docs/parity.md] [--json]
|
||||
//! cargo run -p photocraft-ui-egui --example parity -- [--write docs/parity-checklist.md] [--json]
|
||||
//! ```
|
||||
//! Usually run through `cargo xtask parity`.
|
||||
|
||||
|
||||
@@ -1920,7 +1920,7 @@ mod reveal_label_tests {
|
||||
_ => "Im Ordner anzeigen",
|
||||
};
|
||||
assert_eq!(translated_menu_label(de, reveal[0]), expected);
|
||||
// The menu catalogue (and docs/parity.md) keeps Photoshop's macOS name.
|
||||
// The menu catalogue (and docs/parity-checklist.md) keeps Photoshop's macOS name.
|
||||
assert!(crate::menu_catalog::CATALOG.iter().any(|(_, label, _, i)| *i == id && *label == "Reveal in Finder"));
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
//! Photoshop menu parity: how much of [`crate::menu_catalog::CATALOG`] is live.
|
||||
//!
|
||||
//! `cargo xtask parity` prints this report and writes `docs/parity.md`. A test keeps the live
|
||||
//! `cargo xtask parity` prints this report and writes `docs/parity-checklist.md`. A test keeps the live
|
||||
//! count from regressing below [`FLOOR`].
|
||||
|
||||
use crate::menu_catalog::CATALOG;
|
||||
@@ -31,7 +31,7 @@ impl Parity {
|
||||
if self.total == 0 { 0.0 } else { 100.0 * self.live as f64 / self.total as f64 }
|
||||
}
|
||||
|
||||
/// The report as Markdown (the body of `docs/parity.md`).
|
||||
/// The report as Markdown (the body of `docs/parity-checklist.md`).
|
||||
pub fn to_markdown(&self) -> String {
|
||||
let mut s = String::new();
|
||||
s.push_str("# Photoshop menu parity\n\n");
|
||||
|
||||
+39
-3
@@ -1,6 +1,35 @@
|
||||
# Photocraft Architecture
|
||||
# PhotoCraft architecture
|
||||
|
||||
Status: draft v1 (2026-09-30). This plan does not assume a final UI toolkit. The candidates are discussed in [`rust-framework-options.md`](rust-framework-options.md).
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** minor (current-state summary added; the design plan below is kept, with its deviations listed) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
## Current state (2026-10-10)
|
||||
|
||||
What exists on `main` today. The numbered sections below are the original design plan of
|
||||
2026-09-30; where the code differs, this summary wins.
|
||||
|
||||
- **Workspace:** 25 library crates under `crates/`, 3 apps (`photocraft` desktop, `photocraft-cli`,
|
||||
`photocraft-web`), `xtask`, an example plug-in and 5 fuzz crates; ~393,000 lines of Rust in
|
||||
~1,020 files; ~5,460 `#[test]` functions (ui-egui 1,677, engine 1,237, algo 408, io 377,
|
||||
codecs 325, psd 263). Crate map and layers: [`AGENTS.md`](../AGENTS.md) §2 and
|
||||
`xtask/src/layers.rs` (enforced by `cargo xtask layers`).
|
||||
- **UI toolkit:** decided: egui/eframe on wgpu (no webview, no JavaScript). The same Rust builds
|
||||
to WebAssembly for the browser (trunk + wasm-bindgen).
|
||||
- **Engine:** ~700 commands registered in `crates/engine` (`CommandSpec` in `commands.rs`); the
|
||||
UI, CLI, JSON control channel and MCP server all dispatch by command id. 628 Photoshop menu items
|
||||
map to them (`crates/ui-egui/src/menu_catalog.rs`).
|
||||
- **Rendering:** CPU compositor (`compose`, the oracle) and wgpu compositor (`gpu`, ≤ 1/255 of the
|
||||
CPU); colour through our own ICC engine (`cms`), display transform folded into a GPU 3D LUT.
|
||||
- **Files:** own PSD/PSB crate (`psd`), flat codecs (`codecs`), camera raw (`raw`), HEIF (`heif`),
|
||||
Affinity (`affinity`), document mapping (`io`), native `.pcraft` (`format`, atomic saves).
|
||||
Coverage: [`file-format-parity.md`](file-format-parity.md).
|
||||
- **Not built (yet) from the plan:** the `ml` crate (no ML runtime; see gap G15), plug-in ABI v2.
|
||||
- **Deviations from the plan below:** `photocraft-tablet` is the one crate allowed `unsafe`
|
||||
(AppKit pen events); `affinity`, `heif` and `raw` crates were added; the phased roadmap in §15
|
||||
is superseded by [`roadmap.md`](roadmap.md).
|
||||
|
||||
---
|
||||
|
||||
# Design plan (2026-09-30)
|
||||
|
||||
This plan sets out:
|
||||
- the Cargo workspace,
|
||||
@@ -529,7 +558,7 @@ Versions get pinned when we scaffold, using the numbers in `rust-framework-optio
|
||||
|
||||
## 15. Phased roadmap
|
||||
|
||||
Each phase ends with a demoable build and green CI on all targets. Phases 8–10 (colour/print pro, photographer/designer pro, frontier) and the per-feature phase assignments are in [`photoshop-parity.md`](photoshop-parity.md).
|
||||
Each phase ends with a demoable build and green CI on all targets. Phases 8–10 (colour/print pro, photographer/designer pro, frontier) and the per-feature phase assignments are in [`target-app-parity.md`](target-app-parity.md).
|
||||
|
||||
| Phase | Scope | Done when |
|
||||
|---|---|---|
|
||||
@@ -552,3 +581,10 @@ Each phase ends with a demoable build and green CI on all targets. Phases 8–10
|
||||
4. **PSD crate.** Build our own, or adopt or fork `ag-psd`/`psd`. Decide after the week-1 spike.
|
||||
5. **Default working depth and blending.** 8-bit + gamma-space blending matches Photoshop. 16-bit/float + linear is the modern default. The proposal is to follow Photoshop by default and make the other a per-document option.
|
||||
6. **Scope of Photoshop plugin compatibility.** Decided: no native `.8BF` hosting; a sandboxed WebAssembly plug-in API instead (see [`plugins.md`](plugins.md)).
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | minor | Current-state summary and deviations from the plan; status line; broken link to `photoshop-parity.md` repointed to `target-app-parity.md` |
|
||||
| 2026-09-30 | major | Design plan v1 |
|
||||
@@ -0,0 +1,113 @@
|
||||
# Brush and painting parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: brush engine, dynamics, pressure, smoothing, cursors, retouch tools and feel audited from source and open issues) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
Painting is where Photoshop users notice differences first, so it gets its own checklist: the
|
||||
brush engine (`crates/paint/src/brush.rs`), the Brush Settings UI
|
||||
(`crates/ui-egui/src/brush_sections.rs`), the live stroke renderer, pen input
|
||||
([`hardware-parity.md`](hardware-parity.md)), and the brush-based tools. Status words as in
|
||||
[`ui-parity.md`](ui-parity.md).
|
||||
|
||||
**Summary (estimated):** breadth ~90% (every Brush Settings section and option exists), ready for
|
||||
real work ~55%. The engine models what Photoshop models; the gaps are feel (latency, pressure
|
||||
response, edge quality, smoothing), a few missing options, and live previews for retouch tools.
|
||||
Remaining: 100–180 h (gap G4 in [`gaps.md`](gaps.md)). Human: feel must be checked on real
|
||||
tablets against Photoshop side by side.
|
||||
|
||||
## Brush Settings sections
|
||||
|
||||
| Section | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Brush Tip Shape: size, angle, roundness, hardness, spacing, flip X/Y | done | `brush.rs` |
|
||||
| Shape Dynamics (size/angle/roundness jitter, pen pressure/tilt/rotation/wheel controls, minimums, flip jitter, brush projection) | done | #174 |
|
||||
| Scattering (both axes, count, count jitter) | done | |
|
||||
| Texture (pattern, scale, brightness, contrast, mode, depth, each tip) | done | |
|
||||
| Dual Brush | done | |
|
||||
| Color Dynamics (FG/BG, hue/sat/brightness jitter, purity, per tip) | done | |
|
||||
| Transfer (opacity/flow/wetness/mix jitter and controls) | done | |
|
||||
| Brush Pose (tilt, rotation, pressure overrides) | done | |
|
||||
| Noise, Wet Edges, Build-up, Protect Texture | done | |
|
||||
| Smoothing: amount, Pulled String, Stroke Catch-up, Catch-up on End, Adjust for Zoom | done | `brush.rs:428-438` |
|
||||
| Section locks | done | #174 |
|
||||
| Brush tip from an image file | missing | TOOL-213-12 |
|
||||
| Erodible, Airbrush and Bristle tips (Photoshop's special tips) | partial | not audited in detail; "3D-based brushes don't work" (#1660) |
|
||||
| Anti-aliasing off for brushes | missing | #1666 (Pencil is the aliased path) |
|
||||
|
||||
## Pressure and pen
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Pressure drives size/opacity/flow per sample (no shared pressure within a frame) | done | #2112 |
|
||||
| Global pressure curve in Preferences | done | #2195 |
|
||||
| Per-control pressure curves | missing | TOOL-213-11 |
|
||||
| Quick taps keep their pressure | partial | #1967 fixed one case; tap paints a full blob (#1798), tap sensitivity (#1933) |
|
||||
| Smooth pressure on Windows | partial | "jumpy" (#2046) |
|
||||
| Tilt and rotation drive angle/roundness | partial | macOS, X11, web; not Windows; rotation not applied (#1301) |
|
||||
| Eraser end of the pen switches to Eraser | partial | macOS; flipped Wacom on Windows not (#2285) |
|
||||
|
||||
## Stroke quality and feel
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| No seams, hard edges stay hard, zero-scatter defaults, ABR tips never black | done | TOOL-213-13 |
|
||||
| Smooth line weight along a pressure ramp | partial | stair-steps (#1776) |
|
||||
| Interpolation and smoothing match Photoshop | partial | #2138, #2057 |
|
||||
| Soft-edge falloff matches Photoshop's curve | partial | #2149, #1619 |
|
||||
| Brush preview and cursor crisp, not pixelated | partial | #1433 |
|
||||
| Cursor outline equals the painted footprint at every zoom | partial | #1761, #2364 |
|
||||
| Latency: dab to screen within a frame | partial | budgets P13/P16/P33 over (scorecard); big-brush lag #2619, #1994; cursor lag #2566, #1343 |
|
||||
| No hitch at mouse-up on a long stroke | not measurable | P32 needs a frame harness |
|
||||
| Live stroke for Brush and Eraser | done | |
|
||||
| Live stroke for every brush-based retouch tool | missing | TOOL-213-7 |
|
||||
| No OS arrow cursor over the canvas with a pen | partial | TOOL-213-14 |
|
||||
|
||||
## Gestures and cursors
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| ⌃⌥-drag (macOS) / Alt+right-drag (Windows) resizes and changes hardness with a readout | done | TOOL-213-10 |
|
||||
| `[` `]` size, `⇧[` `⇧]` hardness, number keys opacity, ⇧+numbers flow | done | 2026-10-07 |
|
||||
| ⌥-click samples a colour with painting tools; Eyedropper comparison ring | done | TOOL-213-9 |
|
||||
| ⇧-click draws a straight line from the last point | done | |
|
||||
| Right-click opens the Brush Preset picker | done | [`context-menu-parity.md`](context-menu-parity.md); XP-Pen right-click not (#1980), macOS issue #2360 |
|
||||
| Precise / normal / full-size tip cursors, crosshair in the tip | partial | Caps Lock precise cursor not audited; round Pencil cursor requested (#2662, #1057) |
|
||||
| Brush choice kept per tool (Brush, Eraser, Blur each their own) | partial | #2542 |
|
||||
|
||||
## Symmetry
|
||||
|
||||
| Mode | Status |
|
||||
|---|---|
|
||||
| Vertical, Horizontal, Dual axis, Diagonal | done |
|
||||
| From a path (Make Symmetry Path) | done |
|
||||
| Wavy, Circle, Spiral, Parallel Lines, Radial, Mandala | missing (#2659) |
|
||||
|
||||
## Brush-based tools
|
||||
|
||||
| Tool | Status | Notes |
|
||||
|---|---|---|
|
||||
| Brush, Pencil (aliased, Auto Erase), Eraser (Brush/Pencil/Block) | done | Pencil 1 px quality #2139 |
|
||||
| Mixer Brush (Wet, Load, Mix, Flow, Sample All Layers) | partial | "incomplete" (#2247) |
|
||||
| Clone Stamp (opacity, flow, aligned, sample, overlay) | partial | Clone Source W/H link and Alt target cursor (TOOL-213-8) |
|
||||
| Pattern Stamp (aligned, impressionist) | done | |
|
||||
| History Brush | done | Art History Brush missing |
|
||||
| Spot Healing, Healing | partial | grain not matched on flat colour (#2104), "horrible in general" (#1092), stops responding after switching (#1751) |
|
||||
| Blur, Sharpen, Smudge (premultiplied, Sample All Layers, spacing) | done | BUG-207-2/3, #2171 |
|
||||
| Dodge, Burn, Sponge | done | |
|
||||
| Background Eraser, Magic Eraser | done | |
|
||||
| Color Replacement | missing as a tool | engine command exists |
|
||||
| Quick Selection (brush-driven) | done | |
|
||||
|
||||
## Presets
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| .abr import (v1/v2/v6) and export, persistent presets, folders | done | `psd/src/abr.rs` |
|
||||
| Brushes panel: drag a folder into a folder | missing | #2014 |
|
||||
| Tool presets (.tpl) | partial | Tool Presets panel exists; .tpl import not found |
|
||||
| Import 500 brushes without blocking the UI | not run | P24 |
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | major | First version, from a source audit and the open issues |
|
||||
@@ -1,5 +1,7 @@
|
||||
# Context-menu inventory and parity contract
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** trivial (status line added; the inventory is the 2026-10-06 branch-point snapshot, current status lives in context-menu-parity.md) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
This is the source-code inventory of PhotoCraft's right-click behavior at the branch point, captured 2026-10-06. It distinguishes a menu from another secondary-button gesture. The initial selection, Paths row, and document-tab menus added by this PR are called out separately. Photoshop comparison should be checked against an identified Photoshop version and platform before claiming exact parity; the current Layers menu explicitly targets Photoshop 2026 order.
|
||||
|
||||
## Canvas: every tool
|
||||
@@ -50,3 +52,10 @@ Canvas invariant: secondary click must not accidentally start a paint stroke, co
|
||||
3. Prioritize shared canvas menus, then high-value tool-specific interactions (path, selection, type, crop/zoom), then panel and tab gaps. Reuse Layers/Channels implementations where their command contract already exists. Preserve the existing Move/layer pick, brush picker, erase preference, Alt/Option brush resize, and toolbar flyout gestures.
|
||||
4. Test each descriptor's item order and enablement, dispatch with expected params, empty/invalid states, modifiers, and action result. Add UI gesture tests for right-click opening, target selection, Escape/outside dismissal, and the absence of accidental edits. Validate native and web builds.
|
||||
5. Capture screenshots from the running app for representative tool groups and panel states, with test fixture documents rather than personal photos. A screenshot proves visible menu composition; command tests prove its behavior.
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | trivial | Status line, revision history; marked as the branch-point snapshot |
|
||||
| 2026-10-06 | major | Source inventory of right-click behaviour |
|
||||
@@ -1,5 +1,7 @@
|
||||
# Context-menu parity contract
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** trivial (status line and revision history added; linked from ui-parity.md) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
Status: implementation contract, updated 2026-10-09. Scope: canvas, document tabs, and panels. “Right-click” means a secondary pointer click; macOS Control-click should also open the same menu where the platform sends a context-menu gesture. Photoshop changes a context menu with the active tool, selection, and panel item. Adobe documents that principle but does not publish a complete current menu catalog. **Documented** means an Adobe source explicitly names the gesture or action. **Inferred** means a PhotoCraft design target or an item known from a main menu whose presence in a Photoshop context menu still needs a current-product capture. Do not present inferred rows as exact Photoshop menus. [Adobe: panels and menus](https://helpx.adobe.com/photoshop/using/panels-menus.html), [Adobe: shortcuts and context menus](https://helpx.adobe.com/sa_en/photoshop/using/customizing-keyboard-shortcuts.html).
|
||||
|
||||
## Dispatch contract
|
||||
@@ -93,3 +95,11 @@ Photoshop's Generative Fill and Delete and Fill Selection rows are left out: Pho
|
||||
4. Long tail: shape/path, crop, metadata and specialist tools. Keep a per-tool fixture with no selection, active selection, masked/locked layer, and active operation where applicable.
|
||||
|
||||
Each slice needs pure model tests (including every item dispatching a known command), UI pointer tests for secondary click and modifier precedence, command/undo tests, a disabled-state test, and screenshots from PhotoCraft with the menu actually open. Compare labels, order, and state against dated Photoshop screenshots; a screenshot of a different tool or menu bar is insufficient evidence. Maintain a checklist beside each captured reference: Photoshop version/platform, target description, tool, selection/document state, modifiers, and exact items observed.
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | trivial | Status line, revision history |
|
||||
| 2026-10-09 | minor | Selection canvas reference and tool matrix updates |
|
||||
| 2026-10-07 | minor | Pen canvas reference capture |
|
||||
@@ -23,4 +23,4 @@
|
||||
4. **Respect the context:** active selection (feathered), layer vs mask target, locks, the colour model and depth.
|
||||
5. **Tests** in the module: behaviour, undo/redo, disabled states, bad params, several depths.
|
||||
6. **Dialog** (if it has parameters): filters and adjustments get schema-driven dialogs with live preview (`ui-egui/src/filter_dialog.rs`, `dialogs.rs`).
|
||||
7. Run `cargo xtask parity` and commit the updated `docs/parity.md`.
|
||||
7. Run `cargo xtask parity` and commit the updated `docs/parity-checklist.md`.
|
||||
+3
-3
@@ -41,7 +41,7 @@ cargo run --release -p photocraft -- --control 7878 --control-token-file .privat
|
||||
cargo test --workspace # everything
|
||||
cargo xtask ci # fmt + clippy + tests + layers + wasm
|
||||
cargo xtask stats # tests and lines per crate
|
||||
cargo xtask parity # Photoshop menu coverage -> docs/parity.md
|
||||
cargo xtask parity # Photoshop menu coverage -> docs/parity-checklist.md
|
||||
```
|
||||
|
||||
Image code is slow at `opt-level 0`, so the workspace profile builds dependencies at `opt-level 2`. Use `--release` for anything interactive.
|
||||
@@ -253,7 +253,7 @@ intents, black point compensation). It ships CC0 built-in profiles, including a
|
||||
## Menu parity
|
||||
|
||||
`cargo xtask parity` compares Photoshop's menu tree (`crates/ui-egui/src/menu_catalog.rs`) with
|
||||
the live command registry (`menus::is_live`) and rewrites [`docs/parity.md`](parity.md). The test
|
||||
the live command registry (`menus::is_live`) and rewrites [`docs/parity-checklist.md`](parity-checklist.md). The test
|
||||
`parity::tests::parity_does_not_regress` fails if the live count drops below `parity::FLOOR`.
|
||||
|
||||
`cargo xtask i18n-coverage` prints the UI translation coverage for each language in the
|
||||
@@ -315,7 +315,7 @@ cargo xtask perf --update-baseline # also write perf/baseline.json from this r
|
||||
class, commit, date and load average.
|
||||
- `crates/io/tests/corpus.rs`: the corpus floors (every `Source { .. }` constant).
|
||||
- The prefs audit: `Preferences` fields that no code reads (target 0, #204), plus counts taken
|
||||
from the tree (never-crash attribute coverage, `docs/parity.md`).
|
||||
from the tree (never-crash attribute coverage, `docs/parity-checklist.md`).
|
||||
|
||||
**Perf runs.** `xtask perf` builds the benches in release (`perf_scenarios`, `interactive_bench`,
|
||||
`fx_bench`, `bevel_bench`, `type_bench`, `large_image_bench`, and `layout_bench` once it exists), runs each with
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
# File-format parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: every Photoshop 2026 format from its bundle against our readers and writers; Affinity notes moved here from `roadmap.md`) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
Every format Photoshop 2026 (27.11.0) reads or writes, with PhotoCraft's support, fidelity and
|
||||
tests. Photoshop's list comes from its `Info.plist` `CFBundleDocumentTypes`, the PiPL read/write
|
||||
flags of `Contents/PlugIns/Required/File Formats`, and format names in the main binary (Open/Save
|
||||
As behaviour from Adobe's documentation where the bundle doesn't say). Ours comes from
|
||||
`crates/codecs/src/format.rs` (capability table), `crates/io/src/lib.rs` (import/export
|
||||
dispatch), `crates/psd`, `crates/raw`, `crates/heif`, `crates/affinity`. More detail on our side:
|
||||
[raster formats](../book/src/formats/raster-formats.md), [PSD/PSB](../book/src/formats/psd-psb.md),
|
||||
[OpenRaster](ora.md), [Paint.NET](pdn.md).
|
||||
|
||||
**Summary.** By count, 13 of Photoshop's 31 formats are fully supported in the directions Photoshop supports them, 4 partially (48%,
|
||||
measured). Weighted by use (PSD/PSB 40%, JPEG 15%, PNG 15%, TIFF 10%, camera raw 8%, WebP/AVIF/
|
||||
HEIF/JXL 6%, PDF 3%, everything else 3%), presence is ~80% and ready-for-real-work ~60%: PSD
|
||||
is broad but not yet reliable against Photoshop (gap G1), and Photoshop PDF, AVIF read and JPEG
|
||||
XL are missing (gap G10). Remaining: 300–500 h including PSD fidelity.
|
||||
|
||||
## Photoshop's formats
|
||||
|
||||
| Format | Photoshop | PhotoCraft read | PhotoCraft write | Fidelity and tests |
|
||||
|---|---|---|---|---|
|
||||
| PSD | R/W | yes | yes | 1/8/16/32-bit; Bitmap, Gray, Indexed, RGB, CMYK, Multichannel, Lab, Duotone; layers, groups, masks, vector masks, adjustment and fill layers, effects, text, shapes, smart objects (SoLd/lnk2), smart filters (14 mapped, rest verbatim), slices, comps, Advanced Blending. Oracle floors: Photoshop-authored 133/256, io 146/170, psd-tools 236/309; round trip ≥ 169/170, 308/309, 258/256. Known failures: #1281, #2469, #2465 (#2374, text layers, closed 2026-10-10) |
|
||||
| PSB | R/W | yes | yes | Auto-switches above 2 GB (REL-212-2); 4–5 GB fixtures generated (FILE-216-2); > 4 GB fails on Windows (#375) |
|
||||
| Cloud PSD (.psdc) | R/W | no | no | Out of scope (Adobe cloud) |
|
||||
| TIFF | R/W | yes | yes | 8/16/32f, Gray/RGB/CMYK, BigTIFF, every IFD, banded parallel decode; layered TIFF both byte orders (FILE-215-7: extra alpha channels not written) |
|
||||
| JPEG | R/W | yes | yes | 8-bit Gray/RGB/CMYK, ICC/EXIF/XMP; no JPEG Options dialog (quality 0–12, baseline/progressive) (FILE-215-19) |
|
||||
| PNG | R/W | yes | yes | 8/16-bit, ICC/text; APNG first frame only; alpha channels on open (#2225) |
|
||||
| GIF | R/W | yes | yes | First frame only |
|
||||
| BMP | R/W | yes | yes | 8-bit |
|
||||
| WebP | R/W | yes | yes | Lossless and our own lossy VP8 encoder; ICC/EXIF/XMP |
|
||||
| AVIF | R/W | no (#463) | optional feature, off by default | |
|
||||
| JPEG XL | R/W | inside DNG only | no | |
|
||||
| HEIF/HEIC | R/W(HEIF) | yes (pure-Rust heic-rs, `heif` feature, on in releases) | no | 8/16-bit |
|
||||
| OpenEXR | R/W | yes | yes | f16/f32; deep EXR and Cryptomatte readers (`corpus/exr`) |
|
||||
| Radiance HDR | R/W | yes | yes | f32 |
|
||||
| Portable Bit Map (PBM/PGM/PPM/PNM/PFM/PAM) | R/W | yes | yes | 8/16/32f |
|
||||
| Targa | R/W | yes | yes | 8-bit |
|
||||
| Photoshop PDF | R/W | no (#2541) | raster only (print, artboards to PDF) | No vector/text PDF, no multi-page save, no PDF presentation (FILE-215-10) |
|
||||
| Photoshop EPS, DCS 1.0/2.0, EPS TIFF/PICT preview | R/W | no | no | |
|
||||
| Generic EPS / AI | R (rasterize) | no | no | |
|
||||
| SVG | R (rasterize) | yes, as editable shape layers or a vector smart object | no | Better than Photoshop for editing; gradients approximated (FILE-215-9) |
|
||||
| JPEG 2000 | R/W | no (#1047) | no | |
|
||||
| Cineon / DPX | R (DPX), R/W (CIN) | no (#1049) | no | |
|
||||
| DICOM | R/W | no | no | |
|
||||
| PCX | R/W | no | no | |
|
||||
| Pixar | R/W | no | no | |
|
||||
| Amiga IFF | R/W | no | no | |
|
||||
| Wireless Bitmap | R/W | no | no | |
|
||||
| MPO / JPS (stereo) | R/W | no | no | |
|
||||
| PICT | R | no | no | Legacy |
|
||||
| Scitex CT | R/W | no | no | Legacy |
|
||||
| Photoshop Raw (.raw) | R/W | no | no | |
|
||||
| Camera raw (via Camera Raw 18.7) | R | partial | – | See below |
|
||||
|
||||
## Camera raw
|
||||
|
||||
Photoshop opens raws through Camera Raw 18.7 (the bundle registers cr2, crw, dcr, dng, erf, mos,
|
||||
fff, 3fr, mef, mfw, iiq, nrw, rwl, srw, mrw, nef, orf, pef, raf, srf, x3f; Camera Raw itself
|
||||
supports many more, including CR3).
|
||||
|
||||
| Camera format | PhotoCraft | Evidence |
|
||||
|---|---|---|
|
||||
| DNG (incl. LJPEG and JPEG XL tiles) | yes; lossy DNG no | FILE-215-11 |
|
||||
| Canon CR2 | yes | |
|
||||
| Canon CR3 | detected, unsupported | `crates/raw/src/lib.rs:219` |
|
||||
| Nikon NEF/NRW (lossless, lossy) | yes; "lossy after split" no | #50 |
|
||||
| Sony ARW/SR2/SRF (incl. compressed) | yes | |
|
||||
| Panasonic RW2, Pentax PEF | yes | |
|
||||
| Olympus ORF | uncompressed only | |
|
||||
| Fujifilm RAF (Bayer and X-Trans) | uncompressed only; no Fuji colour calibration | |
|
||||
| Others (CRW, 3FR, IIQ, X3F, SRW, MRW, ERF…) | embedded preview only | |
|
||||
| .xmp sidecars, highlight modes, raw preferences | missing | FILE-215-11 |
|
||||
| Camera Raw as a PSD smart filter | partial | 2026-10-07: WB, Light/Presence, curves, HSL, grading, detail, grain, vignette mapped (FILE-215-12) |
|
||||
|
||||
## Formats Photoshop doesn't have (ours only)
|
||||
|
||||
| Format | Read | Write | Notes |
|
||||
|---|---|---|---|
|
||||
| `.pcraft` (native) | yes | yes | Incremental, autosave, crash recovery, atomic save |
|
||||
| Affinity `.af`, `.afphoto`, `.afdesign`, `.afpub` | yes | no | See below |
|
||||
| Paint.NET `.pdn` | yes | no | [pdn.md](pdn.md) |
|
||||
| OpenRaster `.ora` | yes | yes | [ora.md](ora.md) |
|
||||
| ICO, QOI | yes | yes | |
|
||||
| Krita `.kra`, GIMP `.xcf`, Procreate | no | no | Not in Photoshop either |
|
||||
|
||||
### Affinity import notes (moved from `roadmap.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-10: current `.af` artboard properties (`phrp`/`aprp`) are recognized alongside the
|
||||
legacy flag, including converted curve boards. Synthetic two-board regressions check separate
|
||||
bounds, overflow clipping, `.pcraft`/PSD board and pixel round trips, and moving one board with its
|
||||
children through undo/redo. Nested boards remain masked groups; rotated/curved board outlines
|
||||
still import at their bounding rectangle.
|
||||
|
||||
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.
|
||||
|
||||
## Presets and data files
|
||||
|
||||
| Format | Photoshop | PhotoCraft | Notes |
|
||||
|---|---|---|---|
|
||||
| Brushes `.abr` | R/W | R/W | `psd/src/abr.rs` (v6/v12) |
|
||||
| Gradients `.grd` | R/W | R/W | |
|
||||
| Patterns `.pat` | R/W | R/W | |
|
||||
| Swatches `.aco`, `.ase` | R/W | R/W | FILE-215-14 |
|
||||
| LUTs `.cube` / `.3dl` / `.look` | R/W (Export Color Lookup) | R/W / R / R | `cms/src/lutfile.rs` |
|
||||
| Keyboard shortcuts `.kys` | R/W | R | `engine/src/kys.rs` |
|
||||
| ICC profiles | R | R | Own CMS |
|
||||
| Actions `.atn` | R/W | no | AUTO-219-2 |
|
||||
| Styles `.asl` | R/W | no | #1693 |
|
||||
| Contours `.shc`, custom shapes `.csh`, tool presets `.tpl` | R/W | no | FILE-215-15 |
|
||||
| Curves `.acv`, Levels `.alv`, other adjustment presets | R/W | not audited | |
|
||||
| C2PA Content Credentials | R/W | no | #1050 |
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | major | First version: Photoshop 2026 27.11.0's formats from its bundle, against our codecs; Affinity notes moved from `roadmap.md` |
|
||||
+215
@@ -0,0 +1,215 @@
|
||||
# Where PhotoCraft falls short of Photoshop
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: every known shortfall ranked, from the 2026-10-10 re-measure) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
Every known shortfall against Photoshop 2026 (27.11.0), one entry each, ranked by user impact
|
||||
on the way to beta. This is the work list agents pick from: take the highest-ranked entry that
|
||||
nobody is working on, and when you close part of one, update its evidence and estimate here and
|
||||
the matching parity doc. Numbers come from [`target-app-parity.md`](target-app-parity.md);
|
||||
checklist ids (`TOOL-…`, `FILE-…`, `UI-…`) are rows in [`scorecard.md`](scorecard.md); `#n` are
|
||||
GitHub issues.
|
||||
|
||||
No gap blocks alpha: the [alpha gate](roadmap.md#alpha-gate) passes. "Blocks beta" marks what
|
||||
stands between alpha and beta.
|
||||
|
||||
Hours are Opus 5.5 agent-hours, one agent working sequentially, including tests. **Human** marks
|
||||
what an agent can't finish alone.
|
||||
|
||||
## Summary
|
||||
|
||||
| # | Gap | Kind | Impact | Estimate | Parity doc |
|
||||
|---|---|---|---|---:|---|
|
||||
| G1 | PSD fidelity and Photoshop acceptance | file format | blocks beta | 150–250 h | [file-format-parity](file-format-parity.md) |
|
||||
| G2 | Interactive performance | performance | blocks beta | 200–350 h | [scorecard](scorecard.md#performance) |
|
||||
| G3 | User-reported bug backlog | stability, UI | blocks beta | 250–400 h | [target-app-parity](target-app-parity.md) |
|
||||
| G4 | Brush feel | UI / painting | high | 100–180 h | [brush-parity](brush-parity.md) |
|
||||
| G5 | Transform, handles and modifiers | UI | high | 60–110 h | [ui-parity](ui-parity.md) |
|
||||
| G6 | Missing tools (15) | features | high | 60–100 h | [ui-parity](ui-parity.md#tools) |
|
||||
| G7 | Workspaces shown as parameter dialogs | features | high | 80–140 h | [target-app-parity](target-app-parity.md#feature-areas) |
|
||||
| G8 | Type depth | features | high | 120–200 h | [target-app-parity](target-app-parity.md#feature-areas) |
|
||||
| G9 | Panels, preferences and workspace | UI | medium-high | 150–250 h | [ui-parity](ui-parity.md#panels-and-workspace) |
|
||||
| G10 | Missing and partial file formats | file format | medium | 120–220 h | [file-format-parity](file-format-parity.md) |
|
||||
| G11 | Actions and scripting | ecosystem | medium | 120–200 h | [target-app-parity](target-app-parity.md) |
|
||||
| G12 | Pen tablets and display hardware | hardware | medium | 80–150 h | [hardware-parity](hardware-parity.md) |
|
||||
| G13 | Languages: Hindi, Arabic, Vietnamese, RTL, engine messages | localization | medium | 80–140 h + human | [localization-parity](localization-parity.md) |
|
||||
| G14 | Camera Raw depth | features, formats | medium | 120–200 h | [file-format-parity](file-format-parity.md#camera-raw) |
|
||||
| G15 | AI and generative features | AI | medium (high for some users) | 300–600 h + human | [target-app-parity](target-app-parity.md) |
|
||||
| G16 | Plug-in compatibility (.8BF, UXP) | ecosystem | medium | 250–450 h + human | [target-app-parity](target-app-parity.md) |
|
||||
| G17 | Platforms and distribution | platforms | low-medium | 30–60 h + human | [scorecard](scorecard.md#distribution) |
|
||||
|
||||
## Feature gaps
|
||||
|
||||
### G1. PSD fidelity and Photoshop acceptance
|
||||
- **Missing:** PSDs we write are not always accepted by Photoshop, and Photoshop-authored files
|
||||
don't always render as Photoshop renders them.
|
||||
- **Evidence:** corpus floors (`crates/io/tests/corpus.rs`, scorecard): Photoshop-authored
|
||||
oracles 133/256 (52%), io corpus 146/170 (86%), psd-tools 236/309 (76%); round trips ~100%
|
||||
within the corpus. Smart-filter re-render matches 5/30. User reports: a PSD with text layers
|
||||
re-saved unmodified would not reopen (#2374, closed 2026-10-10), Photoshop 26.6 cannot reopen our files (#1281), "PSD not
|
||||
opening in Photoshop" (#2469), a CS2-era smart object unavailable (#2465), PSB smart object
|
||||
blank (#1764), perspective placed layers flattened (#579), PSB > 4 GB fails on Windows (#375).
|
||||
No test opens our exports in a third-party editor (FILE-216-4).
|
||||
- **Impact:** PSD is the format professionals exchange. Beta requires it to be reliable.
|
||||
- **Estimate:** 150–250 h. **Human:** opening exports in Photoshop on the owner's Mac (or a
|
||||
scripted check there) is the only real oracle.
|
||||
|
||||
### G6. Missing tools
|
||||
- **Missing (15 of 68):** Artboard, Single Row Marquee, Single Column Marquee, Perspective Crop,
|
||||
Frame, Color Sampler (#1046), Color Replacement (engine command exists), Art History Brush,
|
||||
Freeform Pen and Curvature Pen (#1054), Add Anchor Point, Delete Anchor Point, Convert Point
|
||||
(only as Pen + ⌥), Horizontal Type Mask, Vertical Type Mask.
|
||||
- **Evidence:** `Tool` enum (`crates/ui-egui/src/state.rs`) against the 67 `<tool>` entries of
|
||||
Photoshop's `Default Keyboard Shortcuts.kys` plus Remove, Triangle and Curvature Pen.
|
||||
- **Impact:** users look for them by name and shortcut; several are daily tools for designers.
|
||||
- **Estimate:** 60–100 h (2–9 h each, per the calibration).
|
||||
|
||||
### G7. Workspaces shown as parameter dialogs
|
||||
- **Missing:** Select and Mask workspace with view modes, Refine Edge brush and outputs
|
||||
(TOOL-214-1, Refine Hair #2671); Content-Aware Fill workspace with a paintable sampling area
|
||||
(TOOL-214-15); Vanishing Point plane editor (TOOL-214-14); Content-Aware Scale through the
|
||||
transform box (TOOL-214-7); Puppet Warp mesh following the outline (TOOL-214-6); Content-Aware
|
||||
Move's Transform On Drop (TOOL-213-4).
|
||||
- **Evidence:** scorecard rows above, all partial or missing.
|
||||
- **Impact:** these are the tools retouchers and compositors use daily; a slider dialog is not a
|
||||
substitute.
|
||||
- **Estimate:** 80–140 h.
|
||||
|
||||
### G8. Type depth
|
||||
- **Missing:** type on a path (TYPE-218-1), paragraph direction UI (TYPE-218-2), complex-script
|
||||
fallback fonts and golden tests (TYPE-218-3), variable-font axes (TYPE-218-4), OpenType panel
|
||||
UI (TYPE-218-5), manual and optical kerning with PSD round trip (TYPE-218-6, #206), live Warp
|
||||
Text preview (TYPE-218-7, #2689), triple/quadruple click (TYPE-218-8), "rasterize and continue"
|
||||
for distort/perspective on type (TYPE-218-9), text free transform (#2630).
|
||||
- **Evidence:** scorecard Type: 0 done, 3 partial, 6 missing. The Type tool froze the app for
|
||||
60 s on one macOS machine (#2518).
|
||||
- **Estimate:** 120–200 h.
|
||||
|
||||
### G11. Actions and scripting
|
||||
- **Missing:** document-independent action recording (AUTO-219-1), a full Actions panel with
|
||||
step toggles and .atn import (AUTO-219-2), replay tests (AUTO-219-4), Batch recursion and
|
||||
naming (AUTO-219-5), ExtendScript/UXP compatibility.
|
||||
- **Ahead of Photoshop:** CLI, MCP and the JSON control channel drive every command.
|
||||
- **Estimate:** 120–200 h. **Human:** whether to support a JavaScript scripting dialect at all
|
||||
(AGENTS.md forbids JS in the app).
|
||||
|
||||
### G14. Camera Raw depth
|
||||
- **Missing:** CR3 (detected, unsupported), compressed RAF, lossy DNG (FILE-215-11), .xmp
|
||||
sidecars, masking and calibration in the Camera Raw dialog, per-camera colour for non-DNG
|
||||
cameras, lens profiles.
|
||||
- **Evidence:** `crates/raw/src/lib.rs:219` (CR3), scorecard FILE-215-11/12, #50.
|
||||
- **Estimate:** 120–200 h.
|
||||
|
||||
### G15. AI and generative features
|
||||
- **Missing:** Generative Fill and Expand, Generative Upscale, Neural Filters, Sky Replacement,
|
||||
Super Zoom, ML Select Subject/Sky. There is no ML runtime (AUTO-219-7). Classical substitutes
|
||||
exist (GrabCut/max-flow selection, Remove tool by non-local patch completion).
|
||||
- **Evidence:** Photoshop's `Required/UXP` ships the Neural Filters gallery and its `.kys` has
|
||||
a Neural Filters taskspace; users ask for local models (#2313, #1996, #2682).
|
||||
- **Estimate:** 300–600 h. **Human:** owner decision #41 (model licences, local vs remote).
|
||||
|
||||
### G16. Plug-in compatibility
|
||||
- **Missing:** hosting Photoshop .8BF filters (#2647), UXP panels, CEP. PhotoCraft has its own
|
||||
sandboxed WebAssembly plug-in ABI v1 (`docs/plugins.md`), but ABI v2 (panels, progress, other
|
||||
layers) is missing (AUTO-219-6).
|
||||
- **Estimate:** 250–450 h. **Human:** .8BF needs native code under the isolated-`unsafe` rule.
|
||||
|
||||
## UI / UX gaps
|
||||
|
||||
### G3. User-reported bug backlog
|
||||
- **Missing:** fixes for 579 open issues (2026-10-10), filed mostly by 0.5/0.6 users. By title:
|
||||
~150 UI/panels/menus/shortcuts, 94 file/format, 87 layers, 54 painting, 54 selection,
|
||||
46 type, 41 performance, 34 transform/move, 25 Linux/Wayland, 24 Windows, 20 macOS.
|
||||
- **Impact:** each is a place where a Photoshop user hits something different from what they
|
||||
expect; together they are why ready-for-real-work is ~45% while breadth is ~76%.
|
||||
- **Estimate:** 250–400 h (many overlap with other gaps; count each fix once).
|
||||
|
||||
### G4. Brush feel
|
||||
- **Missing:** lag with big brushes (#2619, #1994) and under the cursor (#2566, #1343); jumpy
|
||||
pressure on Windows (#2046) and tap sensitivity (#1933); stair-stepped line weights (#1776),
|
||||
interpolation and smoothing problems (#2138), edge falloff (#2149), pixelated cursor vs
|
||||
Photoshop (#1433), brush rotation not driven by pen rotation (#1301); live preview only for
|
||||
Brush and Eraser (TOOL-213-7); no image file as a brush tip (TOOL-213-12); per-control pressure
|
||||
curves (TOOL-213-11); 4 of Photoshop's symmetry modes.
|
||||
- **Detail:** [`brush-parity.md`](brush-parity.md).
|
||||
- **Estimate:** 100–180 h. **Human:** checking feel on real tablets.
|
||||
|
||||
### G5. Transform, handles and modifiers
|
||||
- **Missing:** right-click menu during Free Transform (TOOL-214-5); commit/cancel buttons in the
|
||||
options bar (#2442); H/V skew fields and the full interpolation list; transform keeps layer
|
||||
order and blend mode in its preview (#2439); Hand tool interrupting a transform (#2302);
|
||||
blend mode/opacity edits during a transform (#1384); locked layers refused before the drag
|
||||
(#2585); ⌘-drag temporary Move without box or snapping (#2681), Auto-Select box follows the
|
||||
previous layer (#2666); ⌘-arrow layer nudge (#2474); path-point nudge; polygonal lasso Shift
|
||||
angles (#2352); autoscroll at the edge while selecting (#2231); hold-a-key spring-loaded tools
|
||||
(#2672); double-click Zoom tool to 100% (#2508); wheel and pinch behaviour (#2485, #2463,
|
||||
#1989); toolbar press-and-hold flyouts (#2301); tool-key memory in a group (#2608).
|
||||
- **Detail:** [`ui-parity.md`](ui-parity.md).
|
||||
- **Estimate:** 60–110 h.
|
||||
|
||||
### G9. Panels, preferences and workspace
|
||||
- **Missing:** 46 of 149 preferences do nothing (scorecard prefs audit); panel groups can't
|
||||
float or tear off into OS windows (UI-217-5, #1828, #1213, #2305); Color panel lacks wheel and
|
||||
slider modes (UI-217-17, #2569); UI scale presets (UI-217-9, #2492); more themes (UI-217-11,
|
||||
#2661); Stamp Visible (UI-217-22); layer clipboard
|
||||
(UI-217-23, #2670); tool-specific context menus beyond brushes, selections and Pen
|
||||
([context-menu-parity.md](context-menu-parity.md)); Libraries, Comments, Contextual Task Bar
|
||||
panels.
|
||||
- **Estimate:** 150–250 h.
|
||||
|
||||
### G2. Interactive performance
|
||||
- **Missing:** 22 of 25 budgeted scenarios are over budget (baseline 2026-10-05, a heavily
|
||||
loaded machine): layer move with styles 321 ms p50 against 25 ms, opacity change 276 ms
|
||||
against 20 ms, paste 12 MP 1.2 s against 100 ms, layer move on 15000×10000 16-bit 2.7 s,
|
||||
Content-Aware Scale 24 MP 954 s against 3 s, Select Subject 559 ms against 100 ms; the
|
||||
150-layer nudge crashes the GPU compositor (P12); a 50 MP PSB with feathered masks redraws in
|
||||
~10 s (#2377); menus slow with thousands of layers (#2460); old machines lag (#2687).
|
||||
- **Estimate:** 200–350 h. Serial in places (compositor architecture).
|
||||
|
||||
## File-format gaps
|
||||
|
||||
### G10. Missing and partial file formats
|
||||
- **Missing:** JPEG Options dialog (FILE-215-19), Photoshop PDF read and write and multi-page PDF
|
||||
(FILE-215-10, #2541), AVIF read (#463) and default-build AVIF write, JPEG XL, JPEG 2000 (#1047),
|
||||
DPX/Cineon (#1049), DICOM, EPS/DCS, PCX, Pixar, IFF, WBMP, MPO/JPS, PICT, Scitex CT, Photoshop
|
||||
Raw; layered TIFF extra alpha channels (FILE-215-7); spot plates (FILE-215-17); .atn, .asl,
|
||||
.shc, .csh presets (FILE-215-15); TGA/PNG alpha channels on open (#2225); C2PA (#1050).
|
||||
- **Detail:** [`file-format-parity.md`](file-format-parity.md).
|
||||
- **Estimate:** 120–220 h.
|
||||
|
||||
## Hardware gaps
|
||||
|
||||
### G12. Pen tablets and display hardware
|
||||
- **Missing:** tilt and rotation on Windows (pressure only, via WM_POINTER; no WinTab); native
|
||||
Wayland tablet-v2 (#79; the pen does not click on GNOME 50, #2622, KDE #2297); eraser end on
|
||||
flipped Wacom pens (#2285); HDR/EDR output (Photoshop has "Precise Color Management for HDR
|
||||
Display"); monitor profile detection off macOS and live profile changes; Touch Bar (macOS
|
||||
Intel only, low value); 3D mice.
|
||||
- **Detail:** [`hardware-parity.md`](hardware-parity.md).
|
||||
- **Estimate:** 80–150 h. **Human:** tablets and HDR displays to test on.
|
||||
|
||||
## Localization gaps
|
||||
|
||||
### G13. Hindi, Arabic, Vietnamese, RTL and engine messages
|
||||
- **Missing:** catalogs for Hindi, Arabic and Vietnamese (3 of the 12 key languages); right-to-
|
||||
left UI layout; Devanagari/Thai/Khmer fallback fonts; engine error and status messages in
|
||||
English in every language; browser-locale detection and CJK fonts on the web; Japanese IME on
|
||||
Windows (#590); installed Japanese fonts missing from the font list (#2330); Arabic layer names
|
||||
as tofu (#1408, #1693).
|
||||
- **Detail:** [`localization-parity.md`](localization-parity.md).
|
||||
- **Estimate:** 80–140 h. **Human:** native-speaker review of every catalog (none is recorded).
|
||||
|
||||
## Platform gaps
|
||||
|
||||
### G17. Platforms and distribution
|
||||
- **Missing:** Windows code signing (material not obtained), Windows ARM64 (DIST-220-2), in-app
|
||||
update check (DIST-220-1, #2650, #2375), in-app bug report (DIST-220-3), Flathub (#173),
|
||||
starting without a GPU adapter (#2519, #2412), Windows 7 (#2310, out of scope), Intel Macs with
|
||||
OpenCore (#1859).
|
||||
- **Estimate:** 30–60 h. **Human:** signing certificates.
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | minor | Checked against the alpha gate (no alpha blockers); #2374 marked closed |
|
||||
| 2026-10-10 | major | First version, from the full re-measure against Photoshop 2026 27.11.0 and the open issues |
|
||||
@@ -0,0 +1,64 @@
|
||||
# Hardware parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: GPU, pen tablets, displays, gestures per platform against Photoshop 2026) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
Each hardware feature Photoshop 2026 (27.11.0) uses, per platform, against PhotoCraft. Photoshop
|
||||
side: its bundle (Metal and OpenCL paths, "Precise Color Management for HDR Display" and EDR
|
||||
strings, Touch Bar resources, pen pressure/tilt strings) and Adobe's GPU FAQ. PhotoCraft side:
|
||||
`crates/tablet`, `crates/ui-egui/src/stylus.rs`, `apps/photocraft/src/gpu_startup.rs`,
|
||||
`engine/src/display_color.rs`, `apps/photocraft/src/monitor_profile.rs`.
|
||||
|
||||
**Summary (estimated):** ~50% ready. GPU compositing and colour-managed display are solid; pen
|
||||
input is uneven by platform (Windows lacks tilt/rotation, Wayland is broken) and there is no HDR
|
||||
output. Remaining: 80–150 h (gap G12). Human: tablets (Wacom, XP-Pen, Huion) on each OS and an
|
||||
HDR display to verify.
|
||||
|
||||
## GPU
|
||||
|
||||
| Feature | Photoshop | PhotoCraft | Status |
|
||||
|---|---|---|---|
|
||||
| GPU canvas, zoom/pan, rotate view | Metal (macOS), DirectX/OpenCL (Windows) | wgpu 30: Metal, Vulkan, DX12, GL; backend selectable | done |
|
||||
| GPU compositing of layers, blend modes, effects | partial (Photoshop composites mostly on CPU) | wgpu compositor, ≤ 1/255 vs CPU oracle; Multichannel and > texture-limit regions fall back to CPU | done (ahead in places) |
|
||||
| GPU filters (Blur Gallery, Liquify, Smart Sharpen, Camera Raw) | yes | CPU (rayon) for filters; GPU for compose and effects | partial |
|
||||
| Documents larger than the GPU texture limit | yes (tiled) | CPU fallback; tiling in progress (#49) | partial |
|
||||
| CPU-only fallback when no GPU | yes, reduced | `cpu` canvas preference; fails to start without an adapter on some Linux systems (#2519, #2412) | partial |
|
||||
| Old / integrated GPUs | yes | black line on Intel HD (#2426), OpenCore Macs fail (#1859), Rgba32Float panic (#2020) | partial |
|
||||
|
||||
## Pen tablets
|
||||
|
||||
| Feature | Photoshop | macOS | Windows | Linux X11 | Linux Wayland | Web |
|
||||
|---|---|---|---|---|---|---|
|
||||
| Pressure | yes | yes (AppKit monitor) | yes (WM_POINTER), jumpy (#2046) | yes (XInput2) | via Xwayland only; GNOME 50 pen doesn't click (#2622), KDE (#2297) | yes |
|
||||
| Tilt | yes | yes | **no** | yes | no | yes |
|
||||
| Barrel rotation | yes | yes (not applied to tip angle, #1301) | no | partial | no | yes (twist) |
|
||||
| Eraser end | yes | yes | no (#2285) | partial | no | partial |
|
||||
| WinTab driver mode | yes | – | no | – | – | – |
|
||||
| Pressure curve | Windows Ink / driver | global curve in Preferences (#2195) | same | same | same | same |
|
||||
|
||||
## Displays and colour
|
||||
|
||||
| Feature | Photoshop | PhotoCraft | Status |
|
||||
|---|---|---|---|
|
||||
| Colour-managed canvas (document → monitor profile) | yes | yes, folded into the GPU 3D LUT | done |
|
||||
| Monitor profile detection | per display, live | macOS per display at launch; others sRGB or a chosen .icc | partial |
|
||||
| HDR / EDR output for 32-bit and HDR images | yes ("Precise Color Management for HDR Display") | no; 8-bit sRGB-encoded canvas texture | missing |
|
||||
| High-DPI, physical 100% | yes | yes (#1943) | done |
|
||||
| Multiple monitors: documents in separate OS windows | yes | yes (`extra_windows`) | done |
|
||||
| Panels in separate OS windows | yes | in-app floating only (UI-217-5) | missing |
|
||||
|
||||
## Input devices
|
||||
|
||||
| Feature | Photoshop | PhotoCraft | Status |
|
||||
|---|---|---|---|
|
||||
| Trackpad pinch zoom, two-finger pan | yes | yes; pinch scrolls instead in 0.6.0 (#2463) | partial |
|
||||
| Trackpad rotate (Rotate View) | yes | yes (`rotate_view.rs`) | done |
|
||||
| Touch Bar | yes (Intel Macs) | no | missing (low value) |
|
||||
| Touch screens (Windows) | yes | basic pointer only | partial |
|
||||
| 3D mouse, MIDI, Surface Dial | Surface Dial on Windows | no | missing (low value) |
|
||||
| Scanners (WIA / TWAIN) | WIA menu (Windows) | menu item live; no driver integration | partial |
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | major | First version |
|
||||
@@ -0,0 +1,64 @@
|
||||
# Localization parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: per-language status measured from the catalogs, against Photoshop 2026's language packs) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
Per-language status of PhotoCraft's UI. How catalogs work and how to add one:
|
||||
[`localization.md`](localization.md). Language notes: [Korean](localization-ko.md),
|
||||
[Simplified Chinese](localization-zh-hans.md).
|
||||
|
||||
**How measured.** `cargo xtask i18n-coverage` (`xtask/src/i18n_coverage.rs`) defines the key
|
||||
universe: `tl!("…")` literals and `trn(` plurals in `ui-egui` (tests excluded), menu-catalog
|
||||
labels and path segments, `menus.rs` UI commands, and engine `CommandSpec` labels and menu paths:
|
||||
**1,608 English keys** on 2026-10-10. Each catalog (`crates/ui-egui/src/i18n/<code>.tsv`) was
|
||||
checked against that universe by a source script replicating the xtask (no build). Catalogs hold
|
||||
more rows than the universe because they also translate dynamic `tl!(expr)` strings (~159 call
|
||||
sites the tool can't enumerate). **Not covered anywhere:** engine error and status messages and
|
||||
filter parameter help, which are English in every language; so no language is `full`.
|
||||
|
||||
**Photoshop 2026** ships UI language packs for cs, da, de, en, es, fi, fr (and fr-CA), hu, it,
|
||||
ja, ko, nb, nl, pl, pt-BR, ru, sk, sv, tr, uk, zh-Hans, zh-Hant (24 `.lproj` markers; one pack is
|
||||
installed per Creative Cloud install, here `en_US`). It has no Hindi, Arabic, Indonesian or
|
||||
Vietnamese UI; Arabic and Hebrew users get English "Middle East" builds with the World-Ready
|
||||
composer, and its text engine handles RTL, Devanagari and Indic scripts.
|
||||
|
||||
**Summary.** 7 of the 12 key languages at 100% of measured keys (status `partial` because of the
|
||||
engine messages), 3 absent (Hindi, Arabic, Vietnamese), plus 8 other languages. Weighted by
|
||||
speakers, ~55% ready. Remaining: 80–140 h, plus native-speaker review (none recorded for any
|
||||
catalog).
|
||||
|
||||
## The twelve key languages
|
||||
|
||||
| Language | Code | UI strings (measured keys) | Catalog rows | Dialogs / tooltips / help | Script support | Native review | Status | To `full` |
|
||||
|---|---|---|---:|---|---|---|---|---:|
|
||||
| English | `en` | 1,608 / 1,608 (100%) | source | all | Latin | – | full | 0 h |
|
||||
| Simplified Chinese | `zh-hans` | 1,608 / 1,608 (100%) | 2,366 | dialogs, tooltips yes; engine messages English | CJK fonts (lazy loader), IME preedit/commit, vertical type | no | partial | 8–12 h |
|
||||
| Spanish | `es` | 1,608 / 1,608 (100%) | 2,413 | as above | Latin | no | partial | 6–10 h |
|
||||
| Hindi | `hi` | 0 (0%) | – | – | Devanagari shaping in the text engine (parley/HarfRust); no Devanagari fallback font (TYPE-218-3) | no | none | 20–30 h |
|
||||
| Arabic | `ar` | 0 (0%) | – | – | Arabic shaping and bidi in the text engine, Arabic fallback font; no RTL UI layout (DIST-220-4), paragraph direction has no UI (TYPE-218-2), layer names as tofu (#1408, #1693) | no | none | 40–60 h |
|
||||
| French | `fr` | 1,608 / 1,608 (100%) | 2,766 | as above | Latin | no | partial | 6–10 h |
|
||||
| Portuguese (Brazil) | `pt-br` | 1,608 / 1,608 (100%) | 2,788 | as above | Latin; every `pt` locale uses it | no | partial | 6–10 h |
|
||||
| Indonesian | `id` | 1,608 / 1,608 (100%) | 2,764 | as above | Latin | no | partial | 6–10 h |
|
||||
| Japanese | `ja` | 1,608 / 1,608 (100%) | 3,356 | as above | CJK fonts, IME (Windows IME broken, #590), vertical type (tategaki); installed Japanese fonts missing from the list (#2330) | no | partial | 10–16 h |
|
||||
| German | `de` | 1,608 / 1,608 (100%) | 2,400 | as above | Latin | no | partial | 6–10 h |
|
||||
| Korean | `ko` | 1,608 / 1,608 (100%) | 2,936 | as above; terminology from Photoshop's Korean UI ([notes](localization-ko.md)) | Hangul fonts, IME | no | partial | 6–10 h |
|
||||
| Vietnamese | `vi` | 0 (0%) | – | – | Latin with stacked diacritics (shaping supported) | no | none | 12–18 h |
|
||||
|
||||
## Other shipped languages
|
||||
|
||||
8 more, each at 1,608 / 1,608 measured keys, status `partial` for the same reason: Traditional
|
||||
Chinese `zh-hant` (2,329 rows), Russian `ru` (2,544), Ukrainian `uk` (3,375), Czech `cs` (2,337),
|
||||
Polish `pl` (3,366), Greek `el` (3,481), Dutch `nl` (3,568), Italian `it` (2,411).
|
||||
|
||||
## Cross-language gaps
|
||||
|
||||
- Engine error, status and parameter-help messages are English in every language.
|
||||
- No right-to-left UI layout (needed for Arabic, Hebrew, Persian, Urdu).
|
||||
- Web build: no browser-locale detection, no CJK web fonts.
|
||||
- WebAssembly plug-ins disappear from Filter › Plug-ins when the UI isn't English (#2540).
|
||||
- A user couldn't find the language option (#2532): it is in Preferences › Interface.
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | major | First version, measured from the catalogs with the `i18n-coverage` rules |
|
||||
File renamed without changes.
@@ -1,92 +0,0 @@
|
||||
# Feature-parity estimate and remaining effort
|
||||
|
||||
How close PhotoCraft is to Adobe Photoshop 2026, and how much Opus 5.5 work remains. Generated by
|
||||
assessment, not a tool; revisit when a major arc lands. Menu coverage is from `cargo xtask parity`;
|
||||
fidelity is from the PSD oracle (`cargo xtask corpus` / `oracle_diff`).
|
||||
|
||||
## Headline
|
||||
|
||||
> **Update 2026-10-03:** menu/command breadth reached **100% (625/625)** — every Photoshop
|
||||
> menu item now dispatches a live command (incl. Variables/Data Sets, Trap, the Timeline panel and
|
||||
> Layer › Video Layers). Remaining parity work is depth and fidelity, not breadth: PSD oracle
|
||||
> (~66%), Camera Raw/video-layer depth, and the AI/Neural tier. See the table below.
|
||||
|
||||
|
||||
- **Menu / command breadth:** 625 / 625 Photoshop menu items live = **100%** (every menu item has a live command).
|
||||
- **PSD rendering fidelity (oracle):** ~111 / 170 corpus files pixel-match = **~65%**.
|
||||
- **Overall functional parity (weighted, mainstream workflows):** **~86%** (menu breadth complete; depth + fidelity are the remaining gap).
|
||||
- **Overall including Adobe's AI / Firefly features:** **~75%** (these are mostly cloud/ML and the
|
||||
hardest to reach clean-room).
|
||||
|
||||
Menu coverage (96%) overstates true parity because many live commands are faithful-but-approximate
|
||||
(Camera Raw without masking/calibration, Vanishing Point without its UI, heuristic Select Subject/Sky
|
||||
vs Adobe's ML, Content-Aware Fill basic). The weighted figure accounts for depth and fidelity, not
|
||||
just presence.
|
||||
|
||||
## Where we stand, by area
|
||||
|
||||
| Area | Parity | Notes |
|
||||
|---|---:|---|
|
||||
| Layers, masks, groups, blend modes, smart objects, layer styles | ~92% | Broad + GPU-accelerated; bevel/satin shapes and a few blend edge cases remain |
|
||||
| Selections, paths, vector shapes, pen | ~90% | Select menu 100% of items; Select Subject/Sky are heuristic, not ML |
|
||||
| Paint / brush engine, retouch (clone, healing) | ~85% | Solid; no Mixer Brush depth, no Content-Aware healing |
|
||||
| Adjustments + adjustment layers | ~90% | All kinds present; Camera Raw depth and a few toe-curve models approximate |
|
||||
| Filters (incl. Filter Gallery ×47, Liquify, blurs, render) | ~88% | Gallery looks are approximations; no Neural Filters |
|
||||
| Type / text engine, character & paragraph styles, glyphs | ~90% | Vertical type laid out and rendered (#199; no mojikumi or upright-Roman option yet); OpenType alternates thin |
|
||||
| Color management (ICC v2/v4, intents, soft-proof) | ~90% | Own pure-Rust CMS; no Adobe CMYK profiles (synthetic) |
|
||||
| File I/O: PSD, native .pcraft, flats (png/jpg/tiff/webp/exr/…) | ~85% | PSD oracle ~65% pixel-exact; most structure round-trips |
|
||||
| Transform, warp, puppet, perspective, liquify | ~88% | No Face-Aware Liquify (needs a landmark model) |
|
||||
| Automation: CLI, MCP, headless server, control channel | ~95% | Ahead of Photoshop here (see below) |
|
||||
| Image modes (RGB/Gray/CMYK/Lab/Indexed/Duotone/Multichannel) | ~85% | Multichannel display-only; no ink-plate model |
|
||||
| Print / export / Save for Web / slices / Generator | ~85% | No Separations/bleed; droplets basic |
|
||||
| Computational photo (Photomerge, HDR, Lens, Camera Raw, Wide Angle) | ~70% | Classical implementations; generic lens profiles only |
|
||||
| Data-driven graphics (Variables, Data Sets) | ~0% | Not started (5 menu items) |
|
||||
| Video / Timeline / animation | ~0% | Not started (13 menu items) — a whole subsystem |
|
||||
| AI / Neural / Generative (Firefly, Sensei, Neural Filters) | ~5% | Mostly absent; needs licensed/trained models |
|
||||
| Prepress niche (Trap, measurement scale pro) | ~30% | Trap, ink spread not modelled |
|
||||
|
||||
## The remaining 25 menu items, grouped
|
||||
|
||||
- **Video & Timeline (13):** Video Layers (new/insert/duplicate/delete/replace/interpret/restore/
|
||||
reload/rasterize), Rasterize › Video, Timeline panel, Render Video, Import Video Frames to Layers.
|
||||
One cohesive subsystem: a frame/time model, a video decoder/encoder (clean-room Rust, no ffmpeg),
|
||||
onion-skinning, and a timeline UI.
|
||||
- **Data-driven graphics (5):** Variables › Define / Data Sets, Apply Data Set, Export Data Sets as
|
||||
Files, Import Variable Data Sets. A template-binding model over layers + a CSV/data-set engine.
|
||||
- **Niche / platform (7):** Trap (prepress ink spread), Frame from Layers, Migrate Presets, WIA
|
||||
Support (Windows scanners), and two already-adjacent items.
|
||||
|
||||
## Effort to parity (Opus 5.5)
|
||||
|
||||
Two clocks: **agent-hours** (total model work) and **wall-clock** (with this session's observed
|
||||
~6–8× parallelism across independent arcs). This session landed ~70 menu items + major subsystems
|
||||
in a handful of wall-clock hours using 8 parallel agents, so wall-clock ≈ agent-hours ÷ 6.
|
||||
|
||||
| Milestone | Scope | Agent-hours | Wall-clock |
|
||||
|---|---|---:|---:|
|
||||
| **To 90% functional** | remaining non-AI/non-video menu items (Variables, Trap, Frame, Migrate, WIA), Camera Raw depth, Vanishing Point UI, selection quality, polish | 60–90 | 10–15 h |
|
||||
| **To 95% functional** | the above + PSD oracle 65% → ~90% (bevel/satin shapes, Lab blending, noise-gradient RNG, toe curves), broad UI-parity pass, perf pass | +80–130 | +15–22 h |
|
||||
| **Video / Timeline subsystem** | frame model, clean-room decode/encode, timeline, animation, Render Video | 50–80 | 10–14 h |
|
||||
| **Credible AI tier** | ML Select Subject/Sky, Content-Aware Fill (PatchMatch++), basic generative fill/expand — needs model integration; some features may be infeasible fully clean-room without licensed models | 120–250+ | 25–45 h |
|
||||
|
||||
**Totals:**
|
||||
- To **~95% functional parity** (everything except video and AI): **~140–220 agent-hours ≈ 25–40
|
||||
wall-clock hours** of Opus 5.5 with parallel agents.
|
||||
- To **~98%** incl. the video subsystem: **+50–80 agent-hours ≈ +10–14 wall-clock hours**.
|
||||
- To **~99%** incl. a credible AI tier: **+120–250 agent-hours ≈ +25–45 wall-clock hours**, with the
|
||||
caveat that pixel-for-pixel Firefly/Sensei parity is not achievable clean-room without trained
|
||||
models; we target functional equivalents.
|
||||
|
||||
**Best single number:** PhotoCraft is **~82% of the way** to full Photoshop parity, and reaching a
|
||||
**95%, ships-for-most-users** state is roughly **25–40 wall-clock hours** of parallel Opus 5.5 work.
|
||||
Closing the last 5% (video + AI) is the long, uncertain tail.
|
||||
|
||||
## Assumptions & caveats
|
||||
|
||||
- "Parity" = functional + visual equivalence of what a user can do, not byte-identical output. Clean-
|
||||
room means no Adobe code, profiles, shaders, or trained models; AI features target equivalents.
|
||||
- Wall-clock assumes 6–8 independent arcs in parallel with their own target dirs, as this session ran.
|
||||
Serial work is ~6× longer.
|
||||
- Adobe removed 3D/Substance from Photoshop, so 3D is intentionally out of scope.
|
||||
- Fidelity hours are the least certain: the remaining oracle failures are proprietary RNGs and
|
||||
unpublished curve models fitted by observation.
|
||||
+69
-237
@@ -1,14 +1,41 @@
|
||||
# Roadmap
|
||||
|
||||
Status legend: ✅ done · 🟡 in progress · ⬜ not started. Updated 2026-10-08.
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** minor (alpha gate added; earlier the same day: major, honest assessment moved to `target-app-parity.md`; milestones re-dated; new Current focus and What's next with estimates) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
**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.
|
||||
Forward-looking plan: milestones, the **Current focus** list, and what's next with estimates.
|
||||
Where we stand today is in [`target-app-parity.md`](target-app-parity.md) (two numbers, by
|
||||
dimension and area) and the ranked work list in [`gaps.md`](gaps.md); the one-page summary is
|
||||
[`ROADMAP.md`](../ROADMAP.md). Measured numbers: [`scorecard.md`](scorecard.md)
|
||||
(`cargo xtask scorecard`: performance budgets, corpus floors, per-area checklists, dead
|
||||
preferences) and [`parity-checklist.md`](parity-checklist.md) (`cargo xtask parity`: menu wiring,
|
||||
628/628, which says nothing about behaviour).
|
||||
|
||||
Status legend: ✅ done · 🟡 in progress · ⬜ not started. Hours are Opus 5.5 agent wall-clock hours
|
||||
for one agent working sequentially (calibration in
|
||||
[`target-app-parity.md`](target-app-parity.md#remaining-effort-and-calibration)).
|
||||
|
||||
**Stage: alpha** (ready for real work ~45%). Beta needs ~75% and reliable PSD: ~1,100–1,800 h.
|
||||
|
||||
## Alpha gate
|
||||
|
||||
The core workflows a typical Photoshop professional runs every day, checked end to end on the main
|
||||
platform (macOS, 0.6.0), including saving and reopening the work. Any **no**, or a **partial**
|
||||
that blocks the workflow, would make PhotoCraft pre-alpha.
|
||||
|
||||
| Core workflow | Works end to end? | Evidence | Hours to pass |
|
||||
|---|---|---|---:|
|
||||
| Photo retouch: open JPEG/raw, heal/clone/remove, adjustment layers, export JPEG, save and reopen | yes | Spot Healing, Healing, Clone, Patch, Remove tools; 16 adjustment layers; raw for DNG/CR2/NEF/ARW/RAF; JPEG export; MCP workflow tests (`automation/tests/agent_tasks.rs`). Quality complaints (#1092, #2104) and no CR3 don't stop the workflow | 0 |
|
||||
| Composite: layers, masks, selections, blend modes, smart objects; save as PSD and `.pcraft` and reopen | yes | PSD round trip ≥ 169/170, 308/309, 258/256 corpus files; `.pcraft` atomic save and crash recovery. Multi-layer Smart Object conversion (#2604) and mask targeting (#2458) are partial but have workarounds | 0 |
|
||||
| Cut-out: select a subject, refine the edge, mask, export PNG with transparency | partial (not blocking) | Object/Quick Selection, Select Subject (classical), Refine Edge dialog, layer masks, PNG export. Select and Mask is a dialog, not the workspace; no Refine Hair (#2671) | 0 (depth: 80–140 h, G7) |
|
||||
| Design: type, shapes, layer styles, artboards; export PNG/JPEG; save and reopen | partial (not blocking) | Point/paragraph type, shapes with stroke controls, all 10 layer effects, artboards, Export As. One macOS report of a 60 s freeze on choosing the Type tool (#2518, not reproduced); no type on a path | 0 (fix #2518: 2–6 h) |
|
||||
| Paint with a pen tablet: pressure brushes, layers, save and reopen | partial (not blocking) | Pressure, tilt, rotation on macOS (AppKit monitor); every Brush Settings section. Lag with big brushes (#2619) and feel gaps ([brush-parity.md](brush-parity.md)) | 0 (feel: 100–180 h, G4) |
|
||||
| Exchange PSDs with Photoshop users: open a client PSD, edit, send a PSD back | partial (not blocking for alpha; blocking for beta) | Photoshop-authored oracle 133/256 render as Photoshop does; most exports open in Photoshop (smart objects verified), but some don't (#1281, #2469) | 0 for alpha; 150–250 h for beta (G1) |
|
||||
|
||||
**Result: passes.** Every core workflow completes end to end and the work saves and reopens in
|
||||
PhotoCraft; the partial rows are depth and fidelity gaps with workarounds, not blockers. Ready for
|
||||
real work is ~45%, inside the alpha band (~40–75%), but close to its floor.
|
||||
|
||||
## Milestones
|
||||
|
||||
| M | Status | Where we are |
|
||||
|---|---|---|
|
||||
@@ -16,248 +43,44 @@ readiness; treat it as an upper bound.
|
||||
| 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 |
|
||||
| M4 Native format + engine | ✅ | ~700 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 |
|
||||
| M8 PSD v2 | 🟡 | adjustments (incl. Selective Color, Color Lookup), fills, effects, patterns, text, shapes, smart objects, alpha channels; oracle floors 146/170 (io), 236/309 (psd-tools), 133/256 (Photoshop-authored) |
|
||||
| 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).
|
||||
Releases: 0.1.0 (2026-10-02), 0.2.0 (2026-10-05, first signed and notarized), 0.3.0 (10-07),
|
||||
0.5.0 (10-08), 0.6.0 (10-10).
|
||||
|
||||
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.
|
||||
## Current focus
|
||||
|
||||
2026-10-10: current `.af` artboard properties (`phrp`/`aprp`) are recognized alongside the
|
||||
legacy flag, including converted curve boards. Synthetic two-board regressions check separate
|
||||
bounds, overflow clipping, `.pcraft`/PSD board and pixel round trips, and moving one board with its
|
||||
children through undo/redo. Nested boards remain masked groups; rotated/curved board outlines
|
||||
still import at their bounding rectangle.
|
||||
Ranked; each item links to its gap entry. Pick from the top unless an issue is assigned to you.
|
||||
|
||||
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.
|
||||
1. **PSD that Photoshop trusts** ([G1](gaps.md#g1-psd-fidelity-and-photoshop-acceptance)):
|
||||
fix Photoshop refusing our files (#1281, #2469; text-layer case #2374 closed); add a
|
||||
Photoshop re-open check (FILE-216-4); Photoshop-oracle floor 133/256 → 200+. 150–250 h.
|
||||
2. **Performance budgets** ([G2](gaps.md#g2-interactive-performance)): the 22 over-budget
|
||||
scenarios, the P12 GPU crash at 150 layers, brush and cursor lag (#2619, #2566). 200–350 h.
|
||||
3. **User bug backlog** ([G3](gaps.md#g3-user-reported-bug-backlog)): 579 open issues, most from
|
||||
0.5/0.6 users; triage weekly, fix regressions first. 250–400 h.
|
||||
4. **Brush and transform feel** ([G4](gaps.md#g4-brush-feel), [G5](gaps.md#g5-transform-handles-and-modifiers)):
|
||||
[`brush-parity.md`](brush-parity.md) and [`ui-parity.md`](ui-parity.md) rows marked partial
|
||||
or missing. 150–250 h.
|
||||
5. **Missing tools** ([G6](gaps.md#g6-missing-tools)): 15 of Photoshop's 68. 60–100 h.
|
||||
|
||||
## Honest parity assessment (2026-10-05)
|
||||
## What's next, with estimates
|
||||
|
||||
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: Iris Blur pin preparation, saturated-distance evaluation and trailing
|
||||
Gaussian-level halo trimming measure 1.18–1.76× faster across eight local 24 MP
|
||||
RGB U8/U16/F32 cases (Ryzen 7 9700X, Windows, eight workers). Default blur 15:
|
||||
626.8 → 426.9 ms; two pins: 1789.9 → 1016.2 ms. The default 1500×1000 filtered
|
||||
proxy for 24 MP, document blur 15/80: 28.7/51.8 → 24.9/42.6 ms. At 36 MP,
|
||||
two pins: 2595.8 → 1822.8 ms; small/medium U8 gains are inconclusive.
|
||||
Differential tests preserve exact finite pixel bits.
|
||||
These are computation timings, not GUI frame latency or new Photoshop parity;
|
||||
see [measurements, upstream SIMD findings and limits](iris-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).
|
||||
|
||||
2026-10-10: Quick Selection object strokes through raster surfaces measured
|
||||
3.46-3.70x faster at 8-bit, 16-bit and 32f on 24-36 MP documents (AWS
|
||||
c7i.4xlarge, five paired release runs), with identical region bounds and mask bytes.
|
||||
Hybrid FIFO push/relabel and sparse edge enumeration preserve the fitted energy.
|
||||
See [stroke measurements and reproduction](quick-selection-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: Native CMYK solid and gradient fills share depth-quantized samples between
|
||||
rendering and PSD export. The uncached 16-bit CMYK gradient now round-trips with zero
|
||||
rendered error; psd-tools round trips rise from 307 to 308. Mixed and Photoshop round
|
||||
trips remain 169 and 258; rendering oracle counts remain 146, 237 and 133.
|
||||
Exact 8-bit CMYK row reuse reduces 1 MP conversion-read time by 77% for smooth ramps,
|
||||
33% with dithering and 10% for random colours (M4 Max, release optimization level 3).
|
||||
|
||||
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). |
|
||||
| OpenRaster read/write | 2026-10-09: 34 Krita 5.2.9-authored `.ora` files (27 blend modes, groups, pass-through, offsets, opacity, visibility, masks, 16-bit, gray) render within 3/255 of Krita's merged image (30) or differ for known reasons (4: Krita's lighter/darker-colour tie-break, Hard Mix at exactly 1, a linear-light 16-bit document); Krita re-opens our exports and renders them identically to its originals (33/34; Soft Light is written as `svg:soft-light`) | medium (one authoring app) | MyPaint and GIMP files untested. Masks are applied to pixels and layer styles dropped on save (reported). See [OpenRaster](ora.md). |
|
||||
| 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).
|
||||
|
||||
2026-10-10: Pixelate's Facet shares exact 3x3 quadrant statistics and Color Halftone
|
||||
shares dot radii within each rotated screen grid. Full tiled CPU application at 24 MP
|
||||
on a 16-vCPU m7i.4xlarge improves Facet from 0.684 s to 0.312 s in RGB8
|
||||
(2.20x), and from 7.888 s to 0.574 s in CMYK8 (13.74x).
|
||||
Color Halftone improves from 1.137 s to 0.604 s in RGB8 (1.88x)
|
||||
and from 3.589 s to 0.718 s in Lab8 (5.00x).
|
||||
Three alternating paired release runs also cover 36 MP RGB, 16/32-bit storage,
|
||||
and screen radii 2/8/64. All 36 complete output comparisons match exactly.
|
||||
See [method, raw timings and checks](pixelate-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.
|
||||
| Next milestone | Scope | Estimate |
|
||||
|---|---|---:|
|
||||
| 0.7 "files you can trust" | Current focus 1 plus JPEG Options, AVIF read, Photoshop PDF read | 200–320 h |
|
||||
| 0.8 "fast enough" | Current focus 2; GPU tiling past the texture limit (#49); complex layout documents | 200–350 h |
|
||||
| 0.9 "feels like Photoshop" | Current focus 4 and 5; transform context menu; floating panels; Color panel | 300–500 h |
|
||||
| Beta | All of the above, type depth, Select and Mask / Content-Aware Fill workspaces, Hindi/Arabic/Vietnamese + RTL, bug backlog under 100 | 1,100–1,800 h total |
|
||||
| Later, needs owner decisions | AI backend (#41), plug-in hosting (.8BF / UXP), scripting compatibility | 550–1,050 h |
|
||||
|
||||
## Milestone definitions
|
||||
|
||||
@@ -278,3 +101,12 @@ Each milestone has a **definition of done (DoD)** and must leave `main` green on
|
||||
| **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 |
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | minor | Alpha gate table (core-workflow gate from the progress-docs standard): passes, stage stays alpha |
|
||||
| 2026-10-10 | major | Progress-docs standard: honest assessment and dated measurements moved to `target-app-parity.md`, Affinity notes to `file-format-parity.md`; new Current focus and estimates; `parity.md` renamed `parity-checklist.md` |
|
||||
| 2026-10-08 | minor | Tools, Affinity import and performance measurements added |
|
||||
| 2026-10-05 | major | Honest parity assessment added |
|
||||
+2
-2
@@ -221,11 +221,11 @@ Unread: `general.color_picker`, `general.beep_when_done`, `general.resize_image_
|
||||
|
||||
## Automation
|
||||
|
||||
Menu wiring (`docs/parity.md`): 628 of 628 menu items live (100.0%). This counts dispatch, not behaviour.
|
||||
Menu wiring (`docs/parity-checklist.md`): 628 of 628 menu items live (100.0%). This counts dispatch, not behaviour.
|
||||
|
||||
| Id | Target | Status | Issue | Note |
|
||||
|---|---|---|---|---|
|
||||
| AUTO-1 | Every menu item dispatches a command id (UI, CLI, control channel and MCP share them) | done | | docs/parity.md: all menu items live; menus.rs is_live |
|
||||
| AUTO-1 | Every menu item dispatches a command id (UI, CLI, control channel and MCP share them) | done | | docs/parity-checklist.md: all menu items live; menus.rs is_live |
|
||||
| AUTO-219-1 | Record actions in a document-independent form (implicit layer, merged type keystrokes) | missing | [#219](https://github.com/storytold/photocraft/issues/219) | actions.rs:47 copies raw journal entries with explicit layer ids |
|
||||
| AUTO-219-2 | Actions panel: step and dialog toggles, reorder, delete a step, Stop, sets, .atn import | missing | [#219](https://github.com/storytold/photocraft/issues/219) | Panel deletes whole actions only (actions.rs:146) |
|
||||
| AUTO-219-3 | actions.record/stop/play/list commands for agents and the CLI | done | [#219](https://github.com/storytold/photocraft/issues/219) | actions.list/get/record/stop/play/delete in actions_cmds.rs; the panel, CLI and MCP share them. Nested steps pass the session authorize hook. |
|
||||
|
||||
@@ -0,0 +1,535 @@
|
||||
# PhotoCraft vs Adobe Photoshop: target-app parity
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (full re-measure against Photoshop 2026 27.11.0; merged `parity-estimate.md` and the roadmap's honest assessment into this file) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
The authoritative answer to "how close is PhotoCraft to Photoshop, and how much work is left". The
|
||||
one-page summary is [`ROADMAP.md`](../ROADMAP.md); the ranked work list is [`gaps.md`](gaps.md);
|
||||
the measured checklists are [`scorecard.md`](scorecard.md) (`cargo xtask scorecard`) and
|
||||
[`parity-checklist.md`](parity-checklist.md) (`cargo xtask parity`). Detail by dimension:
|
||||
[UI](ui-parity.md), [brushes and painting](brush-parity.md), [context menus](context-menu-parity.md),
|
||||
[file formats](file-format-parity.md), [hardware](hardware-parity.md),
|
||||
[localization](localization-parity.md).
|
||||
|
||||
## Headline (2026-10-10, PhotoCraft 0.6.0, `main` at 3e000bc1)
|
||||
|
||||
| Number | Value | Kind |
|
||||
|---|---|---|
|
||||
| **Feature breadth** (does each Photoshop feature exist?) | **~76%** | partly measured (menus, tools, panels, formats), weights below |
|
||||
| **Ready for real work** (could a professional replace Photoshop with it?) | **~45%** (range 40–50%) | estimated, weights and evidence below |
|
||||
| **Mainstream practitioner** (typical pro, weekly areas only) | **~43%** (38–48%) | estimated, [method](#mainstream-practitioner-43) |
|
||||
| **Essentials user** (core features only) | **~61%** (55–67%) | estimated, [method](#essentials-user-61) |
|
||||
| **Stage** | **alpha** | ready-for-real-work is inside the ~40–75% band and the [alpha gate](roadmap.md#alpha-gate) passes (six core workflows end to end); PSD exchange with Photoshop is not yet reliable enough for beta |
|
||||
| Remaining to **beta** (~75% ready, PSD reliable) | **~1,100–1,800 Opus 5.5 agent-hours** | estimated, calibrated below |
|
||||
| Remaining to **full parity** (~95–100%) | **~2,300–4,100 Opus 5.5 agent-hours** | estimated; includes AI and ecosystem, which need owner decisions |
|
||||
|
||||
These numbers replace the 2026-10-03 estimate (82% "of the way", 140–220 agent-hours to 95%,
|
||||
kept below for the record). That estimate counted feature surface and was far too optimistic:
|
||||
about 1,230 issues have been filed since the first release (579 open on 2026-10-10), most of them
|
||||
against features already counted as present. The 2026-10-05 honest assessment (feature surface 60–70%,
|
||||
ready for real work 25–35%) was closer; ~700 merged PRs since then moved both numbers up.
|
||||
|
||||
### Readiness by audience
|
||||
|
||||
| Audience | Ready % | Opus 5.5 agent-hours to ~95% | Work that dominates |
|
||||
|---|---:|---:|---|
|
||||
| Full target (ready for real work) | ~45% (additive weighted sum: 46%) | 2,300–4,100 | Everything below, plus AI tier, plug-in/scripting ecosystem, video, localization, hardware |
|
||||
| Mainstream practitioner | ~43% | 1,700–2,800 | Depth in the 11 weekly areas (1,180–2,000), performance budgets, stability on real machines, PSD exchange with Photoshop |
|
||||
| Essentials user | ~61% | 400–700 | Startup and GPU robustness, brush and transform responsiveness, Type tool, discoverability (flyouts, commit buttons), AVIF/PDF open |
|
||||
|
||||
Hours calibrated as in [Remaining effort](#remaining-effort-and-calibration) (2–9 h per checklist
|
||||
item, 8–20 h per format or subsystem, from the repo's 1,004 merged PRs); each tier is a subset of
|
||||
the one above. About 80% parallelizes (independent crates and command modules); performance
|
||||
architecture and the PSD writer are the serial parts.
|
||||
|
||||
## Target measured
|
||||
|
||||
- **Adobe Photoshop 2026, version 27.11.0** (build 20260929.r.26, macOS universal), installed at
|
||||
`/Applications/Adobe Photoshop 2026`, with Camera Raw 18.7. Inspected without launching it:
|
||||
`Info.plist` document types, the file-format plug-ins' PiPL read/write flags, `.lproj` and
|
||||
`Locales/` language packs, `Default Keyboard Shortcuts.kys` (67 toolbox tools, 107 menu commands
|
||||
with default shortcuts), `Required/` plug-ins (85 filter entries, 12 format plug-ins), presets,
|
||||
and strings in the main binary (81 "… Tool" titles; HDR/EDR, Metal, Touch Bar, pen features).
|
||||
- PhotoCraft's own Photoshop menu tree (`crates/ui-egui/src/menu_catalog.rs`, 628 items) was
|
||||
written from Photoshop's menus; it is the denominator of the menu number. Photoshop's binary
|
||||
`Default Menus.mnu` was not parsed, so items added in 27.x that the catalog lacks would not show
|
||||
(Generative and cloud items are the likely ones).
|
||||
- User reports on GitHub (`storytold/photocraft`, 579 open issues on 2026-10-10) as evidence of
|
||||
depth and feel. Adobe's documentation and release notes for behaviour not visible in the bundle.
|
||||
|
||||
## Feature breadth: ~76% (weighted)
|
||||
|
||||
| Component | Weight | Ours / Photoshop | % | Kind |
|
||||
|---|---:|---|---:|---|
|
||||
| Menu commands | 30% | 628 / 628 catalog items dispatch a live command | 100% | measured (`cargo xtask parity`) |
|
||||
| Toolbox tools | 15% | 53 / 68 (Photoshop's 67 `.kys` tools plus Remove, Triangle, Curvature Pen; minus legacy Rounded Rectangle and Targeted Adjustment) | 78% | measured (`Tool` enum in `ui-egui/src/state.rs`, `TOOL_SECTIONS` in `panels.rs`) |
|
||||
| Panels | 10% | 30 / 35 Window-menu panels | 86% | measured (`view_cmds.rs`, panel modules) |
|
||||
| Filters and adjustments | 10% | every Filter and Image › Adjustments item live; Filter Gallery 47 looks | 100% | measured (menu catalog) |
|
||||
| File formats (usage-weighted) | 15% | 13 of 31 Photoshop formats supported in Photoshop's directions, 4 partial; the common ones (PSD/PSB, TIFF, JPEG, PNG, WebP) all present | ~80% (48% by count) | measured list, estimated weights ([file-format-parity.md](file-format-parity.md)) |
|
||||
| AI / generative | 10% | classical Select Subject/Sky, Remove tool, Content-Aware; no Generative Fill/Expand, Neural Filters, Sky Replacement, Super Zoom | ~15% | estimated |
|
||||
| Ecosystem (plug-ins, scripting, libraries) | 10% | WebAssembly plug-ins, CLI, MCP, actions; no .8BF, UXP/ExtendScript, .atn import, Libraries | ~20% | estimated |
|
||||
| **Weighted** | 100% | | **~76%** | |
|
||||
|
||||
## Ready for real work: ~45% (weighted)
|
||||
|
||||
Weights reflect what a working Photoshop user depends on (photographers, retouchers, designers).
|
||||
|
||||
| Dimension | Weight | % ready | Remaining (agent-h) | Evidence | Detail |
|
||||
|---|---:|---:|---:|---|---|
|
||||
| Features in depth (tools, layers, selections, type, filters, transforms) | 25% | 55% | 600–1,000 | Scorecard checklists: Tools 20 done / 15 partial / 6 missing, Type 0 / 3 / 6, Automation 3 / 2 / 6. 15 tools missing; Select and Mask, Vanishing Point and Content-Aware Fill are parameter dialogs, not workspaces; type on a path, manual kerning, RTL paragraphs missing | [gaps.md](gaps.md) |
|
||||
| UI / UX fidelity and feel | 15% | 40% | 350–600 | ~150 open UI issues; Workspace checklist 5 / 7 / 11; 46 of 149 preferences do nothing; no floating panel groups, thin Color panel, no transform context menu, brush lag and pressure jumps reported | [ui-parity.md](ui-parity.md), [brush-parity.md](brush-parity.md) |
|
||||
| File formats and fidelity | 15% | 60% | 300–500 | PSD oracle on Photoshop-authored files 133/256 (52%); io corpus 146/170 (86%); psd-tools 236/309 (76%); round trips ~100% of corpus; but users report Photoshop refusing our files (#1281, #2469; a text-layer case, #2374, was fixed 2026-10-10); no Photoshop PDF, EPS, JPEG 2000, JPEG XL, AVIF read, CR3 | [file-format-parity.md](file-format-parity.md) |
|
||||
| Performance | 10% | 25% | 200–350 | 3 of 25 budgeted scenarios meet budget (baseline 2026-10-05); 150-layer nudge crashes the GPU path (P12); layer move on 15000×10000 16-bit 2.7 s p50; users report brush and cursor lag (#2619, #2566, #1994) | [scorecard.md](scorecard.md#performance) |
|
||||
| Stability | 10% | 45% | 150–250 | Never-crash lints on 28/28 crates, `panic_hunt` in the gate, atomic saves; but field reports of freezes (#2518 Type tool 60 s on macOS), GPU panics (#2020, #1215), no-GPU start failures (#2519, #2412) | [gaps.md](gaps.md) |
|
||||
| Hardware | 5% | 50% | 80–150 | GPU compositor (wgpu), pen pressure on all desktops but tilt/rotation not on Windows, Wayland pen broken (#2622), no HDR/EDR output, monitor profile auto-detected on macOS only | [hardware-parity.md](hardware-parity.md) |
|
||||
| Localization | 5% | 55% | 80–140 | 7 of the 12 key languages at 100% of measured UI keys; Hindi, Arabic, Vietnamese absent; no RTL UI; engine messages English | [localization-parity.md](localization-parity.md) |
|
||||
| Platforms | 5% | 80% | 30–60 | macOS (notarized), Windows (unsigned), Linux (AppImage/deb/rpm/Flatpak), web, FreeBSD partial; no Windows ARM64, no in-app updates | [scorecard.md](scorecard.md#distribution) |
|
||||
| Ecosystem (plug-ins, scripting, presets, libraries) | 5% | 15% | 250–450 | No .8BF hosting (#2647), no UXP/ExtendScript, no .atn import; .abr/.grd/.pat/.aco/.ase/.cube supported | [gaps.md](gaps.md) |
|
||||
| AI features | 5% | 10% | 300–600 | No ML runtime at all (scorecard AUTO-219-7); classical substitutes only. Needs an owner decision and openly licensed models (#41) | [gaps.md](gaps.md) |
|
||||
| **Weighted** | 100% | **~46%** | **2,340–4,100** | | |
|
||||
|
||||
## Mainstream practitioner: ~43%
|
||||
|
||||
The same question for the typical professional Photoshop user (photographer, retoucher,
|
||||
designer), not the whole product. Method: craftrules `standards/progress-docs.md`. Areas a
|
||||
professional uses weekly (the [alpha-gate](roadmap.md#alpha-gate) workflows plus their everyday
|
||||
tools), depth from the [feature areas](#feature-areas) table. Left out: AI, plug-ins and
|
||||
scripting, Libraries/cloud, video, specialist hardware (tilt, Touch Bar), languages.
|
||||
|
||||
| Area | Weight | Depth |
|
||||
|---|---:|---:|
|
||||
| Layers, masks, blend modes, smart objects, styles | 20% | 65% |
|
||||
| Adjustments and filters | 15% | 70% |
|
||||
| Selections and masking | 15% | 55% |
|
||||
| Retouching | 12% | 50% |
|
||||
| Transform and warp | 8% | 55% |
|
||||
| Type | 8% | 40% |
|
||||
| Painting and brushes | 7% | 55% |
|
||||
| Vector shapes and paths | 5% | 55% |
|
||||
| Camera Raw | 4% | 45% |
|
||||
| Colour management | 3% | 70% |
|
||||
| Export, Save for Web | 3% | 50% |
|
||||
| **Weighted depth** | 100% | **57%** |
|
||||
|
||||
Discounts for what still stops real work (estimated, each with evidence):
|
||||
|
||||
| Discount | Factor | Evidence |
|
||||
|---|---:|---|
|
||||
| Interaction fidelity | ×0.92 | ~150 open UI issues; transform context menu, spring-loaded tools, panel tear-off missing ([ui-parity.md](ui-parity.md)); brush lag and pressure reports ([brush-parity.md](brush-parity.md)) |
|
||||
| Stability and speed on real machines | ×0.88 | 3 of 25 performance budgets met; 150-layer GPU crash (P12); Type tool freeze (#2518); GPU start failures (#2519, #2412, #2020); 41 open performance issues |
|
||||
| Exchanging files with Photoshop users | ×0.92 | Photoshop-authored oracle 133/256; exports refused by Photoshop (#1281, #2469); smart-filter re-render 5/30 |
|
||||
|
||||
**57% × 0.92 × 0.88 × 0.92 ≈ 43%** (range 38–48), estimated.
|
||||
|
||||
It is not higher than ready-for-real-work (~45%) because the areas it leaves out carry little
|
||||
weight in the full number (AI, ecosystem, localization and hardware together 20%, averaging
|
||||
~33%), while the discounts apply to every workflow. The two numbers agree within their error;
|
||||
the full number stays where its written weights put it.
|
||||
|
||||
**User evidence** (GitHub, 2026-10-10; search hits include maintainer replies, so they are upper
|
||||
bounds): 0 issues mention switching from or replacing Photoshop; praise words appear in ~19
|
||||
("love"), 10 ("amazing"), 6 ("awesome"), 4 ("great work") issues. Of 579 open issues, 136 are
|
||||
feature requests and 443 bugs or reports, of which ~244 are on core paths (layers, selection,
|
||||
brush, transform, type, save/open, performance) by title. Users are trying it for real work,
|
||||
and most of what they report is core-path friction, not niche requests.
|
||||
|
||||
## Essentials user: ~61%
|
||||
|
||||
An occasional user who touches only the essentials: open or create a file, the most used tools
|
||||
and commands, undo, save and export, default settings. Excluded: advanced options, pro
|
||||
workflows, PSD exchange edge cases, and everything excluded above.
|
||||
|
||||
| Core feature | Weight | Depth | Notes |
|
||||
|---|---:|---:|---|
|
||||
| Save, Save As, Export JPEG/PNG | 12% | 85% | |
|
||||
| Layers (add, reorder, hide, opacity) | 12% | 80% | |
|
||||
| New / open a photo | 10% | 90% | |
|
||||
| Select (marquee, lasso, magic wand, object) | 10% | 75% | |
|
||||
| Move and Free Transform | 10% | 70% | no commit/cancel buttons (#2442) |
|
||||
| Brush and eraser | 10% | 70% | lag with big brushes (#2619) |
|
||||
| Undo, History | 8% | 90% | |
|
||||
| Basic adjustments (brightness, levels, curves, hue/saturation) | 8% | 80% | |
|
||||
| Crop and straighten | 6% | 85% | |
|
||||
| Text | 6% | 55% | freeze report (#2518) |
|
||||
| Spot healing, Remove | 5% | 65% | |
|
||||
| Blur and sharpen filters | 3% | 85% | |
|
||||
| **Weighted depth** | 100% | **78%** | |
|
||||
|
||||
Discounts: launch and stability ×0.90 (start failures without a usable GPU, #2519, #2412,
|
||||
#1859; Type tool freeze, #2518); discoverability and UI clarity ×0.92 (language option not
|
||||
found, #2532; flyouts only on right-click, #2301; toolbar hover issue, #2603); opening files
|
||||
people send ×0.95 (JPEG, PNG, HEIC, WebP, PSD open; AVIF and PDF don't, #463, #2541).
|
||||
**78% × 0.90 × 0.92 × 0.95 ≈ 61%** (range 55–67), estimated.
|
||||
|
||||
## Feature areas
|
||||
|
||||
Percent is ready-for-real-work for that area (depth and fidelity, not presence). Hours are to full
|
||||
parity for the area and are already contained in the dimension rows above.
|
||||
|
||||
| Area | % | Hours | Notes |
|
||||
|---|---:|---:|---|
|
||||
| Layers, groups, masks, blend modes, smart objects, layer styles | 65% | 150–250 | Broad and GPU-accelerated. Open: multi-layer Smart Object conversion (#2604, #2648), layer clipboard between documents (UI-217-23), Stamp Visible, contour editor, smart-object perspective (FILE-215-6), mask targeting by command (#2458) |
|
||||
| Selections, Select and Mask, channels | 55% | 120–200 | All selection tools except single row/column marquee. Select and Mask is a generic dialog (TOOL-214-1), no Refine Hair (#2671); Select Subject/Sky classical, 559 ms p50 on 24 MP vs a 100 ms budget |
|
||||
| Painting and brush engine | 55% | 150–250 | Every Brush Settings section exists; feel is the gap: lag on big brushes, pressure jumps, smoothing and edge quality reports ([brush-parity.md](brush-parity.md)) |
|
||||
| Retouching (healing, clone, patch, remove, content-aware) | 50% | 100–180 | Remove tool non-generative; Content-Aware Fill has no workspace (TOOL-214-15); live stroke preview only for Brush/Eraser (TOOL-213-7) |
|
||||
| Transform, warp, puppet, perspective, liquify | 55% | 100–180 | Free Transform modifiers right; no transform context menu (TOOL-214-5), no skew fields, puppet mesh is a block grid (TOOL-214-6), Liquify called "useless" by a user (#2606) |
|
||||
| Adjustments and filters | 70% | 120–200 | All present; smart-filter re-render matches Photoshop on 5 of 30 files; Filter Gallery looks approximate; no Neural Filters |
|
||||
| Type | 40% | 120–200 | Engine works; no type on a path, manual kerning, RTL paragraphs, OpenType panel UI, live Warp Text preview; Type tool freeze on macOS (#2518) |
|
||||
| Vector shapes and paths | 55% | 80–140 | Pen, Direct/Path Selection, shapes, shape strokes. Missing Freeform/Curvature Pen, anchor tools, on-canvas corner radius, path-point nudge; shape parity tracking issue #2496 |
|
||||
| Colour management and modes | 70% | 60–100 | Own ICC engine, soft proof, CMYK/Lab/Indexed/Duotone/Multichannel; no Adobe CMYK profiles, no spot plates (FILE-215-17), monitor profile only at launch |
|
||||
| Camera Raw and computational photo (Photomerge, HDR, lens) | 45% | 120–200 | Raw for DNG/CR2/NEF/ARW/RW2/ORF/RAF(uncompressed)/PEF; no CR3; ACR dialog partial (no masking, calibration); generic lens profiles only |
|
||||
| Automation, actions, batch, scripting | 45% | 120–200 | CLI/MCP/control channel ahead of Photoshop; Actions panel and recording not document-independent (AUTO-219-1/2), no .atn, no ExtendScript/UXP |
|
||||
| File I/O | 60% | 300–500 | See [file-format-parity.md](file-format-parity.md) |
|
||||
| Print, export, Save for Web | 50% | 60–100 | JPEG Options dialog missing (FILE-215-19), no Photoshop PDF, no separations, Save for Web settings not remembered |
|
||||
| Video / timeline, data-driven graphics | 30% | 100–200 | Menu items live; frame model persists in `.pcraft`; no PSD video-layer mapping |
|
||||
| Workspace, panels, preferences | 40% | 150–250 | 46 of 149 prefs do nothing; no floating/OS-window panel groups; Libraries, Comments, Contextual Task Bar missing |
|
||||
| AI / generative | 10% | 300–600 | See the dimension row |
|
||||
|
||||
## Remaining effort and calibration
|
||||
|
||||
**Calibration.** The repository's history from the first commit (2026-09-30) to 2026-10-10: 1,152
|
||||
commits on `main` and 1,004 merged PRs in 10.5 days. Median PR open-to-merge time is 3.4 h
|
||||
(p75 6.4 h, p90 14.3 h; that includes CI and review queueing). Comparable features:
|
||||
|
||||
| Feature | PRs | Lines added | PR hours |
|
||||
|---|---|---:|---:|
|
||||
| Crop tool parity set (#1919: nudge/swap/readout, overlays, Straighten, shield) | #1958, #2026, #2127, #2128 | ~2,050 | 6.5 |
|
||||
| Crop rotation (#1792) | #1879 | 710 | 2.8 |
|
||||
| Remove tool with non-local patch completion | #2193 | 2,005 | 9.0 |
|
||||
| OpenRaster open and save | #2257 | 1,331 | 8.9 |
|
||||
| Paint.NET import | #1998 | 1,461 | 7.0 |
|
||||
| Shape stroke controls | #2218 | 1,506 | 9.0 |
|
||||
| Red Eye tool | #1084 | 1,232 | 17.9 |
|
||||
| Korean catalog and live switching | #582, #604 | ~3,800 | 13.0 |
|
||||
|
||||
So one checklist item of tool or UI depth costs about 2–9 agent-hours including tests, and a new
|
||||
format or subsystem 8–20. With roughly 2–4 agent-hours per merged PR, the ~1,000 PRs so far
|
||||
represent about **2,000–4,000 agent-hours**, which took ready-for-real-work from 0 to ~45%. The
|
||||
remaining points are harder per point (fidelity against Photoshop's unpublished maths, feel,
|
||||
performance on large documents, user-reported long tail), so the remaining estimate is not lower
|
||||
than the work already done.
|
||||
|
||||
**Totals.**
|
||||
|
||||
| Milestone | Scope | Opus 5.5 agent-hours |
|
||||
|---|---|---:|
|
||||
| **Beta** (~75% ready, PSD reliable) | PSD fidelity and Photoshop re-open check, the performance budgets, the user bug backlog, the 15 missing tools, Select and Mask / Content-Aware Fill workspaces, type depth, UI feel (brush, transform, panels), JPEG/PDF/AVIF/JXL formats, Hindi/Arabic/Vietnamese and RTL | **1,100–1,800** |
|
||||
| **Full parity** | the above plus the AI tier, plug-in/scripting ecosystem, video depth, long-tail fidelity | **2,300–4,100** |
|
||||
|
||||
**Parallelism.** About 80% parallelizes: areas are independent crates and command modules, and
|
||||
the repository has sustained 10–20 concurrent agents. At ~12 agents, beta is roughly 100–150
|
||||
wall-clock hours. Serial parts: GPU compositor and performance architecture, the PSD writer.
|
||||
|
||||
**Needs a human.** Owner decisions on the AI backend (#41: which openly licensed models, local
|
||||
vs remote) and plug-in hosting (.8BF needs native code under the isolated-`unsafe` rule; UXP is a
|
||||
JavaScript runtime, which AGENTS.md forbids in the UI); Windows code-signing material; tablet
|
||||
hardware checks (Wacom/XP-Pen on Windows, Wayland, macOS); native-speaker review of every
|
||||
catalog; checking exports by opening them in Photoshop (the owner's machine has it installed).
|
||||
|
||||
## How to re-measure
|
||||
|
||||
1. `cargo xtask parity` and `cargo xtask scorecard` for the measured rows.
|
||||
2. Tools: diff `Tool` in `crates/ui-egui/src/state.rs` against the `<tool>` entries of
|
||||
Photoshop's `Locales/en_US/Support Files/Shortcuts/Mac/Default Keyboard Shortcuts.kys`.
|
||||
3. Formats: Photoshop's `Info.plist` `CFBundleDocumentTypes` and the PiPL flags of
|
||||
`Contents/PlugIns/Required/File Formats`, against `crates/codecs/src/format.rs` and
|
||||
`crates/io/src/lib.rs`.
|
||||
4. Languages: `cargo xtask i18n-coverage`.
|
||||
5. Re-grade the estimated rows from the open issues by area and the corpus floors. Move a number
|
||||
only with new evidence, and add a revision-history row.
|
||||
|
||||
---
|
||||
|
||||
# Earlier assessments (kept for the record)
|
||||
|
||||
The two sections below are superseded by the tables above. They are kept because they hold dated
|
||||
evidence that later numbers build on.
|
||||
|
||||
## Feature-parity estimate of 2026-10-03 (from the former `docs/parity-estimate.md`)
|
||||
|
||||
How close PhotoCraft is to Adobe Photoshop 2026, and how much Opus 5.5 work remains. Generated by
|
||||
assessment, not a tool; revisit when a major arc lands. Menu coverage is from `cargo xtask parity`;
|
||||
fidelity is from the PSD oracle (`cargo xtask corpus` / `oracle_diff`).
|
||||
|
||||
### Headline
|
||||
|
||||
> **Update 2026-10-03:** menu/command breadth reached **100% (625/625)** — every Photoshop
|
||||
> menu item now dispatches a live command (incl. Variables/Data Sets, Trap, the Timeline panel and
|
||||
> Layer › Video Layers). Remaining parity work is depth and fidelity, not breadth: PSD oracle
|
||||
> (~66%), Camera Raw/video-layer depth, and the AI/Neural tier. See the table below.
|
||||
|
||||
|
||||
- **Menu / command breadth:** 625 / 625 Photoshop menu items live = **100%** (every menu item has a live command).
|
||||
- **PSD rendering fidelity (oracle):** ~111 / 170 corpus files pixel-match = **~65%**.
|
||||
- **Overall functional parity (weighted, mainstream workflows):** **~86%** (menu breadth complete; depth + fidelity are the remaining gap).
|
||||
- **Overall including Adobe's AI / Firefly features:** **~75%** (these are mostly cloud/ML and the
|
||||
hardest to reach clean-room).
|
||||
|
||||
Menu coverage (96%) overstates true parity because many live commands are faithful-but-approximate
|
||||
(Camera Raw without masking/calibration, Vanishing Point without its UI, heuristic Select Subject/Sky
|
||||
vs Adobe's ML, Content-Aware Fill basic). The weighted figure accounts for depth and fidelity, not
|
||||
just presence.
|
||||
|
||||
### Where we stand, by area
|
||||
|
||||
| Area | Parity | Notes |
|
||||
|---|---:|---|
|
||||
| Layers, masks, groups, blend modes, smart objects, layer styles | ~92% | Broad + GPU-accelerated; bevel/satin shapes and a few blend edge cases remain |
|
||||
| Selections, paths, vector shapes, pen | ~90% | Select menu 100% of items; Select Subject/Sky are heuristic, not ML |
|
||||
| Paint / brush engine, retouch (clone, healing) | ~85% | Solid; no Mixer Brush depth, no Content-Aware healing |
|
||||
| Adjustments + adjustment layers | ~90% | All kinds present; Camera Raw depth and a few toe-curve models approximate |
|
||||
| Filters (incl. Filter Gallery ×47, Liquify, blurs, render) | ~88% | Gallery looks are approximations; no Neural Filters |
|
||||
| Type / text engine, character & paragraph styles, glyphs | ~90% | Vertical type laid out and rendered (#199; no mojikumi or upright-Roman option yet); OpenType alternates thin |
|
||||
| Color management (ICC v2/v4, intents, soft-proof) | ~90% | Own pure-Rust CMS; no Adobe CMYK profiles (synthetic) |
|
||||
| File I/O: PSD, native .pcraft, flats (png/jpg/tiff/webp/exr/…) | ~85% | PSD oracle ~65% pixel-exact; most structure round-trips |
|
||||
| Transform, warp, puppet, perspective, liquify | ~88% | No Face-Aware Liquify (needs a landmark model) |
|
||||
| Automation: CLI, MCP, headless server, control channel | ~95% | Ahead of Photoshop here (see below) |
|
||||
| Image modes (RGB/Gray/CMYK/Lab/Indexed/Duotone/Multichannel) | ~85% | Multichannel display-only; no ink-plate model |
|
||||
| Print / export / Save for Web / slices / Generator | ~85% | No Separations/bleed; droplets basic |
|
||||
| Computational photo (Photomerge, HDR, Lens, Camera Raw, Wide Angle) | ~70% | Classical implementations; generic lens profiles only |
|
||||
| Data-driven graphics (Variables, Data Sets) | ~0% | Not started (5 menu items) |
|
||||
| Video / Timeline / animation | ~0% | Not started (13 menu items) — a whole subsystem |
|
||||
| AI / Neural / Generative (Firefly, Sensei, Neural Filters) | ~5% | Mostly absent; needs licensed/trained models |
|
||||
| Prepress niche (Trap, measurement scale pro) | ~30% | Trap, ink spread not modelled |
|
||||
|
||||
### The remaining 25 menu items, grouped
|
||||
|
||||
- **Video & Timeline (13):** Video Layers (new/insert/duplicate/delete/replace/interpret/restore/
|
||||
reload/rasterize), Rasterize › Video, Timeline panel, Render Video, Import Video Frames to Layers.
|
||||
One cohesive subsystem: a frame/time model, a video decoder/encoder (clean-room Rust, no ffmpeg),
|
||||
onion-skinning, and a timeline UI.
|
||||
- **Data-driven graphics (5):** Variables › Define / Data Sets, Apply Data Set, Export Data Sets as
|
||||
Files, Import Variable Data Sets. A template-binding model over layers + a CSV/data-set engine.
|
||||
- **Niche / platform (7):** Trap (prepress ink spread), Frame from Layers, Migrate Presets, WIA
|
||||
Support (Windows scanners), and two already-adjacent items.
|
||||
|
||||
### Effort to parity (Opus 5.5)
|
||||
|
||||
Two clocks: **agent-hours** (total model work) and **wall-clock** (with this session's observed
|
||||
~6–8× parallelism across independent arcs). This session landed ~70 menu items + major subsystems
|
||||
in a handful of wall-clock hours using 8 parallel agents, so wall-clock ≈ agent-hours ÷ 6.
|
||||
|
||||
| Milestone | Scope | Agent-hours | Wall-clock |
|
||||
|---|---|---:|---:|
|
||||
| **To 90% functional** | remaining non-AI/non-video menu items (Variables, Trap, Frame, Migrate, WIA), Camera Raw depth, Vanishing Point UI, selection quality, polish | 60–90 | 10–15 h |
|
||||
| **To 95% functional** | the above + PSD oracle 65% → ~90% (bevel/satin shapes, Lab blending, noise-gradient RNG, toe curves), broad UI-parity pass, perf pass | +80–130 | +15–22 h |
|
||||
| **Video / Timeline subsystem** | frame model, clean-room decode/encode, timeline, animation, Render Video | 50–80 | 10–14 h |
|
||||
| **Credible AI tier** | ML Select Subject/Sky, Content-Aware Fill (PatchMatch++), basic generative fill/expand — needs model integration; some features may be infeasible fully clean-room without licensed models | 120–250+ | 25–45 h |
|
||||
|
||||
**Totals:**
|
||||
- To **~95% functional parity** (everything except video and AI): **~140–220 agent-hours ≈ 25–40
|
||||
wall-clock hours** of Opus 5.5 with parallel agents.
|
||||
- To **~98%** incl. the video subsystem: **+50–80 agent-hours ≈ +10–14 wall-clock hours**.
|
||||
- To **~99%** incl. a credible AI tier: **+120–250 agent-hours ≈ +25–45 wall-clock hours**, with the
|
||||
caveat that pixel-for-pixel Firefly/Sensei parity is not achievable clean-room without trained
|
||||
models; we target functional equivalents.
|
||||
|
||||
**Best single number:** PhotoCraft is **~82% of the way** to full Photoshop parity, and reaching a
|
||||
**95%, ships-for-most-users** state is roughly **25–40 wall-clock hours** of parallel Opus 5.5 work.
|
||||
Closing the last 5% (video + AI) is the long, uncertain tail.
|
||||
|
||||
### Assumptions & caveats
|
||||
|
||||
- "Parity" = functional + visual equivalence of what a user can do, not byte-identical output. Clean-
|
||||
room means no Adobe code, profiles, shaders, or trained models; AI features target equivalents.
|
||||
- Wall-clock assumes 6–8 independent arcs in parallel with their own target dirs, as this session ran.
|
||||
Serial work is ~6× longer.
|
||||
- Adobe removed 3D/Substance from Photoshop, so 3D is intentionally out of scope.
|
||||
- Fidelity hours are the least certain: the remaining oracle failures are proprietary RNGs and
|
||||
unpublished curve models fitted by observation.
|
||||
|
||||
## Honest parity assessment of 2026-10-05, with dated evidence to 2026-10-10 (from the former section of `docs/roadmap.md`)
|
||||
|
||||
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-checklist.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: Iris Blur pin preparation, saturated-distance evaluation and trailing
|
||||
Gaussian-level halo trimming measure 1.18–1.76× faster across eight local 24 MP
|
||||
RGB U8/U16/F32 cases (Ryzen 7 9700X, Windows, eight workers). Default blur 15:
|
||||
626.8 → 426.9 ms; two pins: 1789.9 → 1016.2 ms. The default 1500×1000 filtered
|
||||
proxy for 24 MP, document blur 15/80: 28.7/51.8 → 24.9/42.6 ms. At 36 MP,
|
||||
two pins: 2595.8 → 1822.8 ms; small/medium U8 gains are inconclusive.
|
||||
Differential tests preserve exact finite pixel bits.
|
||||
These are computation timings, not GUI frame latency or new Photoshop parity;
|
||||
see [measurements, upstream SIMD findings and limits](iris-blur-performance.md).
|
||||
|
||||
2026-10-10: Quick Selection object strokes through raster surfaces measured
|
||||
3.46-3.70x faster at 8-bit, 16-bit and 32f on 24-36 MP documents (AWS
|
||||
c7i.4xlarge, five paired release runs), with identical region bounds and mask bytes.
|
||||
Hybrid FIFO push/relabel and sparse edge enumeration preserve the fitted energy.
|
||||
See [stroke measurements and reproduction](quick-selection-performance.md).
|
||||
|
||||
2026-10-10: Pixelate's Facet shares exact 3x3 quadrant statistics and Color Halftone
|
||||
shares dot radii within each rotated screen grid. Full tiled CPU application at 24 MP
|
||||
on a 16-vCPU m7i.4xlarge improves Facet from 0.684 s to 0.312 s in RGB8
|
||||
(2.20x), and from 7.888 s to 0.574 s in CMYK8 (13.74x).
|
||||
Color Halftone improves from 1.137 s to 0.604 s in RGB8 (1.88x)
|
||||
and from 3.589 s to 0.718 s in Lab8 (5.00x).
|
||||
Three alternating paired release runs also cover 36 MP RGB, 16/32-bit storage,
|
||||
and screen radii 2/8/64. All 36 complete output comparisons match exactly.
|
||||
See [method, raw timings and checks](pixelate-performance.md).
|
||||
|
||||
2026-10-10: Native CMYK solid and gradient fills share depth-quantized samples between
|
||||
rendering and PSD export. The uncached 16-bit CMYK gradient now round-trips with zero
|
||||
rendered error; psd-tools round trips rise from 307 to 308. Mixed and Photoshop round
|
||||
trips remain 169 and 258; rendering oracle counts remain 146, 237 and 133.
|
||||
Exact 8-bit CMYK row reuse reduces 1 MP conversion-read time by 77% for smooth ramps,
|
||||
33% with dithering and 10% for random colours (M4 Max, release optimization level 3).
|
||||
|
||||
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-checklist.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). |
|
||||
| OpenRaster read/write | 2026-10-09: 34 Krita 5.2.9-authored `.ora` files (27 blend modes, groups, pass-through, offsets, opacity, visibility, masks, 16-bit, gray) render within 3/255 of Krita's merged image (30) or differ for known reasons (4: Krita's lighter/darker-colour tie-break, Hard Mix at exactly 1, a linear-light 16-bit document); Krita re-opens our exports and renders them identically to its originals (33/34; Soft Light is written as `svg:soft-light`) | medium (one authoring app) | MyPaint and GIMP files untested. Masks are applied to pixels and layer styles dropped on save (reported). See [OpenRaster](ora.md). |
|
||||
| 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).
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | minor | Readiness-by-audience table: percent and hours for full, mainstream and essentials; full number confirmed as the additive weighted sum over dimensions (46%, reported ~45%) |
|
||||
| 2026-10-10 | minor | Added mainstream-practitioner (~43%) and essentials-user (~61%) numbers with written weights and discounts; full ready-for-real-work rechecked against its written weights (46%, reported ~45%), unchanged |
|
||||
| 2026-10-10 | minor | Stage checked against the core-workflow alpha gate in `roadmap.md`: passes |
|
||||
| 2026-10-10 | major | Full re-measure against Photoshop 2026 27.11.0 (installed bundle inspected); two numbers, weights, per-dimension and per-area hours calibrated from git history; merged `parity-estimate.md` and the roadmap's honest assessment into this file |
|
||||
| 2026-10-05 | major | Honest parity assessment in `docs/roadmap.md`: surface 60–70%, ready for real work 25–35% |
|
||||
| 2026-10-03 | major | `docs/parity-estimate.md`: menu breadth 625/625, weighted ~82–86% |
|
||||
@@ -0,0 +1,206 @@
|
||||
# UI parity: tools, handles, modifiers and feel
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version: tools, transform, nudging, snapping, modifiers, navigation, shortcuts, panels audited from source and open issues) · **Target:** Adobe Photoshop 2026
|
||||
|
||||
How PhotoCraft's direct manipulation compares with Photoshop 2026 (27.11.0): the toolbox, the
|
||||
handles and modifier keys of each gesture, nudging, snapping, numeric precision, navigation,
|
||||
shortcuts and panels. Painting feel has its own checklist in [`brush-parity.md`](brush-parity.md)
|
||||
and right-click menus in [`context-menu-parity.md`](context-menu-parity.md). The design system
|
||||
(themes, tokens, widgets) is [`ui-design.md`](ui-design.md).
|
||||
|
||||
Status: **done** (behaves as in Photoshop, with a test), **partial** (exists, differs or untested),
|
||||
**missing**. Evidence is a file under `crates/ui-egui/src/` unless another path is given, a
|
||||
scorecard id, or an issue. Modifier names are macOS first (⌘ ⌥ ⇧); Windows/Linux use Ctrl and Alt.
|
||||
|
||||
**Summary (estimated, weights = how often the gesture is used):** ~40% ready. Tools 53/68
|
||||
present (78%, measured). Free Transform modifiers and Crop are close to Photoshop; the gaps are
|
||||
in the long tail of modifiers, in-transform UI, spring-loaded tools, panels and preferences.
|
||||
Remaining: 60–110 h for transforms and modifiers (gap G5), 60–100 h for tools (G6), 150–250 h
|
||||
for panels and workspace (G9).
|
||||
|
||||
## Tools
|
||||
|
||||
Measured: the `Tool` enum (`state.rs:64`) and `TOOL_SECTIONS` (`panels.rs:17`, 22 flyout slots)
|
||||
against the 67 `<tool>` entries of Photoshop's `Default Keyboard Shortcuts.kys` plus Remove,
|
||||
Triangle and Curvature Pen (minus legacy Rounded Rectangle and Targeted Adjustment) = 68.
|
||||
|
||||
| Group | Present | Missing |
|
||||
|---|---|---|
|
||||
| Move, artboard | Move | Artboard (commands `layer.new.artboard*` exist) |
|
||||
| Marquee | Rectangular, Elliptical | Single Row, Single Column |
|
||||
| Lasso | Lasso, Polygonal, Magnetic | |
|
||||
| Selection | Object Selection, Quick Selection, Magic Wand | |
|
||||
| Crop and slice | Crop, Slice, Slice Select | Perspective Crop |
|
||||
| Frame | | Frame (`layer.new.frameFromLayers` exists) |
|
||||
| Eyedropper | Eyedropper, Ruler, Note, Count | Color Sampler (#1046) |
|
||||
| Retouch | Remove, Spot Healing, Healing, Patch, Content-Aware Move, Red Eye | |
|
||||
| Brush | Brush, Pencil, Mixer Brush | Color Replacement (`paint.colorReplacement` exists) |
|
||||
| Stamp | Clone Stamp, Pattern Stamp | |
|
||||
| History | History Brush | Art History Brush |
|
||||
| Eraser | Eraser, Background Eraser, Magic Eraser | |
|
||||
| Fill | Gradient, Paint Bucket | |
|
||||
| Focus, toning | Blur, Sharpen, Smudge, Dodge, Burn, Sponge | |
|
||||
| Pen | Pen | Freeform Pen, Curvature Pen (#1054), Add Anchor Point, Delete Anchor Point, Convert Point (⌥ with Pen only) |
|
||||
| Type | Horizontal, Vertical | Horizontal Type Mask, Vertical Type Mask |
|
||||
| Path selection | Path Selection, Direct Selection | |
|
||||
| Shapes | Rectangle, Ellipse, Triangle, Polygon, Line, Custom Shape | (Star is a Polygon option in Photoshop) |
|
||||
| View | Hand, Rotate View, Zoom | |
|
||||
| Toolbar controls | Edit Toolbar, colour chips, Quick Mask, Screen Mode | |
|
||||
|
||||
| Toolbar behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Letter shortcuts, ⇧+letter cycles the group, "Use Shift Key for Tool Switch" | done | `shortcuts.rs:413` |
|
||||
| Group remembers the last tool used | partial | L always resets to Lasso (#2608) |
|
||||
| Press-and-hold or click-drag opens the flyout | missing | right-click only (#2301) |
|
||||
| Edit Toolbar customization | done | `edit.toolbar` |
|
||||
|
||||
## Free Transform (⌘T) and transform handles
|
||||
|
||||
`transform_tool.rs` (3,158 lines), behaviour summary in [`ui-design.md`](ui-design.md#interaction-models-match-photoshop-cc).
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Eight handles, drag inside moves, outside rotates with rotation cursor and live angle | done | #1948 |
|
||||
| Corners and edges proportional by default; ⇧ frees them (edge stretches one axis) | done | #1873 |
|
||||
| ⌥ scales about the reference point; ⌥-click places it; draggable reference point | done | |
|
||||
| ⌘-corner distort, ⌘-edge skew, ⌘⌥⇧ perspective, ⇧ rotate in 15° steps | done | |
|
||||
| Warp: presets, bend, split crosswise/vertical/horizontal, 3×3–5×5 and custom grids | done | |
|
||||
| Options bar X/Y, W/H % with link, angle | done | |
|
||||
| Options bar H/V skew fields | missing | |
|
||||
| Interpolation in the options bar | partial | Bicubic/Bilinear/Nearest; no Bicubic Smoother/Sharper/Automatic, Preserve Details |
|
||||
| Commit/cancel buttons in the options bar | missing | #2442 |
|
||||
| Right-click menu during transform (Scale, Rotate, Skew, Distort, Perspective, Warp, flips, rotates) | missing | TOOL-214-5 |
|
||||
| Arrow keys nudge the box 1 px, ⇧ 10 px | done | `move_mods.rs` |
|
||||
| Preview keeps layer order, blend mode and mask | partial | mask yes (BUG-205-2); order/blend not (#2439) |
|
||||
| Preview clipped to the canvas, follows edits while open | done | #2201, #2099 |
|
||||
| Hand (space) mid-transform doesn't interrupt it | partial | #2302 |
|
||||
| Blend mode / opacity edits while transforming | missing | #1384 |
|
||||
| Locked layer refused before the drag | missing | fails only at commit (#2585) |
|
||||
| Transform a copy (⌥⌘T), step and repeat (⌥⇧⌘T) | done | 2026-10-07 |
|
||||
| Transform a targeted alpha channel | missing | BUG-207-4 |
|
||||
| Smart object perspective (non-affine) | missing | FILE-215-6, #579 |
|
||||
| Type-layer transform while editing (⌘ held), no ⌘-corner distort on type | done | `ui-design.md` |
|
||||
| Puppet Warp mesh follows the outline | missing | block grid (TOOL-214-6) |
|
||||
|
||||
## Move tool and nudging
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Arrow 1 px, ⇧-arrow 10 px for layers | done | `move_mods.rs` |
|
||||
| Arrow nudge of a selection outline (selection tools) | done | #1502 |
|
||||
| Arrow nudge of the crop box, X swaps orientation | done | TOOL-214-19 |
|
||||
| Arrow nudge of path points with Direct Selection | missing | no arrow handling in `direct_select.rs` |
|
||||
| ⌘-arrow nudges the layer from any tool | missing | #2474 |
|
||||
| ⌥-drag duplicates, ⇧ constrains to 45° | done | `move_mods.rs` |
|
||||
| Auto-Select with hover outline, box-select layers, double-click fit | missing | TOOL-214-4 |
|
||||
| Auto-Select bounding box and snapping follow the picked layer | partial | follow the previous layer (#2666) |
|
||||
| ⌘-drag temporary Move shows the box and snaps | partial | #2681 |
|
||||
| ⌘-right-click layer list under the pointer | done | `layer_pick_ui.rs` |
|
||||
| Moving a selection on a mask moves the mask, not the pixels | partial | #2468 |
|
||||
|
||||
## Selection modifiers
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| ⇧ square/circle, ⌥ from centre, live W × H readout (marquee) | done | `marquee_tests.rs` |
|
||||
| ⇧ add, ⌥ subtract, ⇧⌥ intersect from modifiers at press | partial | works; only a badge test (BUG-208-4) |
|
||||
| Space repositions the marquee while dragging | done | `hold_keys.rs` |
|
||||
| Polygonal Lasso ⇧ snaps to 45° | missing | #2352 |
|
||||
| Autoscroll at the window edge while selecting | missing | #2231 |
|
||||
| Single-pixel rows and columns kept on release | partial | #2391 |
|
||||
| Esc deselects / ⌘Z undoes the last selection | partial | #2674, #1432 |
|
||||
| Select › Modify live preview | missing | #1752 |
|
||||
|
||||
## Pen, paths and shapes
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Click corner, drag smooth, ⌥ breaks a handle, ⌘ direct-selects, ⇧ 45° | partial | TOOL-214-10 |
|
||||
| Handle on the last point, close-drag handle | partial | #1482 |
|
||||
| Path operations in the options bar (combine, subtract, intersect, exclude) | partial | `layer.combineShapes.*`; Pen options #1397 |
|
||||
| On-canvas corner-radius handles on live shapes | missing | TOOL-214-12 |
|
||||
| Shape stroke controls (dash, caps, joins, align) | done | TOOL-1053-1, [`shape-strokes.md`](shape-strokes.md) |
|
||||
| Rotated shape selection hints correct | partial | #2512 |
|
||||
| Curved shape bounds exact | partial | one pixel too wide (#2537) |
|
||||
|
||||
## Crop
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Drag outside rotates (⇧ 15°), angle readout; ↵ rotates and crops in one undo step | done | TOOL-214-18 |
|
||||
| Straighten button and ⌘-drag line | done | TOOL-214-21 |
|
||||
| Overlays (thirds, grid, diagonal, triangle, golden ratio/spiral), O / ⇧O | done | TOOL-214-20 |
|
||||
| Crop shield, Show Cropped Area (H) | done | TOOL-214-22 |
|
||||
| Default mode: the image turns and moves behind an upright box; Auto Center Preview; Use Classic Mode | done | TOOL-214-23 |
|
||||
| W × H × Resolution with units, built-in size presets, Front Image | done | TOOL-214-9 (`crop_size.rs`) |
|
||||
| Saved custom crop presets | missing | TOOL-214-9 |
|
||||
| Content-Aware crop fill, Delete Cropped Pixels off | partial | |
|
||||
|
||||
## Snapping, guides, rulers, precision
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Snap to guides, grid, layers, document bounds and centre, selection, slices; ⌘ disables while dragging | done | `engine/src/snap.rs`, `snap_ui.rs` |
|
||||
| Snap vector tools and transforms to the pixel grid | done | `snap_ui.rs:196` |
|
||||
| Smart guides (magenta alignment lines) | done | |
|
||||
| Smart guide distance and spacing labels | missing | |
|
||||
| Ruler units px/in/cm/mm/pt/pica/% | done | |
|
||||
| Status bar follows the ruler unit | partial | #2602 |
|
||||
| Ruler corner and gaps drawn as Photoshop | partial | #2600, #2601, #2551 |
|
||||
| Guides stored as f64 | missing | `Vec<f32>` (UI-217-20) |
|
||||
| Geometry precision | partial | `geom::Point` f64, paths f64; paint internals mostly f32 |
|
||||
| Numeric fields: arithmetic, scrubby labels | partial | units in expressions and double-click reset missing (UI-217-13) |
|
||||
|
||||
## Navigation
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Space = Hand, ⌘Space / ⌘⌥Space = zoom in/out, spring-loaded while held | done | `hold_keys.rs` |
|
||||
| Hold any tool letter for a temporary tool | missing | #2672 |
|
||||
| Scrubby zoom | done | `zoom_tool.rs` |
|
||||
| Flick panning | missing | `tools.enable_flick_panning` unread |
|
||||
| Animated zoom | missing | unread pref; #566 |
|
||||
| Double-click Zoom tool = 100%, double-click Hand = fit | partial | Zoom missing (#2508) |
|
||||
| ⌥-wheel zoom in gentle steps | missing | UI-217-18 |
|
||||
| Wheel, smooth scrolling and pinch as in Photoshop | partial | #2485, #2463, #1989 |
|
||||
| Trackpad rotate drives Rotate View | done | `rotate_view.rs:136` |
|
||||
| Zoom levels to 3200% and beyond | partial | #1813 |
|
||||
| Physical 100% at any display scale | done | #1943 |
|
||||
| ⌃Tab / ⌃⇧Tab switch document tabs | missing | #2340 |
|
||||
|
||||
## Keyboard shortcuts
|
||||
|
||||
| Measure | Value | Kind |
|
||||
|---|---|---|
|
||||
| Photoshop default shortcuts (`.kys`) | 58 tool keys, 107 menu commands with 115 shortcuts, 25 tool-area commands | measured |
|
||||
| PhotoCraft | ~199 shortcut assignments, 113 distinct modifier/F-key combos, 20 tool letters, 3 temporary-tool bindings | measured (source) |
|
||||
| Shortcut audit | 214 → 0 failures (2026-10-07) | measured then; not re-run here |
|
||||
| `.kys` import | done (`engine/src/kys.rs`) | |
|
||||
| Shortcut glyphs per platform | done (UI-217-19) | |
|
||||
|
||||
## Panels and workspace
|
||||
|
||||
30 of 35 Window-menu panels exist (measured). Missing: Libraries, Comments, Contextual Task Bar,
|
||||
Discover, Generative variations. Dock tabs: Layers, Channels, Paths, History, Actions, Layer
|
||||
Comps, Properties, Adjustments, Navigator, Histogram, Info, Color, Swatches, Character,
|
||||
Paragraph; the rest open as in-app floating windows.
|
||||
|
||||
| Behaviour | Status | Evidence |
|
||||
|---|---|---|
|
||||
| Panel groups float and tear off into OS windows | missing | UI-217-5, #1828, #1213 |
|
||||
| Drag panels to reorder and regroup | partial | #2272, #2305 |
|
||||
| Docked resize pushes the neighbour | partial | #2573 |
|
||||
| Color panel wheel and RGB/HSB/CMYK/Lab sliders | missing | UI-217-17, #2569 |
|
||||
| Window size and dock width remembered | done | UI-217-2 |
|
||||
| Command palette with recents | done | UI-217-7 |
|
||||
| Every preference takes effect | partial | 46 of 149 do nothing (scorecard) |
|
||||
| UI scale presets | missing | UI-217-9, #2492 |
|
||||
| Themes: Photoshop's four greys | partial | five themes; #2661 |
|
||||
| Document tabs: overflow, context menu, reorder | done | UI-217-6; middle-click close #2570 |
|
||||
| Layers panel: wheel steps blend modes, drop on New/Trash | partial | UI-217-14 |
|
||||
|
||||
## Revision history
|
||||
|
||||
| Date | Change | Summary |
|
||||
|---|---|---|
|
||||
| 2026-10-10 | major | First version, from a source audit against Photoshop 2026 27.11.0's shortcuts file and the open issues |
|
||||
@@ -1,5 +1,5 @@
|
||||
# Scorecard checklist: automation (#219). The command count and the menu wiring number come from
|
||||
# docs/parity.md.
|
||||
# docs/parity-checklist.md.
|
||||
# Statuses must be true on main. Verified against 4b53f62 on 2026-10-05.
|
||||
area = "automation"
|
||||
title = "Automation"
|
||||
@@ -9,7 +9,7 @@ order = 6
|
||||
id = "AUTO-1"
|
||||
target = "Every menu item dispatches a command id (UI, CLI, control channel and MCP share them)"
|
||||
status = "done"
|
||||
note = "docs/parity.md: all menu items live; menus.rs is_live"
|
||||
note = "docs/parity-checklist.md: all menu items live; menus.rs is_live"
|
||||
|
||||
[[item]]
|
||||
id = "AUTO-219-1"
|
||||
|
||||
+2
-2
@@ -35,7 +35,7 @@ commands:
|
||||
--pixls (or -p raw) also fetches corpus/pixls and runs the raw corpus tests;
|
||||
--local takes corpus/photoshop from the photocraft-corpus authoring clone
|
||||
stats [--exact] count tests and lines per crate (--exact: ask the test harness via `-- --list`)
|
||||
parity Photoshop menu parity; rewrites docs/parity.md
|
||||
parity Photoshop menu parity; rewrites docs/parity-checklist.md
|
||||
i18n-coverage report stable UI translation coverage for registered languages
|
||||
perf [--quick] [--update-baseline] [--threshold PCT] [--bench NAME]... [--skip-build] [--reuse]
|
||||
run the release benches, merge them by scenario id into target/perf/results.json,
|
||||
@@ -182,7 +182,7 @@ fn cmd_wasm() -> Result<(), String> {
|
||||
|
||||
fn cmd_parity() -> Result<(), String> {
|
||||
let mut c = cargo();
|
||||
c.args(["run", "-q", "-p", "photocraft-ui-egui", "--example", "parity", "--", "--write", "docs/parity.md"]);
|
||||
c.args(["run", "-q", "-p", "photocraft-ui-egui", "--example", "parity", "--", "--write", "docs/parity-checklist.md"]);
|
||||
run(c, "cargo run -p photocraft-ui-egui --example parity")
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
//! - `crates/io/tests/corpus.rs`: the corpus floors (`Source { .. }` constants).
|
||||
//! - `scorecard/*.toml`: per-area checklists (id, target, status, issue, note).
|
||||
//! - the prefs audit: `Preferences` fields that no code outside `prefs.rs` / `prefs_ui.rs` reads.
|
||||
//! - counted from the tree: never-crash attribute coverage, `docs/parity.md`'s live count.
|
||||
//! - counted from the tree: never-crash attribute coverage, `docs/parity-checklist.md`'s live count.
|
||||
//!
|
||||
//! `--check` fails when `docs/scorecard.md` differs from what would be generated.
|
||||
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
|
||||
@@ -432,9 +432,9 @@ fn never_crash(root: &Path) -> (usize, Vec<String>) {
|
||||
(roots.len(), missing)
|
||||
}
|
||||
|
||||
/// `**626 of 626 menu items live (100.0%).**` from `docs/parity.md`.
|
||||
/// `**626 of 626 menu items live (100.0%).**` from `docs/parity-checklist.md`.
|
||||
fn parity_line(root: &Path) -> Option<String> {
|
||||
let s = std::fs::read_to_string(root.join("docs/parity.md")).ok()?;
|
||||
let s = std::fs::read_to_string(root.join("docs/parity-checklist.md")).ok()?;
|
||||
s.lines().find(|l| l.contains("menu items live")).map(|l| l.trim().trim_matches('*').trim_end_matches('.').to_string())
|
||||
}
|
||||
|
||||
@@ -610,7 +610,7 @@ It is a heuristic lower bound: a generic name can look read when it isn't.\n\n"
|
||||
}
|
||||
"automation" => {
|
||||
if let Some(p) = &inp.parity {
|
||||
s.push_str(&format!("Menu wiring (`docs/parity.md`): {p}. This counts dispatch, not behaviour.\n\n"));
|
||||
s.push_str(&format!("Menu wiring (`docs/parity-checklist.md`): {p}. This counts dispatch, not behaviour.\n\n"));
|
||||
}
|
||||
}
|
||||
"reliability" => {
|
||||
|
||||
Reference in new issue
Block a user