mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-01 22:07:28 -06:00
A Displace applied to a smart object is recorded as a smart filter and rendered by apply_smart_filters -> filters::apply_filter_to_surface, both when it is added and on every later re-render (replace contents, toggling a filter, transforms). That path built FilterParams with params_for alone, which leaves Displace's map as None; only run_filter resolved `mapPath` (through filters_ext::resolve, which needs the session). With no map, algo's displace returns the source unchanged, so the smart filter was a silent no-op. apply_filter_to_surface now resolves `mapPath` through the same file read and import the direct command uses (filters_ext::map_from_path, shared by resolve and the new session-free resolve_map_path). A map that can no longer be read on re-render leaves the pixels alone, as for an unknown filter; the command still refuses an unreadable map when the filter is added. `mapDocument` needs the session and stays unresolved on re-render. Regression test: smart_cmds::tests:: displace_smart_filter_reads_its_map_path_on_re_render (8/16/32-bit). Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>