ac-native: shutdown animation — "bye @handle" farewell before poweroff master
Mirror of the boot animation in reverse: plays a ~1.2s sequence when ac_poweroff() is called. Same matrix-rain background, same rainbow stripes, same per-handle title color palette as the "good morning @jeffrey" boot greeting — but the title reads "bye @jeffrey" and the entire composition fades to black with a cubic ease-in so the kernel halt lands on a clean black frame. Structure: - 72 frames @ 60 fps (1.2s total) - First 18 frames (~300 ms): title fully visible, bg at full time-of-day color, matrix rain at full intensity - Remaining 54 frames: bg + stripes + rain + title all fade with fade_t = (1 - t)^3 so the last ~100 ms sits near black - One explicit black frame at the very end before sync()/reboot() Title derived from the live boot_title: "good morning @jeffrey" → "bye @jeffrey" "good afternoon @jeffrey" → "bye @jeffrey" "notepat" (no handle) → "bye" Wiring: - Forward-declared draw_shutdown_anim() near the top of the file so ac_poweroff() can call it (ac_poweroff is defined at line 160, the animation body lives after draw_boot_status around line 2990). - Added three globals — g_shutdown_graph, g_shutdown_screen, g_shutdown_pixel_scale — populated in main() immediately after graph_init(), and kept in sync when pixel_scale changes at runtime. - draw_shutdown_anim() no-ops when those globals aren't ready (early-boot emergency poweroffs before main() reaches graphics init still power off immediately without crashing). - ac_poweroff() now calls draw_shutdown_anim() before sync()/reboot(). Reuses existing helpers — title_char_color, font_draw_matrix, font_measure_matrix, graph_wipe/ink/box/plot, ac_display_present, frame_sync_60fps — no new dependencies, no build-system changes. This is the other half of the lacma-2026 demo video: once ac-os rebuilds and captures a shutdown clip, the VO pipeline at tools/vo-pipeline.mjs can stitch the full boot → notepat → shutdown sequence together. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>