Art: labelled palette reference cards

make_palettes.py now also emits kissaten-full-card.png and
kissaten-portrait-card.png — each swatch shown with its palette index and
hex code, so a colour can be identified while hand-editing without
counting along an anonymous strip.

Text is drawn with a hand-rolled 3x5 bitmap font covering digits, A-F and
'#'; there is no font library available here.

Drops palette_ref.png, superseded by kissaten-full.png.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-02 18:12:26 +02:00
co-authored by Claude Opus 5
parent aa8fa3ddf9
commit d5789ad8b3
4 changed files with 45 additions and 1 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 B

@@ -67,6 +67,49 @@ def swatches(path, cols, sw=32, h=64):
write_png(path, [[c for c in cols for _ in range(sw)]] * h)
# 3x5 glyphs, enough for indices and hex codes. No font library here.
GLYPHS = {
"0": "111101101101111", "1": "010110010010111", "2": "111001111100111",
"3": "111001111001111", "4": "101101111001001", "5": "111100111001111",
"6": "111100111101111", "7": "111001001001001", "8": "111101111101111",
"9": "111101111001111", "A": "111101111101101", "B": "110101110101110",
"C": "111100100100111", "D": "110101101101110", "E": "111100111100111",
"F": "111100111100100", "#": "101111101111101", " ": "000000000000000",
"-": "000000111000000",
}
def _text(px, x, y, s, col, scale=2):
for ch in s.upper():
g = GLYPHS.get(ch, GLYPHS[" "])
for gy in range(5):
for gx in range(3):
if g[gy*3 + gx] == "1":
for sy in range(scale):
for sx in range(scale):
yy, xx = y + gy*scale + sy, x + gx*scale + sx
if 0 <= yy < len(px) and 0 <= xx < len(px[0]):
px[yy][xx] = col
x += 4 * scale
def card(path, cols, names, idx, scale=2):
"""Labelled reference: swatch, palette index, hex code, role name."""
rowh, sww, pad = 7*scale + 8, 22*scale, 6
W = sww + pad*2 + 4*scale*22
H = rowh*len(cols) + pad*2
bg, fg = (26, 26, 26), (255, 255, 219)
px = [[bg]*W for _ in range(H)]
for i, (c, n, ix) in enumerate(zip(cols, names, idx)):
y = pad + i*rowh
for yy in range(y, y + 7*scale):
for xx in range(pad, pad + sww):
px[yy][xx] = c
label = f"{ix:02d} #{c[0]:02X}{c[1]:02X}{c[2]:02X}"
_text(px, pad + sww + pad, y + scale, label, fg, scale)
write_png(path, px)
def emit(stem, idx, title):
cols = [PALETTE[i] for i in idx]
names = [NAMES[i] for i in idx]
@@ -76,7 +119,8 @@ def emit(stem, idx, title):
aco(p("aco"), cols, names)
act(p("act"), cols)
swatches(p("png"), cols)
print(f"{stem}: {len(cols)} colours -> .gpl .ase .aco .act .png")
card(os.path.normpath(os.path.join(OUT, f"{stem}-card.png")), cols, names, idx)
print(f"{stem}: {len(cols)} colours -> .gpl .ase .aco .act .png + -card.png")
if __name__ == "__main__":