@prosopo/puzzle-assets 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +13 -15
  2. package/.turbo/turbo-build$colon$tsc.log +5 -8
  3. package/.turbo/turbo-build.log +15 -20
  4. package/CHANGELOG.md +71 -0
  5. package/LICENSE +201 -0
  6. package/dist/browser.d.ts +3 -2
  7. package/dist/browser.d.ts.map +1 -1
  8. package/dist/browser.js +5 -4
  9. package/dist/browser.js.map +1 -1
  10. package/dist/cjs/compose.cjs +117 -1
  11. package/dist/cjs/contrast.cjs +142 -0
  12. package/dist/cjs/index.cjs +24 -6
  13. package/dist/cjs/notch.cjs +115 -93
  14. package/dist/cjs/palette.cjs +36 -3
  15. package/dist/compose.d.ts +4 -0
  16. package/dist/compose.d.ts.map +1 -1
  17. package/dist/compose.js +117 -2
  18. package/dist/compose.js.map +1 -1
  19. package/dist/contrast.d.ts +9 -0
  20. package/dist/contrast.d.ts.map +1 -0
  21. package/dist/contrast.js +137 -0
  22. package/dist/contrast.js.map +1 -0
  23. package/dist/index.d.ts +5 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -7
  26. package/dist/index.js.map +1 -1
  27. package/dist/notch.d.ts.map +1 -1
  28. package/dist/notch.js +115 -93
  29. package/dist/notch.js.map +1 -1
  30. package/dist/palette.d.ts +1 -0
  31. package/dist/palette.d.ts.map +1 -1
  32. package/dist/palette.js +36 -4
  33. package/dist/palette.js.map +1 -1
  34. package/dist/prng.d.ts.map +1 -1
  35. package/dist/prng.js.map +1 -1
  36. package/dist/tests/pieceReadability.unit.test.d.ts +2 -0
  37. package/dist/tests/pieceReadability.unit.test.d.ts.map +1 -0
  38. package/dist/tests/pieceReadability.unit.test.js +320 -0
  39. package/dist/tests/pieceReadability.unit.test.js.map +1 -0
  40. package/dist/tests/renderReplay.unit.test.d.ts +2 -0
  41. package/dist/tests/renderReplay.unit.test.d.ts.map +1 -0
  42. package/dist/tests/renderReplay.unit.test.js +77 -0
  43. package/dist/tests/renderReplay.unit.test.js.map +1 -0
  44. package/dist/types.d.ts +1 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +59 -60
  47. package/src/background.ts +0 -189
  48. package/src/browser.ts +0 -100
  49. package/src/compose.ts +0 -210
  50. package/src/decoys.ts +0 -191
  51. package/src/encode.ts +0 -59
  52. package/src/index.ts +0 -137
  53. package/src/notch.ts +0 -223
  54. package/src/palette.ts +0 -110
  55. package/src/prng.ts +0 -95
  56. package/src/tests/puzzleAssets.unit.test.ts +0 -438
  57. package/src/types.ts +0 -93
  58. package/tsconfig.cjs.json +0 -14
  59. package/tsconfig.json +0 -19
  60. package/tsconfig.tsbuildinfo +0 -1
  61. package/tsconfig.types.json +0 -9
package/dist/palette.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { bestPairContrast } from "./contrast.js";
1
2
  //#region src/palette.ts
2
3
  var PALETTES = [
3
4
  {
@@ -75,19 +76,50 @@ var hslToRgb = (h, s, l) => {
75
76
  * colour and the mesh reads as one flat field with a slight gradient, which is
76
77
  * the difference between "designed" and "beige".
77
78
  */
78
- var drawPalette = (prng, count) => {
79
- const spec = prng.pick(PALETTES);
79
+ /**
80
+ * The worst-case contrast ratio the palette's widest pair must reach, across
81
+ * normal vision and all three dichromacies.
82
+ *
83
+ * This is a floor on the *range* a background spans, not on every pair — a mesh
84
+ * gradient needs near-neighbours, and demanding contrast between them would
85
+ * produce stripes. What it rules out is a field that is uniformly one brightness,
86
+ * where hue is the only thing separating anything and a dichromat sees a flat
87
+ * rectangle.
88
+ *
89
+ * 1.6 is chosen to be achievable rather than aspirational: the palettes are
90
+ * analogous-hue families on purpose, and pushing this towards WCAG's 3:1 would
91
+ * reject most of them and force the generator into the widened-lightness
92
+ * fallback on nearly every draw, which would make every background look the
93
+ * same. Separation of the piece from what it rests on is guaranteed by its
94
+ * luminance-stepped rim in `compose.ts`, not by this; this stops the background
95
+ * itself from having no structure at all.
96
+ */
97
+ var MIN_PALETTE_CONTRAST = 1.6;
98
+ /** How many times to redraw before widening the lightness band instead. */
99
+ var MAX_PALETTE_ATTEMPTS = 6;
100
+ var drawOnce = (prng, count, spec, lightnessBoost) => {
80
101
  const baseHue = spec.hue + prng.range(-20, 20);
81
102
  const direction = prng.next() < .5 ? -1 : 1;
103
+ const low = Math.max(.08, spec.lightness[0] - lightnessBoost);
104
+ const high = Math.min(.92, spec.lightness[1] + lightnessBoost);
82
105
  const colours = [];
83
106
  for (let i = 0; i < count; i++) {
84
107
  const hue = baseHue + direction * ((count === 1 ? .5 : i / (count - 1)) - .5) * 2 * spec.spread + prng.range(-6, 6);
85
108
  const saturation = prng.range(spec.saturation[0], spec.saturation[1]);
86
109
  const pole = i % 2 === 0 ? 0 : 1;
87
- const lightness = spec.lightness[pole] + prng.range(-.04, .04) * (pole === 0 ? 1 : -1);
110
+ const lightness = (pole === 0 ? low : high) + prng.range(-.04, .04) * (pole === 0 ? 1 : -1);
88
111
  colours.push(hslToRgb(hue, saturation, lightness));
89
112
  }
90
113
  return colours;
91
114
  };
115
+ var drawPalette = (prng, count) => {
116
+ const spec = prng.pick(PALETTES);
117
+ let last = drawOnce(prng, count, spec, 0);
118
+ for (let attempt = 1; attempt <= MAX_PALETTE_ATTEMPTS; attempt++) {
119
+ if (bestPairContrast(last) >= 1.6) return last;
120
+ last = drawOnce(prng, count, spec, attempt * .07);
121
+ }
122
+ return last;
123
+ };
92
124
  //#endregion
93
- export { drawPalette, hslToRgb };
125
+ export { MIN_PALETTE_CONTRAST, drawPalette, hslToRgb };
@@ -1 +1 @@
1
- {"version":3,"file":"palette.js","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"palette.js","sourceRoot":"","sources":["../src/palette.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"prng.d.ts","sourceRoot":"","sources":["../src/prng.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,IAAI;IAEpB,IAAI,IAAI,MAAM,CAAC;IAEf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAExC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,UAAU,KAAK,CAAC;AAG7B,eAAO,MAAM,UAAU,QAAO,MAAiC,CAAC;AAMhE,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,IA+CzC,CAAC"}
1
+ {"version":3,"file":"prng.d.ts","sourceRoot":"","sources":["../src/prng.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,IAAI;IAEpB,IAAI,IAAI,MAAM,CAAC;IAEf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAExC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,UAAU,KAAK,CAAC;AAG7B,eAAO,MAAM,UAAU,QAAO,MAAiC,CAAC;AAMhE,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,IA+CzC,CAAC"}
package/dist/prng.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"prng.js","sourceRoot":"","sources":["../src/prng.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prng.js","sourceRoot":"","sources":["../src/prng.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pieceReadability.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pieceReadability.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/pieceReadability.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,320 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { generateBackground } from "../background.js";
3
+ import { cutNotch, pieceRimGeometry } from "../compose.js";
4
+ import { VISION_TYPES, bestPairContrast, contrastRatio, relativeLuminance, simulateVision, } from "../contrast.js";
5
+ import { coverageFromDistance, createNotchShape } from "../notch.js";
6
+ import { MIN_PALETTE_CONTRAST, drawPalette } from "../palette.js";
7
+ import { createPrng } from "../prng.js";
8
+ const SEEDS = 400;
9
+ const seedAt = (i) => {
10
+ const seed = Buffer.alloc(16);
11
+ seed.writeUInt32LE((i * 2_654_435_761) >>> 0, 0);
12
+ seed.writeUInt32LE((i * 40_503 + 7) >>> 0, 4);
13
+ seed.writeUInt32LE((i ^ 0x9e37_79b9) >>> 0, 8);
14
+ seed.writeUInt32LE((i * 97 + 13) >>> 0, 12);
15
+ return seed;
16
+ };
17
+ const hueOf = (colour) => {
18
+ const r = colour.r / 255;
19
+ const g = colour.g / 255;
20
+ const b = colour.b / 255;
21
+ const max = Math.max(r, g, b);
22
+ const min = Math.min(r, g, b);
23
+ const span = max - min;
24
+ if (span === 0)
25
+ return 0;
26
+ let hue;
27
+ if (max === r)
28
+ hue = ((g - b) / span) % 6;
29
+ else if (max === g)
30
+ hue = (b - r) / span + 2;
31
+ else
32
+ hue = (r - g) / span + 4;
33
+ return (((hue * 60) % 360) + 360) % 360;
34
+ };
35
+ const hueGap = (a, b) => {
36
+ const raw = Math.abs(a - b) % 360;
37
+ return raw > 180 ? 360 - raw : raw;
38
+ };
39
+ describe("colour-vision arithmetic", () => {
40
+ it("gives black and white the full WCAG range", () => {
41
+ expect(contrastRatio({ r: 0, g: 0, b: 0 }, { r: 255, g: 255, b: 255 })).toBeCloseTo(21, 1);
42
+ });
43
+ it("gives a colour against itself the floor of 1", () => {
44
+ expect(contrastRatio({ r: 90, g: 120, b: 200 }, { r: 90, g: 120, b: 200 })).toBe(1);
45
+ });
46
+ it("weights green above red above blue, on linear light", () => {
47
+ const red = relativeLuminance({ r: 255, g: 0, b: 0 });
48
+ const green = relativeLuminance({ r: 0, g: 255, b: 0 });
49
+ const blue = relativeLuminance({ r: 0, g: 0, b: 255 });
50
+ expect(green).toBeGreaterThan(red);
51
+ expect(red).toBeGreaterThan(blue);
52
+ expect(relativeLuminance({ r: 128, g: 128, b: 128 })).toBeLessThan(0.3);
53
+ });
54
+ it("leaves colours alone for normal vision", () => {
55
+ const colour = { r: 12, g: 200, b: 77 };
56
+ expect(simulateVision(colour, "normal")).toEqual(colour);
57
+ });
58
+ it("collapses red against green onto one hue for protanopia and deuteranopia", () => {
59
+ const red = { r: 200, g: 60, b: 60 };
60
+ const green = { r: 60, g: 200, b: 60 };
61
+ expect(hueGap(hueOf(red), hueOf(green))).toBeGreaterThan(100);
62
+ for (const vision of ["protanopia", "deuteranopia"]) {
63
+ const gap = hueGap(hueOf(simulateVision(red, vision)), hueOf(simulateVision(green, vision)));
64
+ expect(gap, vision).toBeLessThan(20);
65
+ }
66
+ });
67
+ it("leaves red against green apart for tritanopia", () => {
68
+ const red = { r: 200, g: 60, b: 60 };
69
+ const green = { r: 60, g: 200, b: 60 };
70
+ expect(hueGap(hueOf(simulateVision(red, "tritanopia")), hueOf(simulateVision(green, "tritanopia")))).toBeGreaterThan(90);
71
+ });
72
+ it("keeps a grey ramp distinguishable for every vision type", () => {
73
+ for (const vision of VISION_TYPES) {
74
+ const dark = simulateVision({ r: 40, g: 40, b: 40 }, vision);
75
+ const light = simulateVision({ r: 215, g: 215, b: 215 }, vision);
76
+ expect(contrastRatio(dark, light)).toBeGreaterThan(5);
77
+ }
78
+ });
79
+ });
80
+ describe("generated palettes, swept over seeds", () => {
81
+ it("always spans the contrast floor, under every vision type", () => {
82
+ const failures = [];
83
+ for (let i = 0; i < SEEDS; i++) {
84
+ const colours = drawPalette(createPrng(seedAt(i)), 5);
85
+ const worst = bestPairContrast(colours);
86
+ if (worst < MIN_PALETTE_CONTRAST) {
87
+ failures.push(`seed ${i}: ${worst.toFixed(3)}`);
88
+ }
89
+ }
90
+ expect(failures).toEqual([]);
91
+ });
92
+ it("holds the floor for every palette size the renderer asks for", () => {
93
+ for (const count of [2, 3, 4, 5, 6, 8]) {
94
+ for (let i = 0; i < 40; i++) {
95
+ const colours = drawPalette(createPrng(seedAt(i + count * 1000)), count);
96
+ expect(bestPairContrast(colours), `count ${count}, seed ${i}`).toBeGreaterThanOrEqual(MIN_PALETTE_CONTRAST);
97
+ }
98
+ }
99
+ });
100
+ it("still produces a range of palettes rather than clamping to the floor", () => {
101
+ const spans = new Set();
102
+ for (let i = 0; i < SEEDS; i++) {
103
+ spans.add(bestPairContrast(drawPalette(createPrng(seedAt(i)), 5)).toFixed(1));
104
+ }
105
+ expect(spans.size).toBeGreaterThan(4);
106
+ });
107
+ it("is still reproducible from its seed", () => {
108
+ expect(drawPalette(createPrng(seedAt(7)), 5)).toEqual(drawPalette(createPrng(seedAt(7)), 5));
109
+ });
110
+ });
111
+ const protrusionArcs = (shape, size, radiusFraction) => {
112
+ const cx = size / 2;
113
+ const cy = size / 2;
114
+ const radius = (size / 2) * radiusFraction;
115
+ const steps = 720;
116
+ let arcs = 0;
117
+ let previouslyInside = false;
118
+ let firstInside = null;
119
+ for (let i = 0; i < steps; i++) {
120
+ const angle = (i / steps) * Math.PI * 2;
121
+ const inside = shape.distance(cx + radius * Math.cos(angle), cy + radius * Math.sin(angle)) < 0;
122
+ if (firstInside === null) {
123
+ firstInside = inside;
124
+ }
125
+ else if (inside && !previouslyInside) {
126
+ arcs++;
127
+ }
128
+ previouslyInside = inside;
129
+ }
130
+ if (firstInside === true && previouslyInside) {
131
+ arcs++;
132
+ }
133
+ return arcs;
134
+ };
135
+ const coveredFraction = (shape, size) => {
136
+ let covered = 0;
137
+ for (let y = 0; y < size; y++) {
138
+ for (let x = 0; x < size; x++) {
139
+ covered += coverageFromDistance(shape.distance(x, y));
140
+ }
141
+ }
142
+ return covered / (size * size);
143
+ };
144
+ describe("the silhouette, swept over seeds", () => {
145
+ const SIZE = 64;
146
+ it("always has protruding tabs", () => {
147
+ const withoutTabs = [];
148
+ for (let i = 0; i < SEEDS; i++) {
149
+ const shape = createNotchShape(createPrng(seedAt(i)), SIZE);
150
+ if (protrusionArcs(shape, SIZE, 0.92) < 1) {
151
+ withoutTabs.push(i);
152
+ }
153
+ }
154
+ expect(withoutTabs).toEqual([]);
155
+ });
156
+ it("still varies per challenge", () => {
157
+ const signatures = new Set();
158
+ for (let i = 0; i < SEEDS; i++) {
159
+ const shape = createNotchShape(createPrng(seedAt(i)), SIZE);
160
+ signatures.add([
161
+ coveredFraction(shape, SIZE).toFixed(3),
162
+ protrusionArcs(shape, SIZE, 0.92),
163
+ protrusionArcs(shape, SIZE, 0.78),
164
+ ].join(":"));
165
+ }
166
+ expect(signatures.size).toBeGreaterThan(SEEDS * 0.8);
167
+ });
168
+ it("stays inside its bounding box", () => {
169
+ for (let i = 0; i < 60; i++) {
170
+ const shape = createNotchShape(createPrng(seedAt(i)), SIZE);
171
+ for (let t = 0; t < SIZE; t++) {
172
+ for (const [x, y] of [
173
+ [t, 0],
174
+ [t, SIZE - 1],
175
+ [0, t],
176
+ [SIZE - 1, t],
177
+ ]) {
178
+ expect(shape.distance(x, y), `seed ${i} at (${x},${y})`).toBeGreaterThan(0);
179
+ }
180
+ }
181
+ }
182
+ });
183
+ it("covers a usable fraction of its box", () => {
184
+ for (let i = 0; i < SEEDS; i++) {
185
+ const covered = coveredFraction(createNotchShape(createPrng(seedAt(i)), SIZE), SIZE);
186
+ expect(covered, `seed ${i}`).toBeGreaterThan(0.18);
187
+ expect(covered, `seed ${i}`).toBeLessThan(0.6);
188
+ }
189
+ });
190
+ it("varies how much of the box it fills", () => {
191
+ const buckets = new Set();
192
+ for (let i = 0; i < SEEDS; i++) {
193
+ buckets.add(coveredFraction(createNotchShape(createPrng(seedAt(i)), SIZE), SIZE).toFixed(2));
194
+ }
195
+ expect(buckets.size).toBeGreaterThan(10);
196
+ });
197
+ it("is reproducible from its seed", () => {
198
+ const a = createNotchShape(createPrng(seedAt(3)), SIZE);
199
+ const b = createNotchShape(createPrng(seedAt(3)), SIZE);
200
+ for (let t = 0; t < SIZE; t += 3) {
201
+ expect(a.distance(t, t)).toBe(b.distance(t, t));
202
+ }
203
+ });
204
+ });
205
+ const rimAndCore = (piece, shape) => {
206
+ const band = pieceRimGeometry(piece.width);
207
+ let rimTotal = 0;
208
+ let rimCount = 0;
209
+ let coreTotal = 0;
210
+ let coreCount = 0;
211
+ for (let y = 0; y < piece.height; y++) {
212
+ for (let x = 0; x < piece.width; x++) {
213
+ const o = (y * piece.width + x) * 4;
214
+ if ((piece.data[o + 3] ?? 0) < 250)
215
+ continue;
216
+ const luma = relativeLuminance({
217
+ r: piece.data[o] ?? 0,
218
+ g: piece.data[o + 1] ?? 0,
219
+ b: piece.data[o + 2] ?? 0,
220
+ });
221
+ const d = shape.distance(x, y);
222
+ if (d > -band.plateau && d < -0.5) {
223
+ rimTotal += luma;
224
+ rimCount++;
225
+ }
226
+ else if (d < -band.width - 2) {
227
+ coreTotal += luma;
228
+ coreCount++;
229
+ }
230
+ }
231
+ }
232
+ return {
233
+ rim: rimCount === 0 ? 0 : rimTotal / rimCount,
234
+ core: coreCount === 0 ? 0 : coreTotal / coreCount,
235
+ };
236
+ };
237
+ describe("the piece's separation cue, swept over seeds", () => {
238
+ const SIZE = 64;
239
+ it("always separates the rim from the body by a visible luminance step", () => {
240
+ const failures = [];
241
+ for (let i = 0; i < 120; i++) {
242
+ const prng = createPrng(seedAt(i));
243
+ const background = generateBackground(prng, 240, 160);
244
+ const shape = createNotchShape(prng, SIZE);
245
+ const { piece } = cutNotch(prng, background, shape, SIZE, { targetX: 120, targetY: 80 }, 0.55);
246
+ const { rim, core } = rimAndCore(piece, shape);
247
+ const ratio = (Math.max(rim, core) + 0.05) / (Math.min(rim, core) + 0.05);
248
+ if (ratio < 1.25) {
249
+ failures.push(`seed ${i}: ${ratio.toFixed(3)}`);
250
+ }
251
+ }
252
+ expect(failures).toEqual([]);
253
+ });
254
+ it("steps away from the piece rather than in a fixed direction", () => {
255
+ let lighterRim = 0;
256
+ let darkerRim = 0;
257
+ for (let i = 0; i < 120; i++) {
258
+ const prng = createPrng(seedAt(i + 5_000));
259
+ const background = generateBackground(prng, 240, 160);
260
+ const shape = createNotchShape(prng, SIZE);
261
+ const { piece } = cutNotch(prng, background, shape, SIZE, { targetX: 120, targetY: 80 }, 0.55);
262
+ const { rim, core } = rimAndCore(piece, shape);
263
+ if (rim > core) {
264
+ lighterRim++;
265
+ }
266
+ else {
267
+ darkerRim++;
268
+ }
269
+ }
270
+ expect(lighterRim).toBeGreaterThan(0);
271
+ expect(darkerRim).toBeGreaterThan(0);
272
+ });
273
+ it("survives being reduced to greyscale", () => {
274
+ for (let i = 0; i < 40; i++) {
275
+ const prng = createPrng(seedAt(i + 9_000));
276
+ const background = generateBackground(prng, 240, 160);
277
+ const shape = createNotchShape(prng, SIZE);
278
+ const { piece } = cutNotch(prng, background, shape, SIZE, { targetX: 120, targetY: 80 }, 0.55);
279
+ const grey = {
280
+ width: piece.width,
281
+ height: piece.height,
282
+ data: Buffer.from(piece.data),
283
+ };
284
+ for (let o = 0; o < grey.data.length; o += 4) {
285
+ const v = Math.round(0.2126 * (grey.data[o] ?? 0) +
286
+ 0.7152 * (grey.data[o + 1] ?? 0) +
287
+ 0.0722 * (grey.data[o + 2] ?? 0));
288
+ grey.data[o] = v;
289
+ grey.data[o + 1] = v;
290
+ grey.data[o + 2] = v;
291
+ }
292
+ const colour = rimAndCore(piece, shape);
293
+ const mono = rimAndCore(grey, shape);
294
+ const colourRatio = (Math.max(colour.rim, colour.core) + 0.05) /
295
+ (Math.min(colour.rim, colour.core) + 0.05);
296
+ const monoRatio = (Math.max(mono.rim, mono.core) + 0.05) /
297
+ (Math.min(mono.rim, mono.core) + 0.05);
298
+ expect(monoRatio, `seed ${i}`).toBeGreaterThan(1.2);
299
+ expect(Math.abs(monoRatio - colourRatio), `seed ${i}`).toBeLessThan(0.2);
300
+ }
301
+ });
302
+ it("keeps the cue for every dichromacy", () => {
303
+ for (let i = 0; i < 40; i++) {
304
+ const prng = createPrng(seedAt(i + 11_000));
305
+ const background = generateBackground(prng, 240, 160);
306
+ const shape = createNotchShape(prng, SIZE);
307
+ const { piece } = cutNotch(prng, background, shape, SIZE, { targetX: 120, targetY: 80 }, 0.55);
308
+ const { rim, core } = rimAndCore(piece, shape);
309
+ const toGrey = (luminance) => {
310
+ const v = Math.round(255 * luminance ** (1 / 2.2));
311
+ return { r: v, g: v, b: v };
312
+ };
313
+ for (const vision of VISION_TYPES) {
314
+ const ratio = contrastRatio(simulateVision(toGrey(rim), vision), simulateVision(toGrey(core), vision));
315
+ expect(ratio, `seed ${i}, ${vision}`).toBeGreaterThan(1.2);
316
+ }
317
+ }
318
+ });
319
+ });
320
+ //# sourceMappingURL=pieceReadability.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pieceReadability.unit.test.js","sourceRoot":"","sources":["../../src/tests/pieceReadability.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=renderReplay.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderReplay.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/renderReplay.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { DEFAULT_GEOMETRY, DEFAULT_RENDER_SETTINGS, createBackground, renderPuzzle, } from "../index.js";
3
+ const BACKGROUND_SEED = Buffer.from("00112233445566778899aabbccddeeff", "hex");
4
+ const RENDER_SEED = Buffer.from("ffeeddccbbaa99887766554433221100", "hex");
5
+ const PLACEMENT = { targetX: 191, targetY: 77 };
6
+ const render = (overrides) => {
7
+ const geometry = overrides.geometry ?? DEFAULT_GEOMETRY;
8
+ return renderPuzzle(createBackground(geometry, overrides.backgroundSeed ?? BACKGROUND_SEED), overrides.placement ?? PLACEMENT, geometry, overrides.settings ?? DEFAULT_RENDER_SETTINGS, overrides.renderSeed ?? RENDER_SEED);
9
+ };
10
+ describe("render replay from the stored record", () => {
11
+ it("reproduces the same imagery from the same stored inputs", async () => {
12
+ const served = await render({});
13
+ const replayed = await render({});
14
+ expect(replayed.background.equals(served.background)).toBe(true);
15
+ expect(replayed.piece.equals(served.piece)).toBe(true);
16
+ expect(replayed.pieceSize).toBe(served.pieceSize);
17
+ });
18
+ it("returns the render seed it was given, so the record can store it", async () => {
19
+ const served = await render({});
20
+ expect(served.seed.equals(RENDER_SEED)).toBe(true);
21
+ });
22
+ it("mints a fresh render seed when none is supplied", async () => {
23
+ const first = await renderPuzzle(createBackground(DEFAULT_GEOMETRY, BACKGROUND_SEED), PLACEMENT);
24
+ const second = await renderPuzzle(createBackground(DEFAULT_GEOMETRY, BACKGROUND_SEED), PLACEMENT);
25
+ expect(first.seed.equals(second.seed)).toBe(false);
26
+ expect(first.background.equals(second.background)).toBe(false);
27
+ });
28
+ it("changes the imagery when only the background seed differs", async () => {
29
+ const served = await render({});
30
+ const other = await render({
31
+ backgroundSeed: Buffer.from("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f", "hex"),
32
+ });
33
+ expect(other.background.equals(served.background)).toBe(false);
34
+ });
35
+ it("changes the imagery when only the render seed differs", async () => {
36
+ const served = await render({});
37
+ const other = await render({
38
+ renderSeed: Buffer.from("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f", "hex"),
39
+ });
40
+ expect(other.background.equals(served.background)).toBe(false);
41
+ });
42
+ it("changes the imagery when only the piece size differs", async () => {
43
+ const served = await render({});
44
+ const other = await render({
45
+ geometry: { ...DEFAULT_GEOMETRY, pieceSize: 61 },
46
+ });
47
+ expect(other.pieceSize).not.toBe(served.pieceSize);
48
+ expect(other.piece.equals(served.piece)).toBe(false);
49
+ });
50
+ it("changes the imagery when only the notch placement differs", async () => {
51
+ const served = await render({});
52
+ const other = await render({
53
+ placement: {
54
+ targetX: PLACEMENT.targetX + 30,
55
+ targetY: PLACEMENT.targetY,
56
+ },
57
+ });
58
+ expect(other.background.equals(served.background)).toBe(false);
59
+ });
60
+ const settingCases = [
61
+ { name: "decoyCount", value: DEFAULT_RENDER_SETTINGS.decoyCount + 3 },
62
+ { name: "decoyEdgeDarkness", value: 90 },
63
+ { name: "decoyBodyBrightness", value: 40 },
64
+ { name: "holeDarken", value: 0.2 },
65
+ { name: "decoyHoleDarken", value: 0.95 },
66
+ ];
67
+ for (const { name, value } of settingCases) {
68
+ it(`changes the imagery when only ${name} differs`, async () => {
69
+ const served = await render({});
70
+ const other = await render({
71
+ settings: { ...DEFAULT_RENDER_SETTINGS, [name]: value },
72
+ });
73
+ expect(other.background.equals(served.background)).toBe(false);
74
+ });
75
+ }
76
+ });
77
+ //# sourceMappingURL=renderReplay.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderReplay.unit.test.js","sourceRoot":"","sources":["../../src/tests/renderReplay.unit.test.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface RenderedPuzzle {
11
11
  background: Buffer;
12
12
  piece: Buffer;
13
13
  pieceSize: number;
14
+ seed: Buffer;
14
15
  }
15
16
  export interface PuzzleGeometry {
16
17
  width: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAE9B,UAAU,EAAE,MAAM,CAAC;IAEnB,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAMf,SAAS,EAAE,MAAM,CAAC;IAOlB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD,MAAM,WAAW,oBAAoB;IAOpC,UAAU,EAAE,MAAM,CAAC;IAMnB,iBAAiB,EAAE,MAAM,CAAC;IAM1B,mBAAmB,EAAE,MAAM,CAAC;IAM5B,UAAU,EAAE,MAAM,CAAC;IAOnB,eAAe,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAE9B,UAAU,EAAE,MAAM,CAAC;IAEnB,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,MAAM,CAAC;IAMlB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAMf,SAAS,EAAE,MAAM,CAAC;IAOlB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD,MAAM,WAAW,oBAAoB;IAOpC,UAAU,EAAE,MAAM,CAAC;IAMnB,iBAAiB,EAAE,MAAM,CAAC;IAM1B,mBAAmB,EAAE,MAAM,CAAC;IAM5B,UAAU,EAAE,MAAM,CAAC;IAOnB,eAAe,EAAE,MAAM,CAAC;CACxB"}