// ZPHOTO — PHOTOSHOP + ILLUSTRATOR PORT REPORT

One Rust engine (zphoto-core) · raster editor (Photoshop/GIMP port) + vector mode (Illustrator port) · vectors render into the same raster layer stack · source-derived at ed64c3919e

>_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.

~367
Raster Commands
32
Vector Commands
477
Tests Passing
8 / 16 / 32
Bit Depth (f32 core)
295
Photoshop Features ✅
46
Illustrator Features ✅
7,009
Vector Engine LOC
17
Raster Command Groups

Photoshop port — PORT_CHECKLIST.md (302 features)

295 ✅ · 3 🚧 · 4 ⬜ — 97.7%

Illustrator port — VECTOR_CHECKLIST.md (66 features)

46 ✅ · 5 🚧 · 15 ⬜ — 69.7% done / 77.3% incl. partial

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 ⬜.

GroupCmdsArea
filter.*120Blur / sharpen / noise / distort / stylize neighbourhood filters
layer.*64Layers, masks, blend modes, smart objects, groups, layer styles
op.*59Point ops — curves, levels, hue/sat, exposure, adjustments
image.*31New/open/save, mode & bit-depth convert, resize, crop, transform
select.*26Marquee, lasso, magic wand, refine, feather, grow/shrink
paint.*20Brush, pencil, eraser, clone, smudge, dodge/burn, gradient
fill.*10Bucket, pattern, gradient, content-aware, fill layers
action.*7Actions panel — record / replay macros
path.*5Pen paths, path ↔ selection, stroke path
channel / comp / brush / sampler / note / edit / pattern / project29Spot channels, layer comps, brush presets, colour samplers, notes, fade, define pattern, native save/load
17 groups~367Raster 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.

AreaStatusWhat's implemented
Document / artboardsNew, layers, multiple artboards + per-artboard render (vec.artboard.add)
DrawingRect/round-rect, ellipse, polygon, star, line, pen (Bézier), pencil, compound paths
FillSolid, non-zero/even-odd, linear/radial gradients, pattern swatches
StrokeWidth/colour, caps, dashes, gradient stroke, arrowheads · miter/bevel join round-approx (🚧)
Transform / arrangeMove/scale/rotate/shear/matrix, reflect, group/ungroup, z-order, align/distribute
PathfinderUnite / Intersect / Minus / Exclude, Outline Stroke, Offset Path
TypePoint type, type-on-path, Create Outlines · area type ⬜, rotation/shear 🚧
Masks / blendClipping mask, opacity mask, 45 per-object blend modes
File I/OSVG import + export (full round-trip), raster export, Image Trace
66 features46 ✅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.