Add a calibration test image/script for visually checking zoom cropping
dev/calibration.png is a synthetic grid (concentric color rings, corner markers, a crosshair) and dev/calibration_test.star runs it through the same zoom logic as the real _art_widget, so cropping can be checked visually without depending on what a live station happens to be playing. This is what was used to find and verify the centered-zoom fix.
This commit is contained in:
1 parent
975ff6da28
commit
16ac004d06
3 files changed
+65
No files matched your search
@@ -128,6 +128,21 @@ pixlet render subwave_nowplaying.star station_url=https://your-station.example.c
|
|||||||
pixlet serve subwave_nowplaying.star
|
pixlet serve subwave_nowplaying.star
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`dev/calibration_test.star` renders a synthetic test grid (`dev/calibration.png`
|
||||||
|
— concentric color rings, corner markers, a crosshair) through the exact same
|
||||||
|
zoom logic as the real `_art_widget`, to visually check cropping without
|
||||||
|
depending on what a live station happens to be playing:
|
||||||
|
|
||||||
|
```
|
||||||
|
pixlet render dev/calibration_test.star -o calib.gif
|
||||||
|
```
|
||||||
|
|
||||||
|
At rest you should see a thin, *even* sliver of magenta on all four edges;
|
||||||
|
as it zooms in, each corner marker should get clipped by the same amount.
|
||||||
|
If one side loses noticeably more than the others, the zoom isn't
|
||||||
|
centered. Keep its copy of the zoom math in sync with `_art_widget` if that
|
||||||
|
ever changes.
|
||||||
|
|
||||||
## Deploy
|
## Deploy
|
||||||
|
|
||||||
Upload `subwave_nowplaying.star` directly through your Tronbyt server's
|
Upload `subwave_nowplaying.star` directly through your Tronbyt server's
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,50 @@
|
|||||||
|
"""
|
||||||
|
Dev tool, not part of the deployed app: renders dev/calibration.png through
|
||||||
|
the exact same zoom logic as _art_widget in subwave_nowplaying.star, so you
|
||||||
|
can visually check how much margin gets cropped at rest and at full zoom,
|
||||||
|
and whether the crop is even on all sides.
|
||||||
|
|
||||||
|
calibration.png is a 360x360 grid: concentric 10%-wide color rings (magenta
|
||||||
|
outermost, then yellow, then cyan) plus four corner markers (red TL, green
|
||||||
|
TR, blue BL, white BR) and a center crosshair. At rest, you should see a
|
||||||
|
thin, EVEN sliver of magenta on all four edges. As it zooms in, each corner
|
||||||
|
marker should get clipped by the same amount -- if one side/corner loses
|
||||||
|
noticeably more than the others, the zoom isn't centered.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
pixlet render dev/calibration_test.star -o calib.gif
|
||||||
|
pixlet render dev/calibration_test.star zoom_scale=1.0 -o calib_rest.gif # rest only
|
||||||
|
|
||||||
|
Keep ART_SIZE/ART_SLOT/the zoom math below in sync with the real
|
||||||
|
_art_widget if that ever changes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
load("render.star", "render")
|
||||||
|
load("animation.star", "animation")
|
||||||
|
load("calibration.png", CALIB = "file")
|
||||||
|
|
||||||
|
ART_SIZE = 36
|
||||||
|
ART_SLOT = 32
|
||||||
|
ART_ZOOM_DURATION = 200
|
||||||
|
|
||||||
|
def _art_widget(art_bytes, zoom_scale):
|
||||||
|
art = render.Image(src = art_bytes, width = ART_SIZE, height = ART_SIZE)
|
||||||
|
top_scale = max(zoom_scale, 1.0)
|
||||||
|
shift = (1.0 - top_scale) * (ART_SIZE / 2.0)
|
||||||
|
zoom = animation.Transformation(
|
||||||
|
child = art,
|
||||||
|
duration = ART_ZOOM_DURATION,
|
||||||
|
keyframes = [
|
||||||
|
animation.Keyframe(percentage = 0.0, transforms = [animation.Scale(1.0, 1.0), animation.Translate(0, 0)]),
|
||||||
|
animation.Keyframe(percentage = 0.5, transforms = [animation.Scale(top_scale, top_scale), animation.Translate(shift, shift)], curve = "ease_in_out"),
|
||||||
|
animation.Keyframe(percentage = 1.0, transforms = [animation.Scale(1.0, 1.0), animation.Translate(0, 0)], curve = "ease_in_out"),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
return render.Box(width = ART_SLOT, height = ART_SLOT, child = zoom)
|
||||||
|
|
||||||
|
def main(config):
|
||||||
|
zoom_scale = float(config.get("zoom_scale", "1.4"))
|
||||||
|
return render.Root(child = render.Row(children = [
|
||||||
|
_art_widget(CALIB.readall(), zoom_scale),
|
||||||
|
render.Box(width = 32, height = 32, color = "#111111"),
|
||||||
|
]))
|
||||||