>_EXECUTIVE SUMMARY
zphoto is a single Rust engine that ports two Adobe products into one command surface. The raster side is a Photoshop / GIMP port — layers, masks, blend modes, smart objects, ~367 commands across 17 groups, with an 8/16/32-bit (f32 working-space) pixel pipeline. The vector side is an Adobe Illustrator port — Bézier paths, gradients, patterns, Pathfinder, type, masks and SVG round-trip, exposed through 32 vec.* commands — that rasterizes into the raster layer stack, so layer opacity, blend modes, masks, filters and PSD save all apply to vector artwork for free. Every number below is grepped from source, not estimated.
Photoshop port — PORT_CHECKLIST.md (302 features)
Illustrator port — VECTOR_CHECKLIST.md (66 features)
01RASTER ENGINE — PHOTOSHOP / GIMP PORT
Unique group.verb dispatch arms grepped from zphoto-core/src/lib.rs. The feature matrix in PORT_CHECKLIST.md stands at 295 ✅ / 3 🚧 / 4 ⬜.
| Group | Cmds | Area |
|---|---|---|
| filter.* | 120 | Blur / sharpen / noise / distort / stylize neighbourhood filters |
| layer.* | 64 | Layers, masks, blend modes, smart objects, groups, layer styles |
| op.* | 59 | Point ops — curves, levels, hue/sat, exposure, adjustments |
| image.* | 31 | New/open/save, mode & bit-depth convert, resize, crop, transform |
| select.* | 26 | Marquee, lasso, magic wand, refine, feather, grow/shrink |
| paint.* | 20 | Brush, pencil, eraser, clone, smudge, dodge/burn, gradient |
| fill.* | 10 | Bucket, pattern, gradient, content-aware, fill layers |
| action.* | 7 | Actions panel — record / replay macros |
| path.* | 5 | Pen paths, path ↔ selection, stroke path |
| channel / comp / brush / sampler / note / edit / pattern / project | 29 | Spot channels, layer comps, brush presets, colour samplers, notes, fade, define pattern, native save/load |
| 17 groups | ~367 | Raster command surface (excludes the 32 vec.* below) |
Precision: pixels carry an 8/16/32-bit depth over an f32 working space; image.convert changes depth; 16-bit PSD encode/decode round-trips. Remaining: a few advanced filters / niche adjustments (🚧/⬜); 32-bit PSD currently folds to 16-bit on save; native-project pixels persist at 8-bit (depth tag preserved).
02VECTOR ENGINE — ILLUSTRATOR PORT
32 vec.* commands · src/vector.rs 7,009 LOC · f64 geometry, anti-aliased rasterizer (4× vertical SSAA + analytic horizontal span coverage), non-zero & even-odd fill rules.
| Area | Status | What's implemented |
|---|---|---|
| Document / artboards | ✅ | New, layers, multiple artboards + per-artboard render (vec.artboard.add) |
| Drawing | ✅ | Rect/round-rect, ellipse, polygon, star, line, pen (Bézier), pencil, compound paths |
| Fill | ✅ | Solid, non-zero/even-odd, linear/radial gradients, pattern swatches |
| Stroke | ✅ | Width/colour, caps, dashes, gradient stroke, arrowheads · miter/bevel join round-approx (🚧) |
| Transform / arrange | ✅ | Move/scale/rotate/shear/matrix, reflect, group/ungroup, z-order, align/distribute |
| Pathfinder | ✅ | Unite / Intersect / Minus / Exclude, Outline Stroke, Offset Path |
| Type | ✅ | Point type, type-on-path, Create Outlines · area type ⬜, rotation/shear 🚧 |
| Masks / blend | ✅ | Clipping mask, opacity mask, 45 per-object blend modes |
| File I/O | ✅ | SVG import + export (full round-trip), raster export, Image Trace |
| 66 features | 46 ✅ | 5 🚧 in progress · 15 ⬜ remaining |
03REMAINING — ILLUSTRATOR ROADMAP
The ⬜ / 🚧 items left in VECTOR_CHECKLIST.md.
AI / PDF Import
Open .ai (a PDF container) by parsing content-stream path/fill ops via the zpdf-core engine. The headline remaining "open files" path.
Gradient Mesh
Per-vertex coloured mesh fills — the one gradient mode beyond linear/radial.
Symbols / Instances
Define a reusable symbol once, place many live-linked instances.
Variable-Width Strokes
Width-tool profiles that taper along the path.
Pathfinder Divide / Trim
Split overlapping shapes into all constituent regions (beyond the four shape-mode booleans).
Area Type
Text that wraps inside a shape (point type + type-on-path already ship).
PDF / EPS Export
Vector export beyond SVG.
Effects via Rasterize
Drop shadow / warp / distort by routing rasterized vector output through the raster filter.* surface.
?KEY DESIGN DECISIONS
Why the two ports share one engine.
Vectors Render Into Raster Layers
vec.render rasterizes each vector layer into a raster Layer, so the existing compositor — opacity, 45 blend modes, masks, filters, PSD/project save — applies to vector artwork with zero new code.
One Command Surface
Both engines dispatch through Engine::invoke(cmd, args). Raster is image.* / layer.* / op.* / filter.* / …; vector is vec.*. Hosts (Tauri, JUCE WebView, headless tests) talk to one transport.
f64 Geometry, f32 Pixels
Vector geometry is resolution-independent f64; the raster pipeline computes in an f32 working space and quantizes to the document's 8/16/32-bit grid per command.
Region-Trace Operators
Pathfinder, Offset Path, Outline Stroke, Create Outlines and Image Trace all reuse one mask → boundary-trace pipeline — exact for axis-aligned shapes, supersampled for curves.
SVG as Interchange
SVG export and import round-trip paths, shapes, gradients and text. AI files (PDF containers) route through zpdf-core.
Reused Glyph Rasterizer
Vector type renders through the same bundled-font text module the raster engine uses — no duplicate glyph code, and Create Outlines just traces its output.