paged.image — raster
The raster-image plugin — a Rust/WASM pipeline of GPU kernels with PSD round-trip, dual processing engines, color management, and in-editor ingest into the engine's image scene layer.
In short paged.image is a raster-processing subsystem in Rust/WASM —
GPU-executed adjustment kernels, two processing engines, color management, and
byte-faithful PSD/PSB round-trip ("paged never destroys a PSD"). It's wired into
the editor: place → ingest → GPU adjust → in-frame composite.
What it does
- A library of GPU compute kernels (adjustments, transforms, blurs) with scalar reference twins used only in tests.
- Two engines — a demand-driven streaming pipeline and a persistent tiled buffer.
- PSD/PSB parsing + mutation + preservation-safe round-trip; hybrid color management.
- In-editor ingest: placed-asset bytes → decode → GPU adjust → scene-layer composite → tiles.
How it's built
A Cargo workspace (image-core, image-kernels, image-gpu, image-pipeline,
image-psd, image-cms, image-codecs, image-js) plus a TS bundle. A
registry-driven coverage gate requires every kernel to have a test.
Capability state
● shipped & verified · ◍ shipped, untested · ◐ partial · ✗ failing · · planned
Plugin · image 28 features · 100% green
| Feature | Shell | Image |
|---|---|---|
CMS display lane — qcms RGB↔RGB (the exact build core ships, page/editor agree)image.cms.display | ◐ | |
CMS behind the swappable CmsEngine seam (D-11: hybrid)image.cms.engine | ◐ | |
CMS print lane — moxcms per-intent RGB↔RGB + CMYK8→RGBA8 ingestimage.cms.print | ◐ | |
AVIF / JXL / camera-RAW / HEIC — codec verdicts (deferred + explicit non-goals)image.codec.avif | · | |
EXIF/TIFF read — orientation + DPI + color-space tag, auto-orient at ingestimage.codec.exif | ● | |
Codec adapter contract (ImageSource/ImageTarget over sans-IO ByteSource) + PNG + rawimage.codec.traits | ● | |
Conformance harness — scalar references, gpu↔ref parity, fixture corpusimage.conformance.harness | ◐ | |
Auto-enhance — gray-world WB + percentile auto-levels params from the panel histogramimage.editor.auto-enhance | ● | |
Editor crop + straighten tool — host-agnostic crop machine over the geom.crop windowimage.editor.crop | ● | |
Editor levels/curves/white-balance panel — histogram view + adjust kernelsimage.editor.curves | ◐ | |
K-3 decode worker pool — off-main-thread ingest decode (host.workers consumer)image.editor.decode-pool | ◐ | |
M4 editor enablement — C-5 placed bytes → decode → adjust → C-1 Stage-A in-frame compositeimage.editor.ingest | ◐ | |
C-6 tile provider for placed images (host.images.claimImageResource, v44; honest level-0 subset)image.editor.tile-provider | ◐ | |
Engine B — persistent buffer graph (invalidation, mip-aware eval, Gestures/Operations)image.graph.engine-b | ◐ | |
T0 generated kernel families (arith/relational/boolean/cast/band/minmax/linear)image.kernel.family-t0 | ◐ | |
T1 crown-jewel kernels (conv/resample/compose — handwritten WGSL modules, ABI v1.1)image.kernel.family-t1 | ◐ | |
T2 editor-bearing kernels (adjust/geom/generators)image.kernel.family-t2 | ◐ | |
T3 breadth kernels (morphology, rank/median, distance transform)image.kernel.family-t3 | ◐ | |
Frozen WGSL kernel ABI v1 (4 bind groups, 16×16, mask-mixed pointwise)image.kernel.wgsl-abi | ● | |
Engine A async sinks — to_buffer_async/to_encoder_async (the wasm32/WebGPU readback lane)image.pipeline.async-sink | ● | |
Engine A — demand-driven streaming pipeline skeletonimage.pipeline.engine-a-skeleton | ● | |
paged.image bundle (media.paged.image) — manifest + activate + panelimage.plugin.bundle-manifest | ◐ | |
PSD mutatable — edits re-encode through the preservation writerimage.psd.mutatable | ◐ | |
PSD rendered tier — channel decode + flatten render oracleimage.psd.rendered | ◐ | |
PSD/PSB structural parse + preservation-invariant writerimage.psd.roundtrip | ◐ | |
Reductions — histogram + min/max/mean statisticsimage.reduce.statistics | ◐ | |
Residency Tier 0/1 hardening under working-set pressureimage.residency.tier01 | ● | |
Selection-mask plumbing — the §6.1 mask surfaced end-to-endimage.selection.mask | ● |
Recent activity
- 2026-06-22ci(publish): token-bootstrap first publish (OIDC can't create new packages)fd5cbcb
- 2026-06-22ci(publish): drop sibling-dependent typecheck from publish CIdf7485c
- 2026-06-22build(publish): publish image-manifest + image-glue to npm via OIDCe36c414
- 2026-06-22ci(cla): allowlist the maintainer (drietsch)f973337
- 2026-06-22ci(cla): add CLA Assistant check (sign once, org-wide)5f9cc05
- 2026-06-22chore(license): open plugin-image under AGPL-3.0 OR PMELe0ea4c6
- 2026-06-19fix(crop): move crop tool shortcut off "c" (collides with built-in Scissors)e6818f5
- 2026-06-18feat(image): wire auto-enhance to the editor (Auto button + command) (#1)ca97438
paged.web — HTML/CSS
The web-content plugin — author HTML/CSS as a content type, with a sandboxed preview and on-canvas rendering via a Blitz/WASM lowering to the engine's scene layer.
paged.sheet — spreadsheets
The spreadsheet plugin — a Rust/WASM calc engine with spill, structured tables, charts, and XLSX round-trip, lowered to native print-grade tables and editable in-frame.