Plus! 98 DirectAnimation theme savers (CORBIS, FASHION, HORROR, WOTRAVEL)

--app=scr_corbis and its siblings scr_fashion, scr_horror, scr_wotravel. They are thin MFC hosts for Microsoft DirectAnimation: after CoCreateInstance(CLSID_DirectDrawFactory) -> CreateDirectDraw -> CreateSurface they resolve DirectAnimation.DAStatics / DAView and leave every pixel to DirectAnimation, which slides and crossfades JPG photographs. We provide DirectAnimation as a WAT shim (IDirectAnimationDAStatics_*, IDirectAnimationDAView_*, IDirectAnimationDABehavior_* in src/api_table.json) over our DirectDraw.

Status 2026-10-06

All four render on the CLI software path and in the browser (claude:65967384). Reviewed runs: scratch/runs/20261006T0620Z-<app>-w4-sw (CLI) and scratch/runs/20261006T0640Z-<app>-w4-web (browser). CORBIS's slideshow advances: four cave tiles, then single photos (a snowy tree, then a wasp, 21.6% of pixels changing between captures).

node test/run.js --app=scr_corbis --no-close --quiet-api --max-seconds=45 \
  --max-batches=999999999 --stuck-after=100000000 --png=out.png

There is no Direct3D in these savers, so there is no separate WebGL arm: the browser run is the second column.

The trap: a missing JPG decoder looks like a missing DirectAnimation

The photos are JPGs, which test/run.js decodes on the host with skia-canvas. On a box where that package was installed without its native binary (node_modules/skia-canvas/lib/skia.node), decodeMountedImage throws decodeImage app assets require devDependency skia-canvas before the guest boots, and the saver never gets as far as DirectAnimation. That was the whole blocker on the ops box. The fix is environmental: run the package's own install step, cd node_modules/skia-canvas && node lib/prebuild.mjs download.

The earlier IDirectDrawFactory IID typo (fa4be36a, {4FD2A833-...}, not ...823) was the other half: before it, CoCreateInstance failed and the savers idled on a black window.

API profile (45 s of CORBIS)

IDirectAnimationDAView_QueryInterface/_Release about 10k each, IDirectAnimationDAView_DirectSlot008/009 about 5k each (one tick/render pair per frame), a few dozen IDirectAnimationDABehavior_* calls at slide changes.