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 incorrectlyRMS/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 ofwrite_to_file()for EXIF metadata to enable cross-platform support. - IO: Remove platform-specific
#[cfg]guards frombuild_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.rsinto modular components (film_list, technical, simple). - UI: Split
app.rsinto modular components (io, state, update). - GPU: Split
gpu_pipelines.rsinto 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::ImageOutputFormatAPI 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
FilmStockwith 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]/4weighted 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 toSpectrumarithmetic 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
Spectrumstruct to removeCopytrait, forcing explicit data flow and improving performance by avoiding expensive implicit copies. - Core: Improved numerical stability in
new_blackbodyandintegrate_productfunctions withinspectral.rs, ensuring physical consistency and preventing potential overflows. - Core: Replaced implicit amplitude scaling with
new_gaussian_normalizedto 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
rayonandwasm-bindgen-rayonfor significantly improved performance on the web. - WASM: Added dedicated
ComputeBridgeand Web Worker infrastructure to handle heavy computations off the main UI thread. - WASM: Integrated
console_logfor unified logging in the browser console.
🐛 Fixes
- WASM: Fixed
hist_rgbserialization issue by implementingserde-big-arraywrapper, ensuring correct histogram data transfer between worker and UI. - WASM: Resolved "Parking not supported" panic by enabling
parking_lot/nightlyandwasm-bindgen-rayon/no-bundlerfeatures. - WASM: Fixed
worker.jsmodule loading errors by patching import paths and removing problematicmodulepreloadlinks. - CI: Fixed GitHub Actions workflow for WASM builds by switching to
nightlytoolchain and addingrust-srccomponent (required forbuild-stdand atomics). - Scripts: Enhanced
patch_dist.pyrobustness 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
FilmStockstruct to embedmanufacturerandnamefields directly, simplifying thepresetsmodule and removing redundant tuple wrappers. - Core: Optimized
FilmStockusage 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
warmthandsaturationparameters 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
FilmStockstruct to embedmanufacturerandnamefields directly, removing the need for external name management. Updatedget_all_stocksto returnVec<FilmStock>instead of tuples.
0.4.0 - 2026-01-29
v0.4.0
Jan 29 2026 at 06:59 UTC
⚠ Breaking Changes
- Core: Refactored
ReciprocityFailuremodel to be a struct withbetaparameter, removing thedescriptionfield. This restoresCopytrait forFilmStock. - 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
tracingcrate, replacingprintln!debugging. - Docs: Established
mdBookknowledge base structure indocs/. - Docs: Added comprehensive Rustdoc documentation to public API (
FilmStock,PipelineStage, etc.).
⚡️ Performance
- Bench: Added
criterionbenchmarks 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.