Judged on device and kept. The comment loses its EXPERIMENT framing and gains the thing that was not obvious going in: the density is also what makes the coarse end of the ruling ladder mean anything. A screen needs a period and a half of the block to read as a pattern, and at density 1 a playing board could not carry more than MEDIUM -- POSTER and BILLBOARD were always being stepped back down. Three times the buffer pixels is three times the room. Also records, in sw.js, that an installed copy picks up a new build on relaunch: no reinstall, but backgrounding and returning is not enough.
- commit
- 2774b28e33977b7eb061c6e6b57b7ae3507eeab0
- parent
- faedf3dfb3a666ce6855383bef5a718029932425
- author
- Dami <dami.etoile@gmail.com>
| M | README.md | 24 | ++++++++++++++++++++++++ |
| M | mockup/ | 17 | ++++++++++++----- |
| M | mockup/ | 4 | ++++ |
@@ -100,6 +100,30 @@ was originally built for.
100100 Nothing small is ever set on the desktop pattern — including the title screen, which is a single101101 centred window holding the title, the specimen board and the prompt. An About box, essentially.102102 103+**The picture is composed at three buffer pixels per layout unit.** The whole app is measured in a104+~200-wide coordinate space and always has been. On a 1984 Macintosh that *was* the screen; on a105+2026 phone it is a decision, and it is the difference between a dot of the dither landing as a106+visible square and landing as grain. `DENSITY` in `render.js` composes the same picture on a finer107+grid — three times the dots per inch, with the layout, the type and the touch targets exactly where108+they were. Set it to `1` for the 1984 look.109+110+It is a transform, not a rewrite. Nothing that measures anything changes units: the scene canvas is111+scaled and every drawing call arrives through it, so the several dozen hard-coded offsets in the112+layout code keep meaning what they meant. Only the handful of places that touch a canvas's real113+pixels know the number — the backing stores, `getImageData`, the sprite blits, the tint rectangles114+and the wipe. It has to be an integer: every rule here is one unit wide, and a fractional scale115+would put those on half pixels and hand a 1-bit picture back to the antialiaser.116+117+The rulings are deliberately *not* scaled with it — FINE at 3 is a third the physical dot it was,118+which is the point. That also turned out to be what makes the coarse end of the ladder mean119+anything. A screen needs a period and a half of the block to read as a pattern rather than as one120+or two arbitrary bands of one; at density 1 a playing board could not carry more than MEDIUM, and121+POSTER and BILLBOARD were always quietly stepped back down. Three times the buffer pixels is three122+times the room, so the whole ladder is reachable for the first time.123+124+It costs about 3ms a frame on a nine-times buffer, because the scene outside the block sprites is125+composed entirely at 0 and 255 and so gives error diffusion nothing to propagate.126+103127 **The goal block's mark is made of the shading, not stamped on it.** It used to be a struck ring104128 in bare paper, and a struck ring is an opinion about colour: stamping paper through the middle of a105129 shaded block fought whatever screen the rung drew, and a hard outline across a Ben-Day field or a@@ -53,8 +53,6 @@ let PIECE32 = [], PLATE32 = [];
5353 export const PERIOD = 8; // slides are quantised to this5454 5555 /* ------------------------------------------------------------------ density56- *57- * EXPERIMENT. Set back to 1 for the shipped look.5856 *5957 * How many buffer pixels there are per unit of the layout. The whole app is6058 * measured in a ~200-wide coordinate space and always has been, which on a 1984@@ -75,9 +73,18 @@ export const PERIOD = 8; // slides are quantised to this
7573 * fractional scale would put those on half pixels and hand the whole 1-bit7674 * picture back to the antialiaser.7775 *78- * The rulings are deliberately *not* scaled with it. That is the experiment --79- * FINE at 3 is a third the physical dot it was, which is the point. Scaling80- * them alongside would reproduce today's look at more memory and no gain. */76+ * The rulings are deliberately *not* scaled with it. FINE at 3 is a third the77+ * physical dot it was, which is the whole point; scaling them alongside would78+ * reproduce the old look at nine times the memory and no gain.79+ *80+ * It also turned out to be what makes the coarse end of the ruling ladder mean81+ * anything. A screen needs a period and a half of the block to read as a82+ * pattern (see fitRuling), and at 1 a playing board could not carry more than83+ * MEDIUM -- POSTER and BILLBOARD were always being stepped back down. Three84+ * times the buffer pixels is three times the room, so the whole ladder is85+ * reachable for the first time.86+ *87+ * 1 is the 1984 look, should it ever be wanted back. */8188 export const DENSITY = 3;8289 const dpx = n => Math.round(n * DENSITY);8390 @@ -10,6 +10,10 @@
1010 * reloads the page underneath the player; the current session finishes on the1111 * build it started with.1212 *13+ * Confirmed on device: an installed copy picks up a new build on relaunch. It14+ * does not need reinstalling, and backgrounding and returning to it is not15+ * enough -- the session has to actually end.16+ *1317 * For the real app this should become the polite flow instead: install, wait,1418 * tell the page, and let it choose a harmless moment. Refreshing someone1519 * mid-puzzle to ship a CSS tweak is a way to lose them.