mirror of
https://github.com/storytold/effectcraft.git
synced 2026-11-07 02:51:24 +00:00
* Color Stabilizer: sample the reference where the points were at the reference time (#3125) After Effects 2026 samples the reference frame at the positions the Black / Mid / White Points had at the reference time. With keyframed points it therefore corrects even a static picture: our importer sample (colstab-43-keys, Levels, Black Point (64, 90) -> (151, 99) over 1 s) renders at 0.5 s as the Levels map out = a + b*v of the ramp with b 1.2935..1.2965 and a -0.2365..-0.2350, which is the Black Point's current sample (107.5, 94.5) sent to the reference sample at (64, 90). EffectCraft sampled both frames at the current points, so the card stayed unchanged (slope 1). The samples now read the points at the reference time through the host (params_at), falling back to the current points without one. CPU and GPU share the sampler (color_stabilizer_maps). Sample Size's unit is not pinned by the samples (every size 1..40 leaves the card unchanged in After Effects; that only bounds the sampled area) and is left as it is. Part of #3125 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Linear Wipe: After Effects' edge position and feather profile (#3125) Measured on our importer samples (linwipe-*, 2026-11-05, After Effects 2026, 320 x 180): - The edge sits at lo + completion * (hi - lo) whatever the feather (the set-all render's 50 % line is at -5.25, predicted -5.266); 0 % keeps the layer and 100 % clears it even with Feather 32000. EffectCraft extended the travel by the feather, 13 px off at Feather 16. - The feathered edge is the hard matte blurred with the layer's edges repeated: three box passes of radius 6 per axis fit Feather 16 (sigma 6.35..6.6, taken as Feather / 2.5), including the extra opacity where the edge meets the layer's left side. EffectCraft drew a linear ramp Feather px wide. - Without feather the edge pixel is anti-aliased (143/255; coverage gives 0.6). EffectCraft drew a hard step. set-all alpha: before max 195, 4646 px (8.1 %) off by more than 2/255; after max 15, 529 px (0.9 %), all along the layer's left side (at most 2 elsewhere). Feather 0 renders: max 112 -> 10 on the edge column. CPU: coverage matte, raster::gaussian_blur (3 box passes, edges repeated); GPU: the same matte from gen_linear_wipe (new modes), its gaussian_blur, then a multiply, so both match. Sigma is capped at twice the layer's longer side; NaN values leave the layer as it is. Projects saved before keep the old ramp: a hidden legacyFeather parameter that migrate::legacy_default sets on upgrade (as for Ripple and Block Dissolve). Part of #3125 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Linear Wipe on the GPU: 100 % clears the layer before the angle is read A NaN angle left the layer unchanged on the GPU while the CPU cleared it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>