Commit b702da1
committed
fix(compositor): hand the whole zoom to the box, not a share of it
Fixes the regression in f2c1faa, caught in manual testing: the padding
still constrained the zoom.
That commit capped the box growth by a "focus budget" —
g = min(zoom, cover, zoom * 2*min(c, 1-c)) — meant to keep the source
cut centreable on the focus. But the zoom focus follows the cursor and
is almost never centred, so the third term dominated: focus 0.3 at zoom
1.5 gives 0.9, clamped back to 1.0, i.e. no growth at all. The fix was
inert in the common case. The tests missed it because they swept centred
focuses and focuses pinned exactly on their bound, never an ordinary
off-centre one.
Root cause: that commit refused to TRANSLATE the box (to avoid
re-deriving ease() in regions.rs). Without translation the only lever
left to preserve framing was refusing to grow — so it protected the
framing by giving up the point of the PR.
So translate. The box now takes the whole zoom and the drawn cut goes
back to the bare crop, which is applyZoomTransform's geometry. The box
placement is not a formula to get right: remap_box() carries the new cut
through the old `cut_ref -> base` mapping, so the framing is preserved by
construction — crop, edge clamp and cover are all already baked into the
two cuts. Nothing left to protect, hence nothing to refuse.
Consequences, all of them wanted:
* the box grows by exactly `zoom` for every focus, so the padding is
eaten from the first frame of the ramp;
* src == src_prev now, and the zoom velocity the motion blur reads
lives in dst vs dst_prev instead of in the cut;
* an edge-focused zoom keeps the padding on the side where the image
runs out — there is no content to put there, and the reference shows
background in the same spot.
Tests rewritten around the two things that pull against each other:
handing_the_zoom_to_the_box_moves_no_pixel (no point of the image
shifts) and any_zoom_overflows_the_padding (the box always takes the
zoom). Both sweep off-centre focuses including the [0.0, 1.0] corner;
the second fails on f2c1faa.
cargo test -p openscreen-compositor --lib --tests: 78 + 3 pass.
Verified in the app with a rebuilt addon.1 parent d96aa0a commit b702da1
1 file changed
Lines changed: 152 additions & 169 deletions
0 commit comments