mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-10 02:00:42 -06:00
* psd: .abr brush (v1/v2/v6+) and .grd gradient (v5) parsers and writers Clean-room from public format descriptions: legacy computed/sampled brushes, 8BIM-sectioned samp/patt/desc files, 8/16-bit raw and PackBits tips. Bounded (MAX_EDGE, MAX_TOTAL_BYTES), damaged brushes are skipped with warnings, hostile input returns Err. Adds an abr fuzz target. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * paint: 36 grouped built-in brush presets and new procedural tips General / Dry Media / Wet Media / Special Effects groups (pressure size/opacity variants, airbrush, pencils, charcoal, pastel, crayon, rake, watercolour, ink, oil, foliage, grass, stipple, sparkle, halftone…). Leaf, grass, charcoal, sponge, star and rake tips are generated in code. BrushPreset gains a group. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * io: map .abr brushes onto BrushSettings Tip shape, shape dynamics, scattering, texture (embedded patt patterns), dual brush, colour dynamics, transfer, pose, noise, wet edges, build-up and captured tool options; unmapped settings are reported as warnings. Includes bench_abr (100-brush import, 5000-dab stroke). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * engine: brush.presets.importAbr and gradient.presets.importGrd Path or base64 data, group per file (re-import replaces), unique names next to the built-ins; graceful-failure tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ui: real stylus pressure/tilt, grouped Brushes panel, Import Brushes Pen force from egui Touch events (Windows WM_POINTER via winit), Pointer Events pressure/tilt/twist on the web, tilt via ui.pointer; mouse stays 1.0. .abr/.grd open from File > Open, drag-and-drop, Brushes panel and Preset Manager. Preset previews keyed on a cheap signature instead of the full brush JSON. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
15 lines
456 B
Rust
15 lines
456 B
Rust
//! Fuzz the `.abr` brush parser: any input must return `Ok` or `Err`, never panic, and anything
|
|
//! that parses must keep its samples within the advertised bounds.
|
|
#![no_main]
|
|
|
|
use libfuzzer_sys::fuzz_target;
|
|
use photocraft_psd::abr;
|
|
|
|
fuzz_target!(|data: &[u8]| {
|
|
if let Ok(f) = abr::parse(data) {
|
|
for s in &f.samples {
|
|
assert_eq!(s.data.len(), s.width as usize * s.height as usize * usize::from(s.depth / 8));
|
|
}
|
|
}
|
|
});
|