Learning in public — this reference is being written in the open. Unfinished pages are excluded from search engines.
paged.IDML Reference
The Paged PlatformPlugins

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.

Tier: IntermediateIntermediateIIexplanation

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

FeatureShellImage
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 ingest
image.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 ingest
image.codec.exif
Codec adapter contract (ImageSource/ImageTarget over sans-IO ByteSource) + PNG + raw
image.codec.traits
Conformance harness — scalar references, gpu↔ref parity, fixture corpus
image.conformance.harness
Auto-enhance — gray-world WB + percentile auto-levels params from the panel histogram
image.editor.auto-enhance
Editor crop + straighten tool — host-agnostic crop machine over the geom.crop window
image.editor.crop
Editor levels/curves/white-balance panel — histogram view + adjust kernels
image.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 composite
image.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 skeleton
image.pipeline.engine-a-skeleton
paged.image bundle (media.paged.image) — manifest + activate + panel
image.plugin.bundle-manifest
PSD mutatable — edits re-encode through the preservation writer
image.psd.mutatable
PSD rendered tier — channel decode + flatten render oracle
image.psd.rendered
PSD/PSB structural parse + preservation-invariant writer
image.psd.roundtrip
Reductions — histogram + min/max/mean statistics
image.reduce.statistics
Residency Tier 0/1 hardening under working-set pressure
image.residency.tier01
Selection-mask plumbing — the §6.1 mask surfaced end-to-end
image.selection.mask

Recent activity

On this page