-- Hypseus parity, stage 6: subtitles, the banner and the disc picture controls. The disc is -- searched to a known frame before each subtitle shot, so a cue's timing is read off the disc's -- own frame number and not off the wall clock; the .srt's timestamps become disc frames at the -- disc's frame rate when it is loaded. dofile("Singe/Framework.singe") local font = fontLoad("Singe/FreeSansBold.ttf", 14) local frames = 0 local step = 0 local note = "start" local broken = srtLoad("testScripts/broken.srt") -- No cues in it: false, and nothing loaded. local good = srtLoad("testScripts/subtitles.srt") -- Four cues over the twelve second disc. -- Each step: a name, what to do when it is reached, and the frame to leave the disc on. local steps = { { "cue 1 (frames 0 to 45)", 15, function() srtEnable(true) end }, { "cue 2, two lines", 90, function() end }, { "cue 2 at srtPosition(15)", 90, function() srtPosition(15) end }, { "cue 2 at srtPosition(80)", 90, function() srtPosition(80) end }, { "cue 3, escaped < and &", 210, function() end }, { "the gap: no cue", 150, function() end }, { "cue 4, the last", 300, function() end }, { "overlayBanner over the cue", 300, function() overlayBanner("A banner, sixty characters or fewer, over the picture.", 30) end }, { "the banner has timed out", 300, function() end }, { "srtEnable(false)", 300, function() srtEnable(false) end }, { "srtEnable(true) again", 300, function() srtEnable(true) end }, { "srtClear()", 300, function() srtClear() end }, { "vldpSetLuma(true, 0): half", 300, function() srtEnable(false) vldpSetLuma(true, 0) end }, { "vldpSetLuma(true, 8): brighter", 300, function() vldpSetLuma(true, 8) end }, { "vldpSetLuma(true, 4): neutral", 300, function() vldpSetLuma(true, 4) end }, { "vldpSetLuma(false)", 300, function() vldpSetLuma(false) end }, { "vldpSetBlend(true)", 300, function() vldpSetBlend(true) end }, { "vldpSetBlend(false)", 300, function() vldpSetBlend(false) end }, { "vldpSetLuma(true, 1) and blend", 300, function() vldpSetBlend(true) vldpSetLuma(true, 1) end }, { "back to the plain picture", 300, function() vldpSetBlend(false) vldpSetLuma(false) end }, -- The blend is a one row smoothing, so it is easiest to see magnified: the same sliver of the -- picture through vldpFocusArea, without it and then with it. { "a magnified sliver, no blend", 300, function() vldpFocusArea(discGetWidth() * 0.42, discGetHeight() * 0.42, 96, 64) end }, { "the same sliver, blended", 300, function() vldpSetBlend(true) end }, { "the sliver, blend off again", 300, function() vldpSetBlend(false) end }, { "vldpResetFocus()", 300, function() vldpResetFocus() end }, } fontSelect(font) discSearch(1) function onOverlayUpdate() frames = frames + 1 if frames == ((#steps + 1) * 20) + 1 then note = "vldpFlash()" vldpFlash() singeScreenshot() end overlayClear() overlayBox(1, 1, overlayGetWidth() - 2, overlayGetHeight() - 2) fontPrint(8, 6, string.format("srtLoad broken=%s good=%s disc frame %d", tostring(broken), tostring(good), discGetFrame())) fontPrint(8, 24, string.format("step %d/%d %s", step, #steps, note)) -- One step every twenty script frames: act on the first, shoot on the tenth, so a banner -- (thirty drawn frames) is up for one shot and gone by the next. if (frames % 20) == 1 and step < #steps then step = step + 1 note = steps[step][1] discSearch(steps[step][2]) steps[step][3]() elseif (frames % 20) == 11 then singeScreenshot() end -- The flash lasts one drawn frame, so it is asked for and shot in the same tick. The note is -- set before the text is drawn, so the shot names what it is showing. if frames == ((#steps + 1) * 20) + 3 then note = "the frame after vldpFlash()" singeScreenshot() end if frames == ((#steps + 1) * 20) + 20 then singeQuit() end return OVERLAY_UPDATED end