← sculpture studio pixel editor haus-design

Canvas — 1:1, no scaling, no anti-aliasing

Frames

Tools

B pencil E erase L line R rect O ellipse G fill I pick
,. frame space play ⌘/Ctrl+Z undo · right-click erases

Palette — index 0 is off/black

Drawing is palette-indexed, so recolouring a whole animation is editing one swatch. This is also what makes the export tiny enough to sit in flash.

Panel

Changing this resizes the canvas without resampling — existing art is kept top-left and cropped or padded. Nothing is ever stretched.

Import

An animated GIF becomes one frame per GIF frame, decoded here rather than by the browser — <img> only ever hands over the first one. A horizontal strip whose width is a multiple of the canvas still becomes one frame per cell. Scaling is nearest-neighbour by default: it never invents a colour, which is what lets the palette survive. .clp files load straight back in.
On the palette: a clip holds 16 colours and slot 0 is always black. A GIF with 15 colours or fewer is kept exactly. A richer one is reduced to its own 15 most-used colours — never remapped onto a preset.
If it comes out too big. The cost is detail, not the source's size — that is scaled away before anything is counted. Measured on a 39-frame GIF: dropping 15 colours to 8 roughly halves it, and to 4 cuts it by about 70%. Soften before shrinking is the one for dithered or noisy GIFs, where the speckle is the cost and fewer colours barely helps. It blends neighbouring pixels before the palette is chosen, so use it when a clip is over budget rather than by habit — and try strong before giving up, it is often worth another 2× on top of gentle. Frames drops whole frames and is the bluntest, most reliable lever of all: every 3rd frame is a third of the size, and a 39-frame loop usually still reads at 13.

Export

Preview puts this on the panel for a minute and then the collection comes back. Save files it in the sculpture's clip library without interrupting anything — add it to a collection from the studio afterwards.

      
The C++ header is palette-indexed RLE. Drop it in src/art/, #include it, and add a Clip row to Registry.h — it plays through the same IAnimation interface as every generative piece.