Text, interface and legibility at 320×180, and colorblind-safe palettes under an eight-ink limit

Notes compiled 2026-11-05 for Elsewhere and the Tycho study. Target: a 320×180 pixel frame (Elsewhere’s short side is 180 art pixels), scaled by whole numbers on a phone, eight inks to a frame, plain JavaScript drawing into palette-indexed buffers. Sibling notes: styles_resolution_perspective.md (palettes, OKLab ramps, integer scaling) and style_matching.md. This file covers how words and buttons fit that frame, and how a palette of eight inks stays readable for people with color vision deficiency.

Note on sourcing: the libDaltonLens C source was downloaded and read in full (its matrices are used in the demos). The PICO-8 manual, the BMFont format page, the Xbox Accessibility Guidelines (XAG 101), WCAG 2.2’s Understanding pages, the IGDA GASIG filter page, the CSS Color 4 spec, and the font pages for m5x7, Fusion Pixel and Ark Pixel were fetched. Items marked “(search summary)” come from search-result summaries only. Phone figures not given by a source are arithmetic from published screen sizes and are marked (arithmetic). Anything marked (inference) is reasoning, not a source’s claim.

1. What exists today

Takeaway

Tycho has no bitmap text at all. Its only text machinery is DOM: Tycho.ui.Typer, a letter-at-a-time revealer for HTML lines, at 40 characters a second with breaths after sentences and clauses. Elsewhere’s talk box is HTML over the canvas in the system sans at 15 px; its answer buttons are about 35 CSS px tall.

Findings

2. Pixel fonts: sizes, metrics, famous examples

Takeaway

At 320×180, the workable range runs from 3×5 caps-only (labels, numbers) to 5×7 with 2-pixel descenders (body text, a 10-pixel line), up to 6×11-ish faces for headline-friendly reading. Proportional faces save 10 to 20% of the width over monospace. Accents need extra rows above the cap height; CJK needs about 12 pixels to be comfortable and 8 pixels at the absolute minimum.

Findings

Metrics at 320×180 (arithmetic)

Line text width in a talk box 304 px wide with 8 px padding = 288 px.

Face Cell / advance Line Chars per 288 px Lines in a 40 px box
3×5 caps (PICO-8-like) 4 6 72 6
5×7 mono, 2 px descenders 6 10 48 4
5×7 proportional (avg advance ≈ 5) ≈5 10 ≈57 4
6×11 (m6x11-like, avg advance ≈ 6) ≈6 to 7 12 ≈44 3
8×8 (Press Start-like) 8 10 36 4
12 px CJK (full width) 12 to 13 14 22 2

3. How big is big enough

Takeaway

On every current phone, holding the 180-pixel short side at a whole device-pixel scale makes one art pixel about a third of a millimeter. A 7-pixel cap height is then about 2.3 mm, about the size of iOS body text’s capitals. A 3×5 face is at the floor. Accessibility guidance for games (XAG) asks for more.

Findings

Phones (arithmetic from published sizes)

Device scale = floor(short side in device px / 180). iPhone sizes from Use Your Loaf; Android sizes are general knowledge.

Phone (CSS px, ratio, ppi) Device px per art px Screen in art px (landscape) One art px 7-px cap 44 pt or 48 dp 9 mm fingertip
iPhone 15 (393×852, 3, 460) 6 426×196 0.33 mm 2.3 mm 22 px 27 px
iPhone 15 Pro Max (430×932, 3, 460) 7 399×184 0.39 mm 2.7 mm 19 px 23 px
iPhone SE 3 (375×667, 2, 326) 4 333×187 0.31 mm 2.2 mm 22 px 29 px
Pixel 8 (412×915, 2.625, 428) 6 400×180 0.36 mm 2.5 mm 21 px 25 px
Galaxy S24 (360×780, 3, 416) 6 390×180 0.37 mm 2.6 mm 24 px 25 px

4. Touch targets

Takeaway

Every guideline lands between 7 and 10 mm. On a phone, that’s 20 to 29 art pixels at 320×180: a choice button can’t be shorter than about 22 pixels, an eighth of the frame’s height. Three stacked choices plus three lines of text take two thirds of the frame; in landscape, choices belong side by side.

Findings

5. Text over busy art

Takeaway

At 320×180, a 1-pixel 8-neighbor outline in the frame’s darkest ink is the standard way to keep light text on any background, at the cost of 2 pixels of width and height a glyph and some closing-up of counters. A drop shadow (1 pixel down and right) keeps more of the counter but fails over dark ground. A plate (a box behind the text) is safest and is what subtitle guidelines ask for.

Findings

6. Accents and other scripts

Takeaway

Lowercase accents fit in a 5×7 face’s ascender rows; capital accents don’t, and need 2 to 3 rows above the cap height, so a font that supports them needs a taller line (12 instead of 10). Decomposing with Unicode NFD lets one small table of marks cover most Latin accents. CJK needs separate bitmap fonts: 8×8 is legible only with care (Misaki), 10 to 12 px is the practical minimum, and XAG halves the characters per line.

Findings

7. Fonts as data: BMFont and index buffers

Takeaway

BMFont’s text format is the de facto bitmap font interchange: one common line (line height, baseline), one char line per glyph (atlas rectangle, offsets, advance), optional kerning pairs. A pixel font in an indexed engine needs only 1 bit a pixel, and drawing it is writing one ink index per set bit, with the outline a second pass in another index.

Findings

8. Talk boxes

Takeaway

The talk-box conventions are stable across decades: a framed box at the bottom, a portrait at one end, a name tab, text revealed at a set speed with pauses at punctuation, the first tap completing the line and the second advancing, a small blinking marker when a line is done, and choices as a short list. Each has a pixel-specific detail: nine-slice frames must tile their edges in whole pattern periods; word wrap must measure in the font’s own advances; choices must be finger-sized.

Findings

9. Colorblind-safe palettes

Takeaway

About 8% of men and 0.4% of women have a color vision deficiency, nearly all red-green; protans also see reds darker. The robust design rule is that inks that must be told apart differ in lightness, because lightness survives every deficiency; checking an eight-ink palette means simulating it (Brettel 1997 for all three types; Viénot 1999 for protan and deutan; Machado 2009 for partial deficiency) and measuring every one of its 28 pairs. Games that bolt filters onto the whole screen get criticized; redundancy (shape plus color) and per-element palettes are what accessibility groups recommend.

Findings

An eight-ink check (inference)

  1. Simulate the eight inks under protanopia, deuteranopia and tritanopia (Brettel 1997 via libDaltonLens’s matrices) and greyscale (OKLab L).
  2. Measure all 28 pairs in OKLab under each; flag pairs under a threshold (0.08 here) in any view.
  3. For pairs that must stay distinct (figure on ground, a person’s coat on grass), push lightness apart in OKLCH, keeping hue and lowering chroma to stay in gamut, until no flag remains. Lightness is preserved under all three dichromacies, so separating L separates every view.
  4. Check the text pair (darkest on lightest) for WCAG 4.5:1.
  5. Not every pair matters: two greens in one ramp may collide by design. The flag list is for a person to read, not a gate.