mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-25 10:27:07 -06:00
* photocraft-plugins: sandboxed WebAssembly filter plug-ins (wasmi host, ABI v1) A new L4 crate runs plug-ins in wasmi (pure Rust, MIT/Apache) with no host imports, a fuel budget metered in slices with a wall-clock deadline, a memory cap, a recursion cap and wasmi's strict module limits. Every band gets a fresh instance; traps, budgets, bad manifests and bad pointers are all Errors. Pixels go over as interleaved normalised f32 in tile-aligned bands, in parallel on native, blended by the selection. Includes the example Invert plug-in (no_std Rust, examples/plugins/invert-rs) built into a test fixture, hostile-module tests, and docs/plugins.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Engine: plugin.* commands (install, list, run, remove, reload) plugin.run filters the active pixel layer, a targeted channel or a smart object (recorded as a smart filter) as one undo step; Preferences > Plug-ins gains Use Additional Plug-ins Folder, loaded when prefs apply. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * UI: Filter > Plug-ins lists installed plug-ins with generated dialogs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Plug-ins: bands never outgrow the memory cap; regenerate parity Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Bench: example plug-in Invert vs built-in Invert on 24 MP Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
28 lines
1.0 KiB
Markdown
28 lines
1.0 KiB
Markdown
# Invert: an example PhotoCraft plug-in
|
||
|
||
A complete WebAssembly filter plug-in in about 70 lines of `no_std` Rust: no allocator, no imports,
|
||
under 1 KiB built. It inverts the colour channels and leaves alpha alone, matching
|
||
Image › Adjustments › Invert. The ABI is documented in [`docs/plugins.md`](../../../docs/plugins.md).
|
||
|
||
## Build
|
||
|
||
```sh
|
||
rustup target add wasm32-unknown-unknown
|
||
./build.sh
|
||
```
|
||
|
||
`build.sh` runs `cargo build --release --target wasm32-unknown-unknown` and copies the module to
|
||
`crates/plugins/tests/fixtures/invert.wasm`, the test fixture the host's tests use. This crate is not
|
||
a member of the PhotoCraft workspace.
|
||
|
||
## Install
|
||
|
||
```sh
|
||
# Into a running app (control channel) or the CLI, as a command:
|
||
plugin.install {"path": "examples/plugins/invert-rs/target/wasm32-unknown-unknown/release/photocraft_plugin_invert.wasm"}
|
||
plugin.run {"id": "org.photocraft.example.invert"}
|
||
```
|
||
|
||
Or copy the `.wasm` into the folder set in Edit › Preferences › Plug-ins (with *Use Additional
|
||
Plug-ins Folder* on); it then appears under Filter › Plug-ins.
|