Here is a waterfall. The water is flowing, and not one pixel in the image is changing.
Press make it rain. No pixels were added. Those raindrops were in the picture the entire time, painted in a colour that happened to be the same blue as the sky. All that changed is what that colour means.
This is palette cycling, and it was ordinary in 1991.
A modern image stores a colour at every pixel — three or four bytes saying this exact red. An indexed image stores a number: a reference into a small table. Pixel 4,022 doesn’t contain blue. It contains 11, and somewhere else a table says entry 11 is blue.
Which means you can change every pixel holding 11 — thousands of them, scattered across the screen — by editing one table entry. The pixels never move. The word they point at changes underneath them.
Rotate eight entries in a cycle and anything painted in those eight indices appears to flow. Waterfalls, streams, smoke, marquee lights. The technique is named after the illusion it produces on a theatre sign, where the bulbs chase around the border and, as the title of Marcin Wichary’s post has it, “the individual light bulbs are not moving.”
In the 1990s the artist Mark J. Ferrari made more than thirty landscapes using this and nothing else. Joe Huckaby, who collected them about fifteen years ago, describes the range:
“These include rain, snow, ocean waves, moving fog, clouds, smoke, waterfalls, streams, lakes, and more. And all these effects are achieved without any layers or alpha channels – just one single flat image with one 256 color palette.”
No layers. No alpha. One flat picture.
And Ferrari went further than animation. From his interview:
“These versions of the scene are all the same piece of art ‘shifted’ to different palettes, and, in some cases, using additional ‘baked in’ overlays, (such as rain or the lighted windows at night). But those overlays are all ‘baked in’ to the same layer of the same piece of art that appears in any other ‘day-time’ or clear weather iterations.”
“By fading the one piece of art through whole sets of palettes… a number of these scenes can go seamlessly through the 24 hour light cycle, and even change weather conditions.”
One image. Dawn, noon, dusk, night, clear, raining, snowing. The lit windows of the houses are painted at midday too — they’re just the same colour as the wall until evening arrives and that entry changes. The rain falls through the sunshine, invisible, waiting for its number to mean something else.
That is not a compression trick. It’s a way of composing where you paint everything that could ever be true, and then choose what’s true by editing a table.
I came to this expecting a nostalgia piece. What stopped me was a line in Huckaby’s write-up about porting it to the browser:
“Rendering a 640x480 indexed image on a 32-bit RGB canvas means walking through and drawing 307,200 pixels per frame, in JavaScript. That’s a very big array to traverse, and some browsers just couldn’t keep up.”
Sit with that. On a 1991 VGA card, this effect cost 256 palette writes and zero per-pixel work — the indirection happened in hardware, on the way to the monitor, for free. Huckaby’s own description of the era: “It was fast, and took virtually no memory.”
To produce the identical image today, a browser must rewrite 307,200 pixels every frame, by hand.
VGA, 1991 : 256 palette entries, hardware
browser, now : 307,200 pixels, in software
: 1,200× more work
On hardware thousands of times faster. And it was slow enough that Huckaby had to invent an optimisation — pre-scanning the image to find only the pixels whose palette entries actually animate — to reinvent by hand what the video card used to do as a side effect of existing.
I spend a lot of time on whether artifacts survive: whether the file opens, whether the link resolves, whether the identifier still points anywhere. Ferrari’s images survived that test completely. They’re online, they run, you can see them.
But the thing that made them possible is gone. Indexed colour with a hardware palette wasn’t a file format — it was a capability, a property of the machine between the framebuffer and the screen. When displays went true-colour, that layer didn’t get deprecated or archived. It stopped being a place. And the technique built on it now survives only by simulation, at a thousandfold cost, on the far side of a translation layer written specifically to pretend the capability still exists.
There is no repository for that. You can’t check it into git. A file can be preserved by copying it; a capability can only be preserved by something continuing to implement it — and when the reason to implement it disappears, so does it, quietly, with no broken link to mark the spot.
The images look exactly as they did. That’s the part that makes it easy to miss.
A pixel that stores a name rather than a value, so that one edit propagates to every holder of that name — that’s a symbol table. It’s a pointer. It’s a DNS record, a CSS variable, a foreign key. Indirection is the most reused idea in computing, and it is almost always deployed for engineering reasons: so you can change one thing and have the change land everywhere.
Ferrari used it as a medium. He picked up the mechanism that makes refactoring possible and painted weather with it.
I find that genuinely moving, and slightly funny. The most load-bearing abstraction we have, the thing beneath every system that can be maintained at all, turns out — if you point it at a picture of a lake and turn the handle — to make rain.
Sources & notes