Separate tile sets in this one project — e.g. player_walk (2x2), coin (1x1), font (16x6) — each with its own size, layers and groups, all sharing the palette bank. Saved together and exported as one C file.
Grid Size (tiles)
x
Resize anchor — existing content stays pinned to the highlighted point; growth or cropping happens on the opposite side(s).
Pixels = 8 × tiles, up to 256x256 tiles. Type a custom size and press Enter or click Resize.
Exact, no resampling — just trims everything outside the selected tiles.
Scale (Resample)
Resamples the pixel art itself to a new tile size (nearest-neighbor — an approximation, since palette-index art can't blend like real color can). Works on the selection if you have one, else the whole canvas. Clears per-tile palette overrides in the affected area, since tile positions no longer line up with the original art.
x
%
Percent is of the selection's (or whole canvas's) current size, rounded to whole tiles.
%
Shrinks/grows the artwork itself while the grid (or selection) size stays exactly the same — positioned using the same resize-anchor picker Resize uses (in the Grid Size panel), clipped to fit if grown past the original bounds. Good for resizing a shape without disturbing the canvas dimensions.
Tools
No selection — actions apply to whole canvas.
Left click/drag = primary color. Right click/drag = secondary. Right-click while Select is active clears the selection. Click-drag inside an existing selection to move it (snaps to whole tiles) instead of redrawing it.
Shapes
Drag on the canvas to draw. Left = primary color, right = secondary. Hold Shift while dragging Rect/Ellipse for a square/circle.
Magic Wand
Click with the Wand to select a same-color blob on the active layer. Ctrl+click adds another blob to the selection. Click-drag inside the selected pixels to move them freely (no tile snapping). Copy it, then Paste stamps just those pixels elsewhere — everything else at the destination stays untouched (right-click cancels a pending paste or clears the wand selection).
Transform
With a selection: rotates/flips just that region on the active layer. With no selection: rotates/flips every layer together (whole tileset geometry).
Requires a selection. Leaves the original alone and loads a mirrored copy into the Paste tool — click the canvas to place it wherever you like.
Slide (wrap)
Shifts pixels on the active layer by 1px per click (Alt+Arrow keys work too); pixels that fall off one edge reappear on the opposite edge. Works within the selection, or the whole canvas if none.
Perspective Guide
XY
LinesOffset°
Evenly-spaced lines radiating from the vanishing point, starting at the offset angle. Visual reference only — never drawn into the art or exported.
Tile Usage
History
Zoom
18 px/pixel
Ctrl+scroll wheel over the canvas also zooms.
—2x2 tiles (16x16 px)
Full-color reference
Layers (one per screen plane)
Merge is handy before/after copying or drawing a new feature on its own layer, so you can see the full combined screen plane — then flatten once you're happy. If two layers painted the same tile with different palettes, the front layer's palette wins there (only one palette fits per tile on real hardware).
Top of list = front plane. Only the highlighted (active) layer is edited — others preview dimmed. Each layer exports as its own tile array, matching NGPC's real one-tile-per-plane limit (e.g. sprite back/front, SCR1/SCR2).
Draw Color
Primary (LMB)
Secondary (RMB)
Keys 1-4 set primary, Shift+1-4 set secondary.
Active Palette (RGB444, 0-15 per channel — 4096 colors)
Palette Bank
All banked palettes export together as one shared project palette table. Each layer picks a default palette (dropdown in Layers); individual tiles can override it below. "Remove Unused" drops every bank palette that no layer's default or per-tile override currently references.
Tile Palette Override
Select tile(s) with the Select tool, then assign a bank palette to just those tiles — the pixel art (index data) stays shared with the rest of the layer, only the palette attribute changes. This matches how NGPC tilemaps really work (palette is a per-cell attribute, not baked into the bitmap).
Tile Groups (Named Sub-Regions)
Select tile(s) with the Select tool, name them, and Add — the group's tile-index range and a ready-to-use index array get emitted in the C output. Great for marking sprite-sheet animation frames (walk_up, walk_down, idle_left, etc.) without hand-counting tile indices. Groups belong to the active layer and are shown as labeled dashed boxes on the canvas.
Adding a group with a name that already exists on this layer replaces it with the current selection's bounds. Groups are clamped to stay inside the grid automatically if you resize/crop/scale afterward — recheck them if you do.
Refreshes automatically as you edit. Each layer emits its own row-major (left→right, top→bottom) u16 tile
array (8 words/tile, 2bpp MSB-first — matches this project's existing art.c/*_mspr.c format)
plus a per-tile palette-index array. Palette words are hex literals (R | G<<4 | B<<8) —
safe from the raw RGB() macro's blue-channel truncation bug on cc900.