canvas-emulator 1.0.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.
- package/.gitignore +233 -0
- package/CLAUDE.md +61 -0
- package/README.md +128 -0
- package/dist/cjs/playground.d.ts +2 -0
- package/dist/cjs/playground.d.ts.map +1 -0
- package/dist/cjs/playground.js +37 -0
- package/dist/cjs/playground.js.map +1 -0
- package/dist/cjs/src/canvas/canvas.d.ts +41 -0
- package/dist/cjs/src/canvas/canvas.d.ts.map +1 -0
- package/dist/cjs/src/canvas/canvas.js +83 -0
- package/dist/cjs/src/canvas/canvas.js.map +1 -0
- package/dist/cjs/src/canvas/context-2d.d.ts +37 -0
- package/dist/cjs/src/canvas/context-2d.d.ts.map +1 -0
- package/dist/cjs/src/canvas/context-2d.js +245 -0
- package/dist/cjs/src/canvas/context-2d.js.map +1 -0
- package/dist/cjs/src/canvas/index.d.ts +2 -0
- package/dist/cjs/src/canvas/index.d.ts.map +1 -0
- package/dist/cjs/src/canvas/index.js +18 -0
- package/dist/cjs/src/canvas/index.js.map +1 -0
- package/dist/cjs/src/common/array.d.ts +40 -0
- package/dist/cjs/src/common/array.d.ts.map +1 -0
- package/dist/cjs/src/common/array.js +99 -0
- package/dist/cjs/src/common/array.js.map +1 -0
- package/dist/cjs/src/common/colors.d.ts +62 -0
- package/dist/cjs/src/common/colors.d.ts.map +1 -0
- package/dist/cjs/src/common/colors.js +93 -0
- package/dist/cjs/src/common/colors.js.map +1 -0
- package/dist/cjs/src/common/hash.d.ts +3 -0
- package/dist/cjs/src/common/hash.d.ts.map +1 -0
- package/dist/cjs/src/common/hash.js +44 -0
- package/dist/cjs/src/common/hash.js.map +1 -0
- package/dist/cjs/src/common/index.d.ts +7 -0
- package/dist/cjs/src/common/index.d.ts.map +1 -0
- package/dist/cjs/src/common/index.js +23 -0
- package/dist/cjs/src/common/index.js.map +1 -0
- package/dist/cjs/src/common/ppm.d.ts +2 -0
- package/dist/cjs/src/common/ppm.d.ts.map +1 -0
- package/dist/cjs/src/common/ppm.js +21 -0
- package/dist/cjs/src/common/ppm.js.map +1 -0
- package/dist/cjs/src/common/scalar.d.ts +27 -0
- package/dist/cjs/src/common/scalar.d.ts.map +1 -0
- package/dist/cjs/src/common/scalar.js +65 -0
- package/dist/cjs/src/common/scalar.js.map +1 -0
- package/dist/cjs/src/common/types.d.ts +9 -0
- package/dist/cjs/src/common/types.d.ts.map +1 -0
- package/dist/cjs/src/common/types.js +3 -0
- package/dist/cjs/src/common/types.js.map +1 -0
- package/dist/cjs/src/data/font/index.d.ts +2 -0
- package/dist/cjs/src/data/font/index.d.ts.map +1 -0
- package/dist/cjs/src/data/font/index.js +18 -0
- package/dist/cjs/src/data/font/index.js.map +1 -0
- package/dist/cjs/src/data/font/noto-mono-regular-48.d.ts +747 -0
- package/dist/cjs/src/data/font/noto-mono-regular-48.d.ts.map +1 -0
- package/dist/cjs/src/data/font/noto-mono-regular-48.js +15544 -0
- package/dist/cjs/src/data/font/noto-mono-regular-48.js.map +1 -0
- package/dist/cjs/src/data/font/noto-mono-regular-48.json +15540 -0
- package/dist/cjs/src/data/index.d.ts +2 -0
- package/dist/cjs/src/data/index.d.ts.map +1 -0
- package/dist/cjs/src/data/index.js +18 -0
- package/dist/cjs/src/data/index.js.map +1 -0
- package/dist/cjs/src/index.d.ts +4 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +20 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/esm/playground.d.ts +2 -0
- package/dist/esm/playground.d.ts.map +1 -0
- package/dist/esm/playground.js +37 -0
- package/dist/esm/playground.js.map +1 -0
- package/dist/esm/src/canvas/canvas.d.ts +41 -0
- package/dist/esm/src/canvas/canvas.d.ts.map +1 -0
- package/dist/esm/src/canvas/canvas.js +83 -0
- package/dist/esm/src/canvas/canvas.js.map +1 -0
- package/dist/esm/src/canvas/context-2d.d.ts +37 -0
- package/dist/esm/src/canvas/context-2d.d.ts.map +1 -0
- package/dist/esm/src/canvas/context-2d.js +245 -0
- package/dist/esm/src/canvas/context-2d.js.map +1 -0
- package/dist/esm/src/canvas/index.d.ts +2 -0
- package/dist/esm/src/canvas/index.d.ts.map +1 -0
- package/dist/esm/src/canvas/index.js +18 -0
- package/dist/esm/src/canvas/index.js.map +1 -0
- package/dist/esm/src/common/array.d.ts +40 -0
- package/dist/esm/src/common/array.d.ts.map +1 -0
- package/dist/esm/src/common/array.js +99 -0
- package/dist/esm/src/common/array.js.map +1 -0
- package/dist/esm/src/common/colors.d.ts +62 -0
- package/dist/esm/src/common/colors.d.ts.map +1 -0
- package/dist/esm/src/common/colors.js +93 -0
- package/dist/esm/src/common/colors.js.map +1 -0
- package/dist/esm/src/common/hash.d.ts +3 -0
- package/dist/esm/src/common/hash.d.ts.map +1 -0
- package/dist/esm/src/common/hash.js +44 -0
- package/dist/esm/src/common/hash.js.map +1 -0
- package/dist/esm/src/common/index.d.ts +7 -0
- package/dist/esm/src/common/index.d.ts.map +1 -0
- package/dist/esm/src/common/index.js +23 -0
- package/dist/esm/src/common/index.js.map +1 -0
- package/dist/esm/src/common/ppm.d.ts +2 -0
- package/dist/esm/src/common/ppm.d.ts.map +1 -0
- package/dist/esm/src/common/ppm.js +21 -0
- package/dist/esm/src/common/ppm.js.map +1 -0
- package/dist/esm/src/common/scalar.d.ts +27 -0
- package/dist/esm/src/common/scalar.d.ts.map +1 -0
- package/dist/esm/src/common/scalar.js +65 -0
- package/dist/esm/src/common/scalar.js.map +1 -0
- package/dist/esm/src/common/types.d.ts +9 -0
- package/dist/esm/src/common/types.d.ts.map +1 -0
- package/dist/esm/src/common/types.js +3 -0
- package/dist/esm/src/common/types.js.map +1 -0
- package/dist/esm/src/data/font/index.d.ts +2 -0
- package/dist/esm/src/data/font/index.d.ts.map +1 -0
- package/dist/esm/src/data/font/index.js +18 -0
- package/dist/esm/src/data/font/index.js.map +1 -0
- package/dist/esm/src/data/font/noto-mono-regular-48.d.ts +747 -0
- package/dist/esm/src/data/font/noto-mono-regular-48.d.ts.map +1 -0
- package/dist/esm/src/data/font/noto-mono-regular-48.js +15544 -0
- package/dist/esm/src/data/font/noto-mono-regular-48.js.map +1 -0
- package/dist/esm/src/data/font/noto-mono-regular-48.json +15540 -0
- package/dist/esm/src/data/index.d.ts +2 -0
- package/dist/esm/src/data/index.d.ts.map +1 -0
- package/dist/esm/src/data/index.js +18 -0
- package/dist/esm/src/data/index.js.map +1 -0
- package/dist/esm/src/index.d.ts +4 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js +20 -0
- package/dist/esm/src/index.js.map +1 -0
- package/package.json +43 -0
- package/playground.ts +41 -0
- package/pnpm-lock.yaml +352 -0
- package/render_font.py +98 -0
- package/src/canvas/canvas.ts +123 -0
- package/src/canvas/context-2d.ts +305 -0
- package/src/canvas/index.ts +1 -0
- package/src/common/array.ts +176 -0
- package/src/common/colors.ts +93 -0
- package/src/common/hash.ts +46 -0
- package/src/common/index.ts +6 -0
- package/src/common/ppm.ts +28 -0
- package/src/common/scalar.ts +72 -0
- package/src/common/types.ts +10 -0
- package/src/data/font/index.ts +1 -0
- package/src/data/font/noto-mono-regular-48.json +15540 -0
- package/src/data/font/noto-mono-regular-48.ts +15540 -0
- package/src/data/index.ts +1 -0
- package/src/index.ts +3 -0
- package/tsconfig.cjs.json +10 -0
- package/tsconfig.esm.json +10 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { toBatched } from "./array";
|
|
2
|
+
|
|
3
|
+
const isFloat = (x: number): boolean => !Number.isInteger(x);
|
|
4
|
+
|
|
5
|
+
export const toUint32 = (x: number | BigInt): number => {
|
|
6
|
+
const buffer = new ArrayBuffer(4);
|
|
7
|
+
const view = new DataView(buffer);
|
|
8
|
+
const n = Number(x);
|
|
9
|
+
if (isFloat(n)) {
|
|
10
|
+
view.setFloat32(0, n);
|
|
11
|
+
} else {
|
|
12
|
+
view.setUint32(0, n);
|
|
13
|
+
}
|
|
14
|
+
return view.getUint32(0);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const hashU32 = (arr: number[]) => {
|
|
18
|
+
const U = toUint32;
|
|
19
|
+
const pad = 7;
|
|
20
|
+
const batches = toBatched(
|
|
21
|
+
arr.map((v) => U(v)),
|
|
22
|
+
2,
|
|
23
|
+
pad,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
let h = 0;
|
|
27
|
+
for (let i = 0; i < batches.length; i++) {
|
|
28
|
+
let [x, y] = batches[i % batches.length]!;
|
|
29
|
+
let j1 = (~x >> 2) * 53;
|
|
30
|
+
let j2 = (~y >> 3) * 53;
|
|
31
|
+
x += j2;
|
|
32
|
+
x ^= x << 17;
|
|
33
|
+
x ^= x >> 13;
|
|
34
|
+
x ^= x << 5;
|
|
35
|
+
x *= 0xa40b130c;
|
|
36
|
+
y ^= x;
|
|
37
|
+
y += j1;
|
|
38
|
+
y ^= y << 17;
|
|
39
|
+
y ^= y >> 13;
|
|
40
|
+
y ^= y << 5;
|
|
41
|
+
y *= 0xe0b0591a;
|
|
42
|
+
h = U(h + (x * 7 + y * 3) * 5013 + 1013 * (j1 * 3 + j2));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return U(h);
|
|
46
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { clamp } from "./scalar";
|
|
2
|
+
|
|
3
|
+
export const createPPM = (
|
|
4
|
+
width: number,
|
|
5
|
+
height: number,
|
|
6
|
+
pixels: [number, number, number][],
|
|
7
|
+
): string => {
|
|
8
|
+
const expectedPixels = width * height;
|
|
9
|
+
if (pixels.length !== expectedPixels) {
|
|
10
|
+
throw new Error(
|
|
11
|
+
`Invalid pixel data: Expected ${expectedPixels} pixels, but got ${pixels.length}.`,
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let ppmContent = `P3\n${width} ${height}\n255\n`;
|
|
16
|
+
|
|
17
|
+
for (let i = 0; i < pixels.length; i++) {
|
|
18
|
+
const [x, y, z] = pixels[i]!;
|
|
19
|
+
|
|
20
|
+
const r = clamp(Math.round(x * 255), 0, 255);
|
|
21
|
+
const g = clamp(Math.round(y * 255), 0, 255);
|
|
22
|
+
const b = clamp(Math.round(z * 255), 0, 255);
|
|
23
|
+
|
|
24
|
+
ppmContent += `${r} ${g} ${b}\n`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return ppmContent;
|
|
28
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const clamp = (x: number, min: number, max: number): number =>
|
|
2
|
+
Math.max(min, Math.min(max, x));
|
|
3
|
+
|
|
4
|
+
export const lerp = (vFrom: number, vTo: number, scale: number) =>
|
|
5
|
+
vFrom + (vTo - vFrom) * scale;
|
|
6
|
+
|
|
7
|
+
export const remap = (
|
|
8
|
+
x: number,
|
|
9
|
+
range1: [number, number],
|
|
10
|
+
range2: [number, number],
|
|
11
|
+
): number => {
|
|
12
|
+
const min1 = range1[0];
|
|
13
|
+
const max1 = range1[1];
|
|
14
|
+
const min2 = range2[0];
|
|
15
|
+
const max2 = range2[1];
|
|
16
|
+
const div = max1 - min1;
|
|
17
|
+
|
|
18
|
+
if (Math.abs(div) <= 0.00000000000000000001) return min2;
|
|
19
|
+
|
|
20
|
+
return min2 + ((clamp(x, min1, max1) - min1) / div) * (max2 - min2);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const smoothstep = (
|
|
24
|
+
edge0: number,
|
|
25
|
+
edge1: number,
|
|
26
|
+
value: number,
|
|
27
|
+
): number => {
|
|
28
|
+
const x = clamp((value - edge0) / (edge1 - edge0), 0.0, 1.0);
|
|
29
|
+
return x * x * (3.0 - 2.0 * x);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Smooth greater-than
|
|
34
|
+
*/
|
|
35
|
+
export const sgt = (a: number, b: number, s: number) => {
|
|
36
|
+
const h = clamp(0.5 + (0.5 * (a - b)) / s, 0.0, 1.0);
|
|
37
|
+
return lerp(0.0, 1.0, h * h * (3.0 - 2.0 * h));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Smooth less-than
|
|
42
|
+
*/
|
|
43
|
+
export const slt = (a: number, b: number, s: number) => {
|
|
44
|
+
const h = clamp(0.5 + (0.5 * (b - a)) / s, 0.0, 1.0);
|
|
45
|
+
return lerp(0.0, 1.0, h * h * (3.0 - 2.0 * h));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Smooth minimum
|
|
50
|
+
*/
|
|
51
|
+
export const smin = (a: number, b: number, k: number) => {
|
|
52
|
+
const h = clamp(0.5 + (0.5 * (b - a)) / k, 0.0, 1.0);
|
|
53
|
+
return lerp(b, a, h) - k * h * (1.0 - h);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Smooth maximum
|
|
58
|
+
*/
|
|
59
|
+
export const smax = (a: number, b: number, k: number) => {
|
|
60
|
+
const h = clamp(0.5 + (0.5 * (b - a)) / k, 0.0, 1.0);
|
|
61
|
+
return lerp(b, a, h) + k * h * (1.0 - h);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const fract = (x: number) => x - Math.floor(x);
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Absolute modulus
|
|
68
|
+
*/
|
|
69
|
+
export const amod = (value: number, modulus: number): number =>
|
|
70
|
+
((value % modulus) + modulus) % modulus;
|
|
71
|
+
|
|
72
|
+
export const sigmoid = (x: number) => 1 / (1 + Math.exp(-x));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type Pair<A, B> = [A, B];
|
|
2
|
+
export type Triple<A, B, C> = [A, B, C];
|
|
3
|
+
|
|
4
|
+
export type Prettify<T> = {
|
|
5
|
+
[K in keyof T]: T[K];
|
|
6
|
+
} & {};
|
|
7
|
+
|
|
8
|
+
export type V2 = [number, number];
|
|
9
|
+
export type V3 = [number, number, number];
|
|
10
|
+
export type V4 = [number, number, number, number];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./noto-mono-regular-48";
|