filmr

Releases

0.10.0 - 2026-04-27

v0.10.0 Apr 27 2026 at 13:54 UTC

✨ Features

  • Depth of Field: mipmap-based variable radius blur driven by depth map
  • Petzval Swirly Bokeh: tangential stretch on out-of-focus areas
  • Rotational Blur: camera rotation around optical axis simulation
  • Grain rewrite: moved to output linear space with physical Selwyn law (σ ∝ √(1-lum) × lum)
  • Preview downscaled to 1024px for fast interactive processing

🐛 Fixes

  • Enable depth feature in release builds (was missing from cargo-dist)
  • Prevent worker thread death on panic (catch_unwind + fallback result)
  • Fix depth map coordinate mapping (was using pixel coords instead of scaling)
  • Remove musl target from dist (ort doesn't provide musl prebuilts)
  • Configure Trunk to exclude depth for WASM builds

0.9.1 - 2026-04-17

v0.9.1 Apr 17 2026 at 08:45 UTC

✨ Features

  • Auto Levels: scanner-style black/white point stretch (opt-in checkbox in UI)

🐛 Fixes

  • Fix BW films rendering as flat gray in Accurate mode (R/B channels were zero from single-emulsion spectral engine)
  • Fix Polaroid B&W 667 all-white output (exposure_offset was 0.00)
  • Detect BW films by monochrome flag instead of FilmType::BwNegative (fixes Agfa Scala 200)
  • Reorder Accurate pipeline: lens effects (ChromaticAberration, MTF, etc.) now run before develop
  • BW grayscale merge uses film's spectral response weights via bw_weights()

0.9.0 - 2026-04-17

v0.9.0 Apr 16 2026 at 17:34 UTC

✨ Features

  • Depth-aware object motion: monocular depth estimation (Depth Anything V2 Small) drives per-object motion blur.
    • Connected region segmentation by depth similarity — each object moves coherently.
    • Near objects get more motion blur, far objects stay sharp.
    • UI: Object Motion slider + depth map preview.
  • process_image_with_depth() API for passing depth maps through the pipeline.

🐛 Fixes

  • Fix exposure calibration: simulate_gray now uses same output model as create_output_image (density linear + tone_gamma=2.47).
  • Fix ObjectMotionStage missing from Accurate pipeline.

0.8.1 - 2026-04-16

v0.8.1 Apr 16 2026 at 09:52 UTC

🐛 Fixes

  • Fix highlight clipping: remove redundant shoulder_softening (sigmoid H-D curve provides natural shoulder).
  • Unified output model: density linear mapping + tone gamma=2.47 for both Fast and Accurate modes.
  • Norm target raised 0.18→0.32 to compensate scatter/WB losses in Accurate pipeline.

🔧 Improvements

  • Physically correct d_min per channel for C-41 color negative films (orange mask residual).
    • Kodak: R=0.14, G=0.16, B=0.19. Fuji: R=0.13, G=0.15, B=0.17.
    • Shadow color cast now emerges naturally from physics.

0.8.0 - 2026-04-15

v0.8.0 Apr 15 2026 at 08:19 UTC

✨ Features

  • Vignetting: cos⁴ lens falloff model in output space (~25% corner darkening).
  • Micro motion blur: multi-frequency hand tremor simulation with Brownian trajectory.
    • UI: Motion Blur slider, seed control, trajectory + dwell weight visualization.
  • Radial MTF: center-sharp, edge-soft blur (replaces uniform MTF).
  • Chromatic aberration: R/B channel radial scaling for edge RGB fringing.
  • Film stock analyzer: PSD shape, isotropy, signal dependency, film detection scoring.
    • Parallelized with rayon, xtask runs in release mode.

🐛 Fixes

  • Self-calibrating exposure norm via binary search (consistent brightness across presets).

0.7.3 - 2026-04-14

v0.7.3 Apr 14 2026 at 08:17 UTC

✨ Features

  • Full-spectrum dye transmittance output (Yellow/Magenta/Cyan dye spectra × D65 → CIE XYZ → sRGB).
  • Self-calibrating exposure norm via binary search (consistent brightness across all presets).
  • Film stock analyzer tool (cargo xtask analyze <image>).
  • Lucky Color 200 and Ricoh GR Street Night presets.

🐛 Fixes

  • Fix negative film inversion in spectral dye output path.
  • Fix grain model: Selwyn √D theory, color_correlation 0.93.
  • Rewrite grain as physically-based texture field (multiplicative, per-layer, spatially correlated).

📝 Documentation

  • Rendering Pipeline chapter with LaTeX formulas in mdBook.

0.7.2 - 2026-04-13

v0.7.2 Apr 13 2026 at 06:51 UTC

✨ Features

  • Default SimulationMode to Accurate (full-spectrum for all paths).

🐛 Fixes

  • Fix inhibition darkening neutral gray (use density deviation, not absolute).
  • Fix per-channel norm to match Fast mode channel balance exactly.

✅ Tests

  • Add strict inhibition behavior tests (neutral unaffected, color separation, mean preserved).
  • Replace external photo tests with synthetic scene histogram comparison.

0.7.1 - 2026-04-13

v0.7.1 Apr 12 2026 at 18:59 UTC

⚡ Performance

  • Optimize Accurate mode ~10x via precomputed layer coefficients (eliminates per-pixel exp() calls).

✨ Features

  • Add xtask for bump, ci, publish, release automation.
  • Add criterion benchmark for Fast vs Accurate mode comparison.

📝 Documentation

  • Add Full-Spectrum Engine chapter to mdBook.

0.7.0 - 2026-04-12

v0.7.0 Apr 12 2026 at 14:13 UTC

✨ Features

  • Spectral: Add CIE 1931 XYZ colour matching functions and D65 illuminant lookup tables (380–780nm, 5nm, 81 bins).
  • Spectral: Replace blackbody approximation for D65 with CIE standard data.
  • Spectral: Replace Gaussian camera sensitivities with CIE XYZ CMF × XYZ→sRGB matrix.
  • Film Layer: Add multi-layer film structure model (FilmLayerStack / FilmLayer) with refractive index, thickness, spectral absorption, and scattering coefficients.
  • Spectral Engine: Add full-spectrum propagation engine — per-wavelength per-layer light transport with Beer-Lambert absorption, Fresnel interface reflection, and forward+backward (halation) passes.
  • Core: Add SimulationMode::Fast / Accurate — Fast uses existing 3×3 matrix path, Accurate uses full-spectrum engine.
  • Film: Add layer_stack: Option<FilmLayerStack> to FilmStock for custom per-preset layer structures.
  • UI: Develop button triggers Accurate mode (full-spectrum); preview stays Fast (matrix).
  • Spectral: Add scattering spatial diffusion — Gaussian blur derived from physical layer scatter coefficients.
  • Spectral: Add interlayer interimage effect (DIR coupler developer inhibition matrix).
  • Presets: Calibrated layer stacks for Kodak Portra 400, Kodak Tri-X 400, Fujifilm Velvia 50.

0.6.8 - 2026-02-12

v0.6.8 Feb 12 2026 at 07:31 UTC

✨ Features

  • Film: Add FilmStyle system for systematic rendering style modifiers (Accurate, Artistic, Vintage, HighContrast, Pastel).
  • Presets: Add artistic variants for popular films (Portra 400, Tri-X 400, Velvia 50, HP5 Plus 400).
  • UI: Add FilmStyle selector to both Simple and Professional modes with horizontal button layout.
  • UI: Trigger automatic reprocessing when switching between Simple and Professional modes.

🐛 Fixes

  • Presets: Fix grain alpha values using correct formula (RMS/1000)² for all 51 films (was incorrectly RMS/1000).
  • Presets: Restore original curve parameters for Portra 400, Tri-X 400, HP5 Plus, and Velvia 50.
  • Grain: Add visual grain boost factor (25x) to compensate for display/perception differences - grain was physically correct but visually too weak.
  • UI: Load preset values on image load to fix initial grain intensity issue (first load showed extreme grain).

💄 Style

  • UI: Move Rendering Style to separate section with consistent grouping.
  • UI: Change FilmStyle selector from dropdown to horizontal buttons for better UX.
  • UI: Force white balance Off in Simple mode during processing.

♻️ Refactor

  • Film: Add helper methods to FilmStyle enum (all(), name(), description(), short_description()) for cleaner UI code.

🙈 Chore

  • Git: Add .DS_Store to .gitignore.

📄 Documentation

  • README: Update snapshot image.

0.6.7 - 2026-02-11

v0.6.7 Feb 11 2026 at 14:18 UTC

♻️ Refactor

  • IO: Separate EXIF metadata building from file I/O operations.
  • IO: Unify image encoding and EXIF writing to memory (Vec<u8>) before file output.
  • IO: Use write_to_vec() instead of write_to_file() for EXIF metadata to enable cross-platform support.
  • IO: Remove platform-specific #[cfg] guards from build_exif_metadata() - now works on both desktop and WASM.
  • IO: Consolidate file I/O to single point: std::fs::write() for desktop, handle.write() for WASM.
  • UI: Split controls.rs into modular components (film_list, technical, simple).
  • UI: Split app.rs into modular components (io, state, update).
  • GPU: Split gpu_pipelines.rs into modular pipeline stages.
  • Presets: Split into manufacturer-specific modules (kodak, fujifilm, ilford, vintage).
  • App: Extract EXIF orientation utils to shared module.

💄 Style

  • UI: Update window size to 1200x800 and rename title.

🔧 Fixes

  • Presets: Fix imports after module refactoring.
  • Presets: Fix get_stocks() function calls in all preset modules.
  • Examples: Update preset function names after module split.

0.6.6 - 2026-02-07

v0.6.6 Feb 6 2026 at 19:51 UTC

✨ Features

  • Controls: Improve film stock list row interaction with full row hover/click highlighting, better padding, and rounded thumbnail corners in Simple mode.

0.6.5 - 2026-02-07

v0.6.5 Feb 6 2026 at 18:25 UTC

✨ Features

  • App: Preserve original EXIF metadata when saving images and add Filmr processing info (Software, ImageDescription, Copyright tags).

0.6.4 - 2026-02-07

v0.6.4 Feb 6 2026 at 17:42 UTC

✨ Features

  • App: Improve save dialog with source-based default filename ({source}_FILMR.jpg) and JPEG as default format.

🐛 Fixes

  • App: Fix image::ImageOutputFormat API change for image crate 0.25 compatibility.

0.6.2 - 2026-02-06

v0.6.2 Feb 6 2026 at 15:02 UTC

🐛 Fixes

  • Controls: Fix gamma boost (contrast) not applied to preset thumbnails. Thumbnail worker now receives the modified FilmStock with gamma boost instead of using the original preset.

0.6.1 - 2026-02-06

v0.6.1 Feb 6 2026 at 14:45 UTC

✨ Features

  • Settings: Add optional histogram smoothing toggle (3-tap [1,2,1]/4 weighted average) to reduce visual jitter in shadow regions.

0.6.0 - 2026-02-06

v0.6.0 Feb 6 2026 at 11:58 UTC

♻️ Refactoring

  • Core: Extracted spectral matrix computation into FilmStock::compute_spectral_matrix(), eliminating duplicated spectral integration logic across pipeline and processor modules.

⚡️ Performance

  • Spectral: Added SIMD (f32x4) optimization to Spectrum arithmetic operators (Add, Mul), reducing per-operation cost for spectral calculations.

✨ Features

  • GPU: Enhanced develop shader with spectral/color dual matrix pipeline, shoulder softening compression, and logistic sigmoid H-D curve (replacing erf approximation) for better CPU/GPU consistency.
  • Grain: Switched grain shader shadow noise model from inverse-distance to exponential decay (exp(-2D)), providing smoother shadow-to-midtone grain transitions.

🐛 Fixes

  • Metrics: Fixed PSD slope calculation to use correct row-then-column 2D FFT instead of flattened 1D FFT.

0.5.9 - 2026-02-04

v0.5.9 Feb 4 2026 at 14:53 UTC

♻️ Refactoring

  • Core: Refactored Spectrum struct to remove Copy trait, forcing explicit data flow and improving performance by avoiding expensive implicit copies.
  • Core: Improved numerical stability in new_blackbody and integrate_product functions within spectral.rs, ensuring physical consistency and preventing potential overflows.
  • Core: Replaced implicit amplitude scaling with new_gaussian_normalized to guarantee energy conservation in spectral modeling regardless of bandwidth.

✨ Features

  • Grain: Implemented resolution-dependent grain scaling. Grain blur radius and noise amplitude now scale automatically with image resolution (reference 2K), ensuring consistent visual graininess across different image sizes.

0.5.2 - 2026-02-02

v0.5.2 Feb 2 2026 at 16:30 UTC

🚀 Features

  • WASM: Implemented multi-threaded image processing using rayon and wasm-bindgen-rayon for significantly improved performance on the web.
  • WASM: Added dedicated ComputeBridge and Web Worker infrastructure to handle heavy computations off the main UI thread.
  • WASM: Integrated console_log for unified logging in the browser console.

🐛 Fixes

  • WASM: Fixed hist_rgb serialization issue by implementing serde-big-array wrapper, ensuring correct histogram data transfer between worker and UI.
  • WASM: Resolved "Parking not supported" panic by enabling parking_lot/nightly and wasm-bindgen-rayon/no-bundler features.
  • WASM: Fixed worker.js module loading errors by patching import paths and removing problematic modulepreload links.
  • CI: Fixed GitHub Actions workflow for WASM builds by switching to nightly toolchain and adding rust-src component (required for build-std and atomics).
  • Scripts: Enhanced patch_dist.py robustness with better regex matching and environment variable support.

0.5.1 - 2026-01-30

v0.5.1 Jan 30 2026 at 14:27 UTC

🚀 Features

  • UI: Added "Save" and "Back" buttons in Studio Mode for improved workflow.
  • UI: Optimized main layout by removing the top panel and relocating the settings button for a cleaner interface.
  • UI: Improved positioning of the UX mode toggle.

🐛 Fixes

  • Metrics: Fixed logic for retrieving and displaying film metrics.

♻️ Refactoring

  • Core: Refactored FilmStock struct to embed manufacturer and name fields directly, simplifying the presets module and removing redundant tuple wrappers.
  • Core: Optimized FilmStock usage to prefer references and moves over cloning, improving performance and reducing unnecessary allocations.

0.5.0 - 2026-01-30

v0.5.0 Jan 30 2026 at 08:37 UTC

🚀 Features

  • UI: Introduced Simple and Professional UX modes. Simple mode focuses on quick adjustments (Brightness, Contrast, Warmth, Intensity), while Professional mode offers full physics-based control.
  • UI: Added Split-Screen Comparison view in the central panel for side-by-side before/after comparison.
  • UI: Implemented async Preset Thumbnails in the controls panel for visual preview of film stocks.
  • Processor: Added warmth and saturation parameters to the simulation engine.
  • UI: Added persistency for UX mode preference in config.json.
  • UI: Optimized top bar layout with direct mode toggles.

🐛 Fixes

  • Metrics: Fixed incorrect metrics display logic and optimized metrics panel visibility for different modes.
  • UI: Fixed control panel layout issues and improved visual hierarchy with better spacing and grouping.

⚠ Breaking Changes

  • Core: Refactored FilmStock struct to embed manufacturer and name fields directly, removing the need for external name management. Updated get_all_stocks to return Vec<FilmStock> instead of tuples.

0.4.0 - 2026-01-29

v0.4.0 Jan 29 2026 at 06:59 UTC

⚠ Breaking Changes

  • Core: Refactored ReciprocityFailure model to be a struct with beta parameter, removing the description field. This restores Copy trait for FilmStock.
  • Core: Removed references to internal documentation IDs ("tec n") from public API comments.

🚀 Features

  • Core: Added standard color negative spectral response model (new_color_negative_standard).
  • Ops: Implemented structured logging with tracing crate, replacing println! debugging.
  • Docs: Established mdBook knowledge base structure in docs/.
  • Docs: Added comprehensive Rustdoc documentation to public API (FilmStock, PipelineStage, etc.).

⚡️ Performance

  • Bench: Added criterion benchmarks for image processing (1080p).

🐛 Fixes

  • Tests: Resolved Clippy warnings and unused variables in test suites.

v0.3.11

v0.3.11 Jan 28 2026 at 12:11 UTC

v0.3.10

v0.3.10 Jan 28 2026 at 12:11 UTC

0.3.9 - 2026-01-27

v0.3.9 Jan 27 2026 at 14:48 UTC

⚡️ Performance

  • UI: Offloaded image decoding, analysis, and resize operations to a background worker thread to prevent UI blocking during file load.
window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date());gtag('config', 'G-ZCH0DFY43H');