filmr

Releases

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');