- Move phone/video rotation metadata handling into readers with an internal clip compatibility mode for legacy projects. FFmpegReader now reports oriented dimensions, applies orientation to decoded frames, and preserves old JSON behavior through reader_orientation_mode.
- Also adjust tracker/object-detection stroke width for preview raster scaling so tracked boxes remain visible during clip scale animations.
- Fix Neon/Soft/Clean fill alphas — were far too low, colors appeared nearly invisible on dark backgrounds
- Fix Neon glow on waveform — double-reduced alpha and too-narrow spread made it invisible
- Fix Rainbow mode on waveform/filled waveform — now sweeps hue horizontally via QLinearGradient, no per-segment loop
- Line waveform now follows true ±signal instead of magnitude envelope; remove unused bottom_edge
- Remove Retro style — too visually similar to Clean to justify
- Minimal style is now fully opaque (fill alpha 1.0)
- Clip waveform shortcut defaults to Minimal style + Filled Waveform
Added tests:
- location_x/y = -1/+1 offscreen behavior for all scale enums and multiple scale_x/y combinations.
- all 9 gravity anchors when location_x/y = 0, including sub-100% and non-uniform scale.
- Crop-specific intermediate location behavior so the original bug stays covered.
- Add AudioVisualization effect with waveform, bars, radial, spectrum, particles, VU, and related modes
- Add styling, color spread/rainbow, channel layout, frequency, glow, detail, and background controls
- Wire Clip::waveform to use the new effect and add waveform_mode
- Register the effect and add focused unit coverage for rendering, JSON, and clip properties
- Right after edits (ApplyJsonDiff), rendering temporarily switches to safe
composition to prevent frame mutation/bleed.
- After that short window drains, it automatically returns to fast playback mode.
- Clip updates via ApplyJsonDiff now also clear clip cache (not just timeline/reader ranges).
- Added regressions for cache invalidation + no cached-frame mutation; kept paused preroll/cache-bar behavior intact.
- Added optional Mask Mode overrides for Blur, Saturation, Brightness, Hue, Pixelate, and Sharpen (Limit to Mask, Vary Strength).
- Kept unified mask property naming (mask_reader) with legacy JSON compatibility where needed.
- Added/updated unit tests for base mask behavior, per-effect mode behavior, and JSON round-trips.
- Fixed profile tests to write generated files into the build/test directory instead of the source examples/ folder.