@prosopo/puzzle-assets 0.2.3 → 0.2.5
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.
- package/.turbo/turbo-build$colon$cjs.log +1 -1
- package/.turbo/turbo-build$colon$esm.log +24 -0
- package/.turbo/turbo-build$colon$tsc.log +4 -4
- package/.turbo/turbo-build$colon$types.log +1 -0
- package/CHANGELOG.md +14 -0
- package/dist/tsc/background.d.ts.map +1 -0
- package/dist/tsc/background.js +102 -0
- package/dist/tsc/background.js.map +1 -0
- package/dist/tsc/browser.d.ts.map +1 -0
- package/dist/tsc/browser.js +30 -0
- package/dist/tsc/browser.js.map +1 -0
- package/dist/tsc/compose.d.ts.map +1 -0
- package/dist/tsc/compose.js +136 -0
- package/dist/tsc/compose.js.map +1 -0
- package/dist/tsc/contrast.d.ts.map +1 -0
- package/dist/tsc/contrast.js +79 -0
- package/dist/tsc/contrast.js.map +1 -0
- package/dist/tsc/decoys.d.ts.map +1 -0
- package/dist/tsc/decoys.js +74 -0
- package/dist/tsc/decoys.js.map +1 -0
- package/dist/tsc/encode.d.ts.map +1 -0
- package/dist/tsc/encode.js +19 -0
- package/dist/tsc/encode.js.map +1 -0
- package/dist/tsc/index.d.ts.map +1 -0
- package/dist/tsc/index.js +44 -0
- package/dist/tsc/index.js.map +1 -0
- package/dist/tsc/notch.d.ts.map +1 -0
- package/dist/tsc/notch.js +114 -0
- package/dist/tsc/notch.js.map +1 -0
- package/dist/tsc/palette.d.ts.map +1 -0
- package/dist/tsc/palette.js +68 -0
- package/dist/tsc/palette.js.map +1 -0
- package/dist/tsc/prng.d.ts.map +1 -0
- package/dist/tsc/prng.js +41 -0
- package/dist/tsc/prng.js.map +1 -0
- package/dist/tsc/tests/pieceReadability.unit.test.d.ts.map +1 -0
- package/dist/tsc/tests/pieceReadability.unit.test.js.map +1 -0
- package/dist/tsc/tests/puzzleAssets.unit.test.d.ts.map +1 -0
- package/dist/tsc/tests/puzzleAssets.unit.test.js.map +1 -0
- package/dist/tsc/tests/renderReplay.unit.test.d.ts.map +1 -0
- package/dist/tsc/tests/renderReplay.unit.test.js.map +1 -0
- package/dist/tsc/types.d.ts.map +1 -0
- package/dist/tsc/types.js.map +1 -0
- package/dist/types/background.d.ts +4 -0
- package/dist/types/background.d.ts.map +1 -0
- package/dist/types/browser.d.ts +16 -0
- package/dist/types/browser.d.ts.map +1 -0
- package/dist/types/compose.d.ts +13 -0
- package/dist/types/compose.d.ts.map +1 -0
- package/dist/types/contrast.d.ts +9 -0
- package/dist/types/contrast.d.ts.map +1 -0
- package/dist/types/decoys.d.ts +5 -0
- package/dist/types/decoys.d.ts.map +1 -0
- package/dist/types/encode.d.ts +6 -0
- package/dist/types/encode.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/notch.d.ts +7 -0
- package/dist/types/notch.d.ts.map +1 -0
- package/dist/types/palette.d.ts +10 -0
- package/dist/types/palette.d.ts.map +1 -0
- package/dist/types/prng.d.ts +10 -0
- package/dist/types/prng.d.ts.map +1 -0
- package/dist/types/tests/pieceReadability.unit.test.d.ts +2 -0
- package/dist/types/tests/pieceReadability.unit.test.d.ts.map +1 -0
- package/dist/types/tests/puzzleAssets.unit.test.d.ts +2 -0
- package/dist/types/tests/puzzleAssets.unit.test.d.ts.map +1 -0
- package/dist/types/tests/renderReplay.unit.test.d.ts +2 -0
- package/dist/types/tests/renderReplay.unit.test.d.ts.map +1 -0
- package/dist/types/types.d.ts +29 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +12 -13
- package/vite.esm.config.ts +1 -1
- package/.turbo/turbo-build.log +0 -25
- package/dist/background.d.ts.map +0 -1
- package/dist/background.js.map +0 -1
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.js.map +0 -1
- package/dist/compose.d.ts.map +0 -1
- package/dist/compose.js.map +0 -1
- package/dist/contrast.d.ts.map +0 -1
- package/dist/contrast.js.map +0 -1
- package/dist/decoys.d.ts.map +0 -1
- package/dist/decoys.js.map +0 -1
- package/dist/encode.d.ts.map +0 -1
- package/dist/encode.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/notch.d.ts.map +0 -1
- package/dist/notch.js.map +0 -1
- package/dist/palette.d.ts.map +0 -1
- package/dist/palette.js.map +0 -1
- package/dist/prng.d.ts.map +0 -1
- package/dist/prng.js.map +0 -1
- package/dist/tests/pieceReadability.unit.test.d.ts.map +0 -1
- package/dist/tests/pieceReadability.unit.test.js.map +0 -1
- package/dist/tests/puzzleAssets.unit.test.d.ts.map +0 -1
- package/dist/tests/puzzleAssets.unit.test.js.map +0 -1
- package/dist/tests/renderReplay.unit.test.d.ts.map +0 -1
- package/dist/tests/renderReplay.unit.test.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{_virtual → esm/_virtual}/_rolldown/runtime.js +0 -0
- /package/dist/{background.js → esm/background.js} +0 -0
- /package/dist/{browser.js → esm/browser.js} +0 -0
- /package/dist/{compose.js → esm/compose.js} +0 -0
- /package/dist/{contrast.js → esm/contrast.js} +0 -0
- /package/dist/{decoys.js → esm/decoys.js} +0 -0
- /package/dist/{encode.js → esm/encode.js} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{notch.js → esm/notch.js} +0 -0
- /package/dist/{palette.js → esm/palette.js} +0 -0
- /package/dist/{prng.js → esm/prng.js} +0 -0
- /package/dist/{background.d.ts → tsc/background.d.ts} +0 -0
- /package/dist/{browser.d.ts → tsc/browser.d.ts} +0 -0
- /package/dist/{compose.d.ts → tsc/compose.d.ts} +0 -0
- /package/dist/{contrast.d.ts → tsc/contrast.d.ts} +0 -0
- /package/dist/{decoys.d.ts → tsc/decoys.d.ts} +0 -0
- /package/dist/{encode.d.ts → tsc/encode.d.ts} +0 -0
- /package/dist/{index.d.ts → tsc/index.d.ts} +0 -0
- /package/dist/{notch.d.ts → tsc/notch.d.ts} +0 -0
- /package/dist/{palette.d.ts → tsc/palette.d.ts} +0 -0
- /package/dist/{prng.d.ts → tsc/prng.d.ts} +0 -0
- /package/dist/{tests → tsc/tests}/pieceReadability.unit.test.d.ts +0 -0
- /package/dist/{tests → tsc/tests}/pieceReadability.unit.test.js +0 -0
- /package/dist/{tests → tsc/tests}/puzzleAssets.unit.test.d.ts +0 -0
- /package/dist/{tests → tsc/tests}/puzzleAssets.unit.test.js +0 -0
- /package/dist/{tests → tsc/tests}/renderReplay.unit.test.d.ts +0 -0
- /package/dist/{tests → tsc/tests}/renderReplay.unit.test.js +0 -0
- /package/dist/{types.d.ts → tsc/types.d.ts} +0 -0
- /package/dist/{types.js → tsc/types.js} +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
$ vite build --config vite.esm.config.ts --mode ${NODE_ENV:-development}
|
|
2
|
+
ViteEsmConfig: .
|
|
3
|
+
{ tsConfigPaths: [] }
|
|
4
|
+
{ externals: [] }
|
|
5
|
+
[33mThe plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the [1mresolve.tsconfigPaths[22m option. You can remove the plugin and set [1mresolve.tsconfigPaths: true[22m in your Vite config instead.[39m
|
|
6
|
+
[36mvite v8.1.6 [32mbuilding ssr environment for production...[36m[39m
|
|
7
|
+
Bundle build started
|
|
8
|
+
[2K
|
|
9
|
+
✓ 11 modules transformed.
|
|
10
|
+
rendering chunks...
|
|
11
|
+
computing gzip size...
|
|
12
|
+
dist/esm/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
|
|
13
|
+
dist/esm/prng.js 1.40 kB │ gzip: 0.73 kB
|
|
14
|
+
dist/esm/browser.js 1.66 kB │ gzip: 0.69 kB
|
|
15
|
+
dist/esm/encode.js 1.67 kB │ gzip: 0.82 kB
|
|
16
|
+
dist/esm/index.js 3.51 kB │ gzip: 1.41 kB
|
|
17
|
+
dist/esm/palette.js 3.99 kB │ gzip: 1.79 kB
|
|
18
|
+
dist/esm/contrast.js 4.03 kB │ gzip: 1.90 kB
|
|
19
|
+
dist/esm/background.js 4.25 kB │ gzip: 1.83 kB
|
|
20
|
+
dist/esm/notch.js 4.41 kB │ gzip: 1.81 kB
|
|
21
|
+
dist/esm/decoys.js 4.50 kB │ gzip: 1.93 kB
|
|
22
|
+
dist/esm/compose.js 10.51 kB │ gzip: 4.01 kB
|
|
23
|
+
|
|
24
|
+
[32m✓ built in 62ms[39m
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
$ tsc --build --verbose
|
|
2
|
-
|
|
2
|
+
12:56:04 PM - Projects in this build:
|
|
3
3
|
* ../../dev/config/tsconfig.json
|
|
4
4
|
* tsconfig.json
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
12:56:04 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/vite/vite.esm.config.ts' is older than output '../../dev/config/dist/tsc/tsconfig.tsbuildinfo'
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
12:56:04 PM - Project 'tsconfig.json' is out of date because output file 'dist/tsc/tsconfig.tsbuildinfo' does not exist
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
12:56:04 PM - Building project '/home/runner/work/captcha/captcha/packages/puzzle-assets/tsconfig.json'...
|
|
11
11
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$ tsc --project tsconfig.types.json
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @prosopo/puzzle-assets
|
|
2
2
|
|
|
3
|
+
## 0.2.5
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- 1966fc1: Bump the npm-minor-and-patch group across 1 directory with 15 updates
|
|
7
|
+
|
|
8
|
+
## 0.2.4
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 2086040: Each kind of build now writes to its own folder under dist: dist/esm (vite ESM), dist/cjs (vite CommonJS), dist/types (declarations), dist/tsc (plain tsc), dist/bundle and dist/bundle-webpack (bundles) and dist/native (the Rust addons). Turbo caches each folder separately, so building one variant no longer overwrites or invalidates another. Package exports point at the new folders; anything importing a file from dist by path has to add the variant folder.
|
|
12
|
+
|
|
13
|
+
The Rust addons are no longer committed. They are built into dist/native, in debug for development and tests and fully optimised when NODE_ENV=production, so building them now needs a Rust toolchain.
|
|
14
|
+
|
|
15
|
+
Code that found the repo root or its certificates by climbing a fixed number of folders up from its own file now starts from its package's folder instead (new `packageDir` in @prosopo/util/node). The fixed count stopped working once the build output moved one folder deeper.
|
|
16
|
+
|
|
3
17
|
## 0.2.3
|
|
4
18
|
### Patch Changes
|
|
5
19
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../src/background.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqF5C,eAAO,MAAM,kBAAkB,SACxB,IAAI,SACH,MAAM,UACL,MAAM,KACZ,SAmFF,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { drawPalette } from "./palette.js";
|
|
2
|
+
const GRAIN_AMPLITUDE = 5;
|
|
3
|
+
const VIGNETTE_STRENGTH = 0.16;
|
|
4
|
+
const clamp255 = (v) => (v < 0 ? 0 : v > 255 ? 255 : v);
|
|
5
|
+
const meshColourAt = (points, x, y) => {
|
|
6
|
+
let wSum = 0;
|
|
7
|
+
let r = 0;
|
|
8
|
+
let g = 0;
|
|
9
|
+
let b = 0;
|
|
10
|
+
for (const point of points) {
|
|
11
|
+
const dx = x - point.x;
|
|
12
|
+
const dy = y - point.y;
|
|
13
|
+
const w = Math.exp(-(dx * dx + dy * dy) / (2 * point.sigma * point.sigma));
|
|
14
|
+
wSum += w;
|
|
15
|
+
r += point.colour.r * w;
|
|
16
|
+
g += point.colour.g * w;
|
|
17
|
+
b += point.colour.b * w;
|
|
18
|
+
}
|
|
19
|
+
if (wSum < 1e-6) {
|
|
20
|
+
let best = points[0];
|
|
21
|
+
if (!best)
|
|
22
|
+
throw new Error("puzzle-assets: no mesh points");
|
|
23
|
+
let bestD = Number.POSITIVE_INFINITY;
|
|
24
|
+
for (const point of points) {
|
|
25
|
+
const d = (x - point.x) ** 2 + (y - point.y) ** 2;
|
|
26
|
+
if (d < bestD) {
|
|
27
|
+
bestD = d;
|
|
28
|
+
best = point;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return best.colour;
|
|
32
|
+
}
|
|
33
|
+
return { r: r / wSum, g: g / wSum, b: b / wSum };
|
|
34
|
+
};
|
|
35
|
+
export const generateBackground = (prng, width, height) => {
|
|
36
|
+
const pointCount = prng.int(4, 6);
|
|
37
|
+
const palette = drawPalette(prng, pointCount);
|
|
38
|
+
const blobPalette = drawPalette(prng, 3);
|
|
39
|
+
const minDimension = Math.min(width, height);
|
|
40
|
+
const points = [];
|
|
41
|
+
for (let i = 0; i < pointCount; i++) {
|
|
42
|
+
const colour = palette[i];
|
|
43
|
+
if (!colour)
|
|
44
|
+
throw new Error("puzzle-assets: palette underflow");
|
|
45
|
+
points.push({
|
|
46
|
+
x: prng.range(-0.15, 1.15) * width,
|
|
47
|
+
y: prng.range(-0.15, 1.15) * height,
|
|
48
|
+
colour,
|
|
49
|
+
sigma: prng.range(0.26, 0.48) * minDimension,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const blobs = [];
|
|
53
|
+
const blobCount = prng.int(2, 4);
|
|
54
|
+
for (let i = 0; i < blobCount; i++) {
|
|
55
|
+
const colour = blobPalette[i % blobPalette.length];
|
|
56
|
+
if (!colour)
|
|
57
|
+
throw new Error("puzzle-assets: palette underflow");
|
|
58
|
+
blobs.push({
|
|
59
|
+
x: prng.range(0.1, 0.9) * width,
|
|
60
|
+
y: prng.range(0.1, 0.9) * height,
|
|
61
|
+
sigma: prng.range(0.18, 0.38) * minDimension,
|
|
62
|
+
colour,
|
|
63
|
+
alpha: prng.range(0.16, 0.32),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const data = Buffer.alloc(width * height * 4);
|
|
67
|
+
const cx = width / 2;
|
|
68
|
+
const cy = height / 2;
|
|
69
|
+
const maxRadius = Math.sqrt(cx * cx + cy * cy);
|
|
70
|
+
for (let y = 0; y < height; y++) {
|
|
71
|
+
for (let x = 0; x < width; x++) {
|
|
72
|
+
const base = meshColourAt(points, x, y);
|
|
73
|
+
let r = base.r;
|
|
74
|
+
let g = base.g;
|
|
75
|
+
let b = base.b;
|
|
76
|
+
for (const blob of blobs) {
|
|
77
|
+
const dx = x - blob.x;
|
|
78
|
+
const dy = y - blob.y;
|
|
79
|
+
const a = blob.alpha *
|
|
80
|
+
Math.exp(-(dx * dx + dy * dy) / (2 * blob.sigma * blob.sigma));
|
|
81
|
+
r += (blob.colour.r - r) * a;
|
|
82
|
+
g += (blob.colour.g - g) * a;
|
|
83
|
+
b += (blob.colour.b - b) * a;
|
|
84
|
+
}
|
|
85
|
+
const dxc = x - cx;
|
|
86
|
+
const dyc = y - cy;
|
|
87
|
+
const vignette = 1 -
|
|
88
|
+
VIGNETTE_STRENGTH * ((dxc * dxc + dyc * dyc) / (maxRadius * maxRadius));
|
|
89
|
+
r *= vignette;
|
|
90
|
+
g *= vignette;
|
|
91
|
+
b *= vignette;
|
|
92
|
+
const grain = (prng.next() - 0.5) * 2 * GRAIN_AMPLITUDE;
|
|
93
|
+
const i = (y * width + x) * 4;
|
|
94
|
+
data[i] = clamp255(Math.round(r + grain));
|
|
95
|
+
data[i + 1] = clamp255(Math.round(g + grain));
|
|
96
|
+
data[i + 2] = clamp255(Math.round(b + grain));
|
|
97
|
+
data[i + 3] = 255;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { data, width, height };
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/background.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,SAAS,EACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,SAAS,GACT,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gBAAgB,EAAE,cAI9B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,oBAMrC,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,EAAE,MAAM,CAAC;CACb;AAOD,eAAO,MAAM,kBAAkB,eAClB,SAAS,aACV,cAAc,aACf,cAAc,aACd,oBAAoB,SACxB,MAAM,KACV,kBAuBF,CAAC;AAEF,eAAO,MAAM,gBAAgB,cAClB,cAAc,SAClB,MAAM,KACV,SACmE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { generateBackground } from "./background.js";
|
|
2
|
+
import { cutNotch } from "./compose.js";
|
|
3
|
+
import { paintDecoys } from "./decoys.js";
|
|
4
|
+
import { createNotchShape } from "./notch.js";
|
|
5
|
+
import { createPrng, createSeed } from "./prng.js";
|
|
6
|
+
export { createPrng, createSeed, SEED_BYTES } from "./prng.js";
|
|
7
|
+
export { generateBackground } from "./background.js";
|
|
8
|
+
export { paintDecoys, paintDecoyPiece } from "./decoys.js";
|
|
9
|
+
export const DEFAULT_GEOMETRY = {
|
|
10
|
+
width: 300,
|
|
11
|
+
height: 200,
|
|
12
|
+
notchSize: 44,
|
|
13
|
+
};
|
|
14
|
+
export const DEFAULT_RENDER_SETTINGS = {
|
|
15
|
+
decoyCount: 5,
|
|
16
|
+
decoyEdgeDarkness: 20,
|
|
17
|
+
decoyBodyBrightness: 4,
|
|
18
|
+
holeDarken: 0.55,
|
|
19
|
+
decoyHoleDarken: 0.7,
|
|
20
|
+
};
|
|
21
|
+
export const renderPuzzleToRgba = (background, placement, geometry = DEFAULT_GEOMETRY, settings = DEFAULT_RENDER_SETTINGS, seed = createSeed()) => {
|
|
22
|
+
const prng = createPrng(seed);
|
|
23
|
+
const pieceSize = geometry.pieceSize ?? geometry.notchSize;
|
|
24
|
+
paintDecoys(background, prng, settings.decoyCount, pieceSize, placement, settings.decoyEdgeDarkness, settings.decoyBodyBrightness, settings.decoyHoleDarken);
|
|
25
|
+
const shape = createNotchShape(prng, pieceSize);
|
|
26
|
+
const { background: cut, piece } = cutNotch(prng, background, shape, pieceSize, placement, settings.holeDarken);
|
|
27
|
+
return { background: cut, piece, pieceSize, seed };
|
|
28
|
+
};
|
|
29
|
+
export const createBackground = (geometry = DEFAULT_GEOMETRY, seed = createSeed()) => generateBackground(createPrng(seed), geometry.width, geometry.height);
|
|
30
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS3D,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC/C,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,SAAS,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAyB;IAC5D,UAAU,EAAE,CAAC;IACb,iBAAiB,EAAE,EAAE;IACrB,mBAAmB,EAAE,CAAC;IACtB,UAAU,EAAE,IAAI;IAChB,eAAe,EAAE,GAAG;CACpB,CAAC;AAeF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,UAAqB,EACrB,SAAyB,EACzB,WAA2B,gBAAgB,EAC3C,WAAiC,uBAAuB,EACxD,OAAe,UAAU,EAAE,EACN,EAAE;IACvB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;IAC3D,WAAW,CACV,UAAU,EACV,IAAI,EACJ,QAAQ,CAAC,UAAU,EACnB,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,iBAAiB,EAC1B,QAAQ,CAAC,mBAAmB,EAC5B,QAAQ,CAAC,eAAe,CACxB,CAAC;IACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,QAAQ,CAC1C,IAAI,EACJ,UAAU,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,QAAQ,CAAC,UAAU,CACnB,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,WAA2B,gBAAgB,EAC3C,OAAe,UAAU,EAAE,EACf,EAAE,CACd,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/compose.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAsE5D,eAAO,MAAM,gBAAgB,SACtB,MAAM,KACV;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAalC,CAAC;AAmIF,MAAM,WAAW,SAAS;IAEzB,UAAU,EAAE,SAAS,CAAC;IAEtB,KAAK,EAAE,SAAS,CAAC;CACjB;AAQD,eAAO,MAAM,QAAQ,SACd,IAAI,cACE,SAAS,SACd,UAAU,QACX,MAAM,aACD,cAAc,cACb,MAAM,KAChB,SAyHF,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { relativeLuminance } from "./contrast.js";
|
|
2
|
+
import { coverageFromDistance } from "./notch.js";
|
|
3
|
+
const PIECE_NOISE = 7;
|
|
4
|
+
const PIECE_BRIGHTNESS_RANGE = [-8, 8];
|
|
5
|
+
const SEAM_NOISE_RADIUS = 3;
|
|
6
|
+
const SEAM_NOISE = 4;
|
|
7
|
+
const HOLE_INNER_SHADOW = 0.45;
|
|
8
|
+
const PIECE_EDGE_LIGHT = 8;
|
|
9
|
+
const PIECE_RIM_PLATEAU_RATIO = 0.03;
|
|
10
|
+
const PIECE_RIM_WIDTH_RATIO = 0.065;
|
|
11
|
+
const PIECE_RIM_MIN_PLATEAU = 1;
|
|
12
|
+
const PIECE_RIM_MIN_WIDTH = 2.2;
|
|
13
|
+
export const pieceRimGeometry = (size) => {
|
|
14
|
+
const plateau = Math.max(PIECE_RIM_MIN_PLATEAU, size * PIECE_RIM_PLATEAU_RATIO);
|
|
15
|
+
return {
|
|
16
|
+
plateau,
|
|
17
|
+
width: Math.max(PIECE_RIM_MIN_WIDTH, size * PIECE_RIM_WIDTH_RATIO, plateau + 1),
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
const PIECE_RIM_TARGET_CONTRAST = 1.5;
|
|
21
|
+
const PIECE_RIM_MAX_STEP = 72;
|
|
22
|
+
const PIECE_RIM_DIRECTION_THRESHOLD = 0.4;
|
|
23
|
+
const clamp255 = (v) => (v < 0 ? 0 : v > 255 ? 255 : v);
|
|
24
|
+
const sampleBackground = (image, x, y) => {
|
|
25
|
+
if (x < 0 || y < 0 || x >= image.width || y >= image.height) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const i = (y * image.width + x) * 4;
|
|
29
|
+
return [image.data[i] ?? 0, image.data[i + 1] ?? 0, image.data[i + 2] ?? 0];
|
|
30
|
+
};
|
|
31
|
+
const rimProfile = (d, plateau, width) => {
|
|
32
|
+
if (d <= -width)
|
|
33
|
+
return 0;
|
|
34
|
+
if (d >= -plateau)
|
|
35
|
+
return 1;
|
|
36
|
+
return (d + width) / (width - plateau);
|
|
37
|
+
};
|
|
38
|
+
const byteForLuminance = (luminance) => 255 * Math.max(0, Math.min(1, luminance)) ** (1 / 2.2);
|
|
39
|
+
const pieceRimDelta = (background, shape, size, left, top) => {
|
|
40
|
+
let total = 0;
|
|
41
|
+
let counted = 0;
|
|
42
|
+
for (let ly = 0; ly < size; ly += 4) {
|
|
43
|
+
for (let lx = 0; lx < size; lx += 4) {
|
|
44
|
+
if (coverageFromDistance(shape.distance(lx, ly)) <= 0)
|
|
45
|
+
continue;
|
|
46
|
+
const sample = sampleBackground(background, left + lx, top + ly);
|
|
47
|
+
if (sample === null)
|
|
48
|
+
continue;
|
|
49
|
+
total += relativeLuminance({ r: sample[0], g: sample[1], b: sample[2] });
|
|
50
|
+
counted++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (counted === 0)
|
|
54
|
+
return PIECE_RIM_MAX_STEP;
|
|
55
|
+
const pieceLuminance = total / counted;
|
|
56
|
+
const lighten = pieceLuminance <= PIECE_RIM_DIRECTION_THRESHOLD;
|
|
57
|
+
const target = lighten
|
|
58
|
+
? PIECE_RIM_TARGET_CONTRAST * (pieceLuminance + 0.05) - 0.05
|
|
59
|
+
: (pieceLuminance + 0.05) / PIECE_RIM_TARGET_CONTRAST - 0.05;
|
|
60
|
+
const delta = byteForLuminance(target) - byteForLuminance(pieceLuminance);
|
|
61
|
+
const capped = Math.max(-PIECE_RIM_MAX_STEP, Math.min(PIECE_RIM_MAX_STEP, delta));
|
|
62
|
+
const floor = 24;
|
|
63
|
+
if (Math.abs(capped) < floor) {
|
|
64
|
+
return lighten ? floor : -floor;
|
|
65
|
+
}
|
|
66
|
+
return capped;
|
|
67
|
+
};
|
|
68
|
+
export const cutNotch = (prng, background, shape, size, placement, holeDarken) => {
|
|
69
|
+
const half = size / 2;
|
|
70
|
+
const left = Math.round(placement.targetX - half);
|
|
71
|
+
const top = Math.round(placement.targetY - half);
|
|
72
|
+
const pieceData = Buffer.alloc(size * size * 4);
|
|
73
|
+
const brightness = prng.range(PIECE_BRIGHTNESS_RANGE[0], PIECE_BRIGHTNESS_RANGE[1]);
|
|
74
|
+
const rimStep = pieceRimDelta(background, shape, size, left, top);
|
|
75
|
+
const rim = pieceRimGeometry(size);
|
|
76
|
+
for (let ly = 0; ly < size; ly++) {
|
|
77
|
+
for (let lx = 0; lx < size; lx++) {
|
|
78
|
+
const d = shape.distance(lx, ly);
|
|
79
|
+
const coverage = coverageFromDistance(d);
|
|
80
|
+
const pi = (ly * size + lx) * 4;
|
|
81
|
+
if (coverage <= 0) {
|
|
82
|
+
pieceData[pi + 3] = 0;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const sample = sampleBackground(background, left + lx, top + ly);
|
|
86
|
+
if (sample === null) {
|
|
87
|
+
pieceData[pi + 3] = 0;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const [r, g, b] = sample;
|
|
91
|
+
const edgeLight = d > -2 ? PIECE_EDGE_LIGHT * (1 + d / 2) : 0;
|
|
92
|
+
const rimDelta = rimStep * rimProfile(d, rim.plateau, rim.width);
|
|
93
|
+
const noise = (prng.next() - 0.5) * 2 * PIECE_NOISE;
|
|
94
|
+
const delta = brightness + edgeLight + rimDelta + noise;
|
|
95
|
+
pieceData[pi] = clamp255(Math.round(r + delta));
|
|
96
|
+
pieceData[pi + 1] = clamp255(Math.round(g + delta));
|
|
97
|
+
pieceData[pi + 2] = clamp255(Math.round(b + delta));
|
|
98
|
+
pieceData[pi + 3] = Math.round(coverage * 255);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (let ly = -SEAM_NOISE_RADIUS; ly < size + SEAM_NOISE_RADIUS; ly++) {
|
|
102
|
+
for (let lx = -SEAM_NOISE_RADIUS; lx < size + SEAM_NOISE_RADIUS; lx++) {
|
|
103
|
+
const x = left + lx;
|
|
104
|
+
const y = top + ly;
|
|
105
|
+
if (x < 0 || y < 0 || x >= background.width || y >= background.height) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const bi = (y * background.width + x) * 4;
|
|
109
|
+
const d = shape.distance(lx, ly);
|
|
110
|
+
const coverage = coverageFromDistance(d);
|
|
111
|
+
if (coverage > 0) {
|
|
112
|
+
const r = background.data[bi] ?? 0;
|
|
113
|
+
const g = background.data[bi + 1] ?? 0;
|
|
114
|
+
const b = background.data[bi + 2] ?? 0;
|
|
115
|
+
const edge = d > -3 ? HOLE_INNER_SHADOW * (1 + d / 3) : 0;
|
|
116
|
+
const factor = holeDarken * (1 - edge);
|
|
117
|
+
const mix = coverage;
|
|
118
|
+
background.data[bi] = clamp255(Math.round(r * (1 - mix) + r * factor * mix));
|
|
119
|
+
background.data[bi + 1] = clamp255(Math.round(g * (1 - mix) + g * factor * mix));
|
|
120
|
+
background.data[bi + 2] = clamp255(Math.round(b * (1 - mix) + b * factor * mix));
|
|
121
|
+
}
|
|
122
|
+
else if (d < SEAM_NOISE_RADIUS) {
|
|
123
|
+
const falloff = 1 - d / SEAM_NOISE_RADIUS;
|
|
124
|
+
const noise = (prng.next() - 0.5) * 2 * SEAM_NOISE * falloff;
|
|
125
|
+
background.data[bi] = clamp255(Math.round((background.data[bi] ?? 0) + noise));
|
|
126
|
+
background.data[bi + 1] = clamp255(Math.round((background.data[bi + 1] ?? 0) + noise));
|
|
127
|
+
background.data[bi + 2] = clamp255(Math.round((background.data[bi + 2] ?? 0) + noise));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
background,
|
|
133
|
+
piece: { data: pieceData, width: size, height: size },
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contrast.d.ts","sourceRoot":"","sources":["../../src/contrast.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAmBxC,MAAM,MAAM,UAAU,GACnB,QAAQ,GACR,YAAY,GACZ,cAAc,GACd,YAAY,CAAC;AAEhB,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAK7C,CAAC;AAqBF,eAAO,MAAM,iBAAiB,WAAY,GAAG,KAAG,MAGpB,CAAC;AAQ7B,eAAO,MAAM,aAAa,MAAO,GAAG,KAAK,GAAG,KAAG,MAM9C,CAAC;AA8CF,eAAO,MAAM,cAAc,WAAY,GAAG,UAAU,UAAU,KAAG,GAahE,CAAC;AASF,eAAO,MAAM,iBAAiB,MAAO,GAAG,KAAK,GAAG,KAAG,MAYlD,CAAC;AAWF,eAAO,MAAM,gBAAgB,YAAa,SAAS,GAAG,EAAE,KAAG,MAc1D,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const VISION_TYPES = [
|
|
2
|
+
"normal",
|
|
3
|
+
"protanopia",
|
|
4
|
+
"deuteranopia",
|
|
5
|
+
"tritanopia",
|
|
6
|
+
];
|
|
7
|
+
const toLinear = (channel) => {
|
|
8
|
+
const c = channel / 255;
|
|
9
|
+
return c <= 0.040_45 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
10
|
+
};
|
|
11
|
+
const fromLinear = (value) => {
|
|
12
|
+
const c = value <= 0.003_130_8 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;
|
|
13
|
+
return Math.min(255, Math.max(0, Math.round(c * 255)));
|
|
14
|
+
};
|
|
15
|
+
export const relativeLuminance = (colour) => 0.2126 * toLinear(colour.r) +
|
|
16
|
+
0.7152 * toLinear(colour.g) +
|
|
17
|
+
0.0722 * toLinear(colour.b);
|
|
18
|
+
export const contrastRatio = (a, b) => {
|
|
19
|
+
const la = relativeLuminance(a);
|
|
20
|
+
const lb = relativeLuminance(b);
|
|
21
|
+
const lighter = Math.max(la, lb);
|
|
22
|
+
const darker = Math.min(la, lb);
|
|
23
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
24
|
+
};
|
|
25
|
+
const DICHROMACY_MATRICES = {
|
|
26
|
+
protanopia: [
|
|
27
|
+
0.152_86, 1.175_79, -0.328_65, 0.114_75, 0.854_26, 0.030_99, -0.003_86,
|
|
28
|
+
-0.005_34, 1.009_2,
|
|
29
|
+
],
|
|
30
|
+
deuteranopia: [
|
|
31
|
+
0.367_7, 0.861_22, -0.228_92, 0.280_39, 0.672_01, 0.047_6, -0.011_8,
|
|
32
|
+
0.041_64, 0.970_16,
|
|
33
|
+
],
|
|
34
|
+
tritanopia: [
|
|
35
|
+
1.255_28, -0.076_57, -0.178_71, -0.078_33, 0.930_87, 0.147_46, 0.004_91,
|
|
36
|
+
0.221_4, 0.773_09,
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
export const simulateVision = (colour, vision) => {
|
|
40
|
+
if (vision === "normal") {
|
|
41
|
+
return colour;
|
|
42
|
+
}
|
|
43
|
+
const m = DICHROMACY_MATRICES[vision];
|
|
44
|
+
const r = toLinear(colour.r);
|
|
45
|
+
const g = toLinear(colour.g);
|
|
46
|
+
const b = toLinear(colour.b);
|
|
47
|
+
return {
|
|
48
|
+
r: fromLinear(m[0] * r + m[1] * g + m[2] * b),
|
|
49
|
+
g: fromLinear(m[3] * r + m[4] * g + m[5] * b),
|
|
50
|
+
b: fromLinear(m[6] * r + m[7] * g + m[8] * b),
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export const worstCaseContrast = (a, b) => {
|
|
54
|
+
let worst = Number.POSITIVE_INFINITY;
|
|
55
|
+
for (const vision of VISION_TYPES) {
|
|
56
|
+
const ratio = contrastRatio(simulateVision(a, vision), simulateVision(b, vision));
|
|
57
|
+
if (ratio < worst) {
|
|
58
|
+
worst = ratio;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return worst;
|
|
62
|
+
};
|
|
63
|
+
export const bestPairContrast = (colours) => {
|
|
64
|
+
let best = 1;
|
|
65
|
+
for (let i = 0; i < colours.length; i++) {
|
|
66
|
+
for (let j = i + 1; j < colours.length; j++) {
|
|
67
|
+
const a = colours[i];
|
|
68
|
+
const b = colours[j];
|
|
69
|
+
if (a === undefined || b === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
const ratio = worstCaseContrast(a, b);
|
|
72
|
+
if (ratio > best) {
|
|
73
|
+
best = ratio;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return best;
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=contrast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contrast.js","sourceRoot":"","sources":["../../src/contrast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoys.d.ts","sourceRoot":"","sources":["../../src/decoys.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+C5D,eAAO,MAAM,eAAe,eACf,SAAS,QACf,IAAI,QACJ,MAAM,MACR,MAAM,MACN,MAAM,gBACI,MAAM,kBACJ,MAAM,cACV,MAAM,KAChB,IAiDF,CAAC;AAkBF,eAAO,MAAM,WAAW,eACX,SAAS,QACf,IAAI,eACG,MAAM,aACR,MAAM,SACV,cAAc,gBACP,MAAM,kBACJ,MAAM,cACV,MAAM,KAChB,IAyCF,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createNotchShape } from "./notch.js";
|
|
2
|
+
import { coverageFromDistance } from "./notch.js";
|
|
3
|
+
const NOTCH_CLEARANCE = 0;
|
|
4
|
+
const PLACEMENT_ATTEMPTS = 8;
|
|
5
|
+
const clamp255 = (v) => (v < 0 ? 0 : v > 255 ? 255 : v);
|
|
6
|
+
const distanceSquared = (cx, cy, other) => {
|
|
7
|
+
const dx = cx - other.cx;
|
|
8
|
+
const dy = cy - other.cy;
|
|
9
|
+
return dx * dx + dy * dy;
|
|
10
|
+
};
|
|
11
|
+
const DECOY_INNER_SHADOW = 0.35;
|
|
12
|
+
export const paintDecoyPiece = (background, prng, size, cx, cy, edgeDarkness, bodyBrightness, holeDarken) => {
|
|
13
|
+
const shape = createNotchShape(prng, size);
|
|
14
|
+
const half = size / 2;
|
|
15
|
+
const left = Math.round(cx - half);
|
|
16
|
+
const top = Math.round(cy - half);
|
|
17
|
+
for (let ly = 0; ly < size; ly++) {
|
|
18
|
+
for (let lx = 0; lx < size; lx++) {
|
|
19
|
+
const x = left + lx;
|
|
20
|
+
const y = top + ly;
|
|
21
|
+
if (x < 0 || y < 0 || x >= background.width || y >= background.height) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const d = shape.distance(lx, ly);
|
|
25
|
+
const coverage = coverageFromDistance(d);
|
|
26
|
+
if (coverage <= 0)
|
|
27
|
+
continue;
|
|
28
|
+
const bi = (y * background.width + x) * 4;
|
|
29
|
+
const r = background.data[bi] ?? 0;
|
|
30
|
+
const g = background.data[bi + 1] ?? 0;
|
|
31
|
+
const b = background.data[bi + 2] ?? 0;
|
|
32
|
+
const edge = d > -3 ? DECOY_INNER_SHADOW * (1 + d / 3) : 0;
|
|
33
|
+
const factor = holeDarken * (1 - edge);
|
|
34
|
+
const dr = r * factor;
|
|
35
|
+
const dg = g * factor;
|
|
36
|
+
const db = b * factor;
|
|
37
|
+
const edgeDark = d > -3 ? edgeDarkness * (1 + d / 3) : 0;
|
|
38
|
+
const delta = bodyBrightness - edgeDark;
|
|
39
|
+
const mixR = r * (1 - coverage) + dr * coverage;
|
|
40
|
+
const mixG = g * (1 - coverage) + dg * coverage;
|
|
41
|
+
const mixB = b * (1 - coverage) + db * coverage;
|
|
42
|
+
background.data[bi] = clamp255(Math.round(mixR + delta * coverage));
|
|
43
|
+
background.data[bi + 1] = clamp255(Math.round(mixG + delta * coverage));
|
|
44
|
+
background.data[bi + 2] = clamp255(Math.round(mixB + delta * coverage));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const COUNT_JITTER = 0.3;
|
|
49
|
+
export const paintDecoys = (background, prng, targetCount, notchSize, notch, edgeDarkness, bodyBrightness, holeDarken) => {
|
|
50
|
+
if (targetCount <= 0)
|
|
51
|
+
return;
|
|
52
|
+
const jitter = 1 + prng.range(-COUNT_JITTER, COUNT_JITTER);
|
|
53
|
+
const count = Math.max(0, Math.round(targetCount * jitter));
|
|
54
|
+
if (count === 0)
|
|
55
|
+
return;
|
|
56
|
+
const notchClearanceSq = (notchSize * NOTCH_CLEARANCE) ** 2;
|
|
57
|
+
const minX = 0;
|
|
58
|
+
const maxX = background.width;
|
|
59
|
+
const minY = 0;
|
|
60
|
+
const maxY = background.height;
|
|
61
|
+
for (let i = 0; i < count; i++) {
|
|
62
|
+
for (let attempt = 0; attempt < PLACEMENT_ATTEMPTS; attempt++) {
|
|
63
|
+
const cx = prng.range(minX, maxX);
|
|
64
|
+
const cy = prng.range(minY, maxY);
|
|
65
|
+
if (distanceSquared(cx, cy, { cx: notch.targetX, cy: notch.targetY }) <
|
|
66
|
+
notchClearanceSq) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
paintDecoyPiece(background, prng, notchSize, cx, cy, edgeDarkness, bodyBrightness, holeDarken);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=decoys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoys.js","sourceRoot":"","sources":["../../src/decoys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa5C,eAAO,MAAM,gBAAgB,UAAW,SAAS,KAAG,OAAO,CAAC,MAAM,CAKrD,CAAC;AASd,eAAO,MAAM,WAAW,UAAW,SAAS,KAAG,OAAO,CAAC,MAAM,CAKhD,CAAC;AAGd,eAAO,MAAM,SAAS,UAAW,SAAS,KAAG,OAAO,CAAC,MAAM,CAK9C,CAAC;AAEd,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,MACW,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import sharp from "sharp";
|
|
2
|
+
const BACKGROUND_QUALITY = 95;
|
|
3
|
+
export const encodeBackground = (image) => sharp(image.data, {
|
|
4
|
+
raw: { width: image.width, height: image.height, channels: 4 },
|
|
5
|
+
})
|
|
6
|
+
.webp({ quality: BACKGROUND_QUALITY, alphaQuality: 100, effort: 4 })
|
|
7
|
+
.toBuffer();
|
|
8
|
+
export const encodePiece = (image) => sharp(image.data, {
|
|
9
|
+
raw: { width: image.width, height: image.height, channels: 4 },
|
|
10
|
+
})
|
|
11
|
+
.webp({ lossless: true, alphaQuality: 100, effort: 4 })
|
|
12
|
+
.toBuffer();
|
|
13
|
+
export const encodePng = (image) => sharp(image.data, {
|
|
14
|
+
raw: { width: image.width, height: image.height, channels: 4 },
|
|
15
|
+
})
|
|
16
|
+
.png()
|
|
17
|
+
.toBuffer();
|
|
18
|
+
export const toDataUri = (webp) => `data:image/webp;base64,${webp.toString("base64")}`;
|
|
19
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAgB,EAAmB,EAAE,CACrE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;CAC9D,CAAC;KACA,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KACnE,QAAQ,EAAE,CAAC;AASd,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAmB,EAAE,CAChE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;CAC9D,CAAC;KACA,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KACtD,QAAQ,EAAE,CAAC;AAGd,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAgB,EAAmB,EAAE,CAC9D,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IACjB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;CAC9D,CAAC;KACA,GAAG,EAAE;KACL,QAAQ,EAAE,CAAC;AAEd,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CACjD,0BAA0B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,SAAS,EACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,YAAY,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACN,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,UAAU,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,oBAAoB,EACpB,WAAW,EACX,QAAQ,EACR,KAAK,GAAG,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACN,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,SAAS,GACT,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,gBAAgB,EAAE,cAI9B,CAAC;AAQF,eAAO,MAAM,uBAAuB,EAAE,oBAMrC,CAAC;AAQF,eAAO,MAAM,gBAAgB,cAClB,cAAc,SAClB,MAAM,KACV,SACmE,CAAC;AAOvE,eAAO,MAAM,YAAY,eACZ,SAAS,aACV,cAAc,aACf,cAAc,aACd,oBAAoB,SACxB,MAAM,KACV,OAAO,CAAC,cAAc,CAsCxB,CAAC;AASF,eAAO,MAAM,YAAY,cACb,cAAc,aACf,cAAc,aACd,oBAAoB,mBACd,MAAM,eACV,MAAM,KAChB,OAAO,CAAC,cAAc,CAOvB,CAAC"}
|