re: the sweep ramp is DECODED -- four leaf keyframes, and the GPU agrees on sign and magnitude

The port asked for the sweep strips' vertex alpha as a function of position. It
is not a runtime curve to sample: ptloop01/ptloop02's nested leaves declare four
keyframes each, with x, alpha, rotation, scale and time.

  pteff03   loop 600u  x -639 -> 1521, alpha 255 -> 128 -> 255, rot +30, sy 600 %
  pteff03a  loop 720u  x 1721 -> -839, alpha   0 -> 128 -> 255, rot -45, sy 800 %

Checked against three sessions of GPU draws: both signs right every time, and
magnitudes within ~15 % of the declared slopes.

The independent bit worth having: across sessions the measured alpha spans
45..242, and only pteff03a declares alpha below 128 -- pteff03's ramp never
leaves [128,255]. The strip measured at 45 is the 1303-tall one, which the AABB
geometry says is pteff03a for a completely different reason. Two identifications
agreeing.

Stated as limits rather than buried: this cannot separate the two declared
slopes, which are 25 % apart against a quantisation of 6.4 px and one alpha
level over 3-4 frames; and absolute phase is unchecked because the AABB-left to
element-x mapping under rotation and pivot is not established.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
sylph-decoder
2026-08-31 07:11:09 +00:00
parent 3d8b1c2d4b
commit d694bcc53f

View File

@@ -0,0 +1,64 @@
# The sweep strips: the ramp is DECODED on the disc, and the GPU agrees.
# 2026-08-31. sylpheed-port asked for "vertex alpha as a function of sweep
# position". It is not a runtime curve to be sampled -- it is four keyframes.
#
# cargo run -p sylpheed-formats --example sweep_leaf_ramp -- GP_TITLE 5
# tools/re-capture/sweep_positions.py <draw logs>
=== GP_TITLE entry 5 — ptloop01.rat (leaf 284 bytes) ===
declared loop length: 600 units
pteff03.t32 — 4 keyframes
kf0 t=0 x=-639 y=270 sx=100 sy=600 rot=30 fade=FFFFFFFF (alpha 255)
kf1 t=150 x=-39 y=270 sx=100 sy=600 rot=30 fade=80FFFFFF (alpha 128)
kf2 t=540 x=1521 y=270 sx=100 sy=600 rot=30 fade=FFFFFFFF (alpha 255)
kf3 t=600 x=1521 y=270 sx=100 sy=600 rot=30 fade=FFFFFFFF (alpha 255)
=== GP_TITLE entry 5 — ptloop02.rat (leaf 283 bytes) ===
declared loop length: 720 units
pteff03a.t32 — 4 keyframes
kf0 t=0 x=1721 y=270 sx=100 sy=800 rot=-45 fade=00FFFFFF (alpha 0)
kf1 t=150 x=1111 y=270 sx=100 sy=800 rot=-45 fade=80FFFFFF (alpha 128)
kf2 t=630 x=-839 y=270 sx=100 sy=800 rot=-45 fade=FFFFFFFF (alpha 255)
kf3 t=720 x=-839 y=270 sx=100 sy=800 rot=-45 fade=FFFFFFFF (alpha 255)
DECLARED SLOPES, from the second segment of each ramp:
pteff03 x -39 -> 1521 over t 150..540, alpha 128 -> 255 d(alpha)/dx = +0.0814
pteff03a x 1111 -> -839 over t 150..630, alpha 128 -> 255 d(alpha)/dx = -0.0651
MEASURED OFF THE GPU, three independent sessions:
alpha vs position, per tall strip (design px, alpha level):
h=1134 n=3 x 442..486 px alpha 239..242 d(alpha)/dx +0.0670
h=1303 n=3 x -435..-390 px alpha 157..154 d(alpha)/dx -0.0670
--
alpha vs position, per tall strip (design px, alpha level):
h=1134 n=3 x -832..-819 px alpha 135..136 d(alpha)/dx +0.0781
h=1303 n=3 x 403..416 px alpha 47..45 d(alpha)/dx -0.1562
--
alpha vs position, per tall strip (design px, alpha level):
h=1134 n=4 x 237..307 px alpha 222..227 d(alpha)/dx +0.0710
h=1303 n=4 x -1229..-1158 px alpha 209..204 d(alpha)/dx -0.0710
WHAT AGREES
* sign, both strips, every session: the 1134-tall strip moves +x with alpha
rising, the 1303-tall one moves -x with alpha rising. That is the declared
direction for pteff03 and pteff03a respectively.
* magnitude, within ~15 %: +0.067/+0.078/+0.071 against a declared +0.0814,
and -0.067/-0.071 against a declared -0.0651.
* the RANGE is exercised. Across sessions the measured alpha spans 45..242,
and 45 is below 128. Only pteff03a declares alpha below 128 -- pteff03's
ramp never leaves [128,255]. The strip measured at 45 is the 1303-tall one,
which the AABB geometry independently says is pteff03a. Two identifications,
one from height and one from alpha, agreeing.
WHAT THIS CANNOT DO
* separate the two declared slopes. They are 25 % apart; NDC prints to two
decimals so one frame's dx is quantised to 6.4 px and alpha to one level,
and at 3-4 frames per session the noise is larger than the difference. The
-0.1562 row is that noise: 13 px of travel and 2 alpha levels.
* check ABSOLUTE phase. The log gives a rotated quad's AABB, and the mapping
from AABB-left to the element's declared x under rotation and pivot is not
established here. Only rates and ranges are compared.