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.
Files changed (147) hide show
  1. package/.gitignore +233 -0
  2. package/CLAUDE.md +61 -0
  3. package/README.md +128 -0
  4. package/dist/cjs/playground.d.ts +2 -0
  5. package/dist/cjs/playground.d.ts.map +1 -0
  6. package/dist/cjs/playground.js +37 -0
  7. package/dist/cjs/playground.js.map +1 -0
  8. package/dist/cjs/src/canvas/canvas.d.ts +41 -0
  9. package/dist/cjs/src/canvas/canvas.d.ts.map +1 -0
  10. package/dist/cjs/src/canvas/canvas.js +83 -0
  11. package/dist/cjs/src/canvas/canvas.js.map +1 -0
  12. package/dist/cjs/src/canvas/context-2d.d.ts +37 -0
  13. package/dist/cjs/src/canvas/context-2d.d.ts.map +1 -0
  14. package/dist/cjs/src/canvas/context-2d.js +245 -0
  15. package/dist/cjs/src/canvas/context-2d.js.map +1 -0
  16. package/dist/cjs/src/canvas/index.d.ts +2 -0
  17. package/dist/cjs/src/canvas/index.d.ts.map +1 -0
  18. package/dist/cjs/src/canvas/index.js +18 -0
  19. package/dist/cjs/src/canvas/index.js.map +1 -0
  20. package/dist/cjs/src/common/array.d.ts +40 -0
  21. package/dist/cjs/src/common/array.d.ts.map +1 -0
  22. package/dist/cjs/src/common/array.js +99 -0
  23. package/dist/cjs/src/common/array.js.map +1 -0
  24. package/dist/cjs/src/common/colors.d.ts +62 -0
  25. package/dist/cjs/src/common/colors.d.ts.map +1 -0
  26. package/dist/cjs/src/common/colors.js +93 -0
  27. package/dist/cjs/src/common/colors.js.map +1 -0
  28. package/dist/cjs/src/common/hash.d.ts +3 -0
  29. package/dist/cjs/src/common/hash.d.ts.map +1 -0
  30. package/dist/cjs/src/common/hash.js +44 -0
  31. package/dist/cjs/src/common/hash.js.map +1 -0
  32. package/dist/cjs/src/common/index.d.ts +7 -0
  33. package/dist/cjs/src/common/index.d.ts.map +1 -0
  34. package/dist/cjs/src/common/index.js +23 -0
  35. package/dist/cjs/src/common/index.js.map +1 -0
  36. package/dist/cjs/src/common/ppm.d.ts +2 -0
  37. package/dist/cjs/src/common/ppm.d.ts.map +1 -0
  38. package/dist/cjs/src/common/ppm.js +21 -0
  39. package/dist/cjs/src/common/ppm.js.map +1 -0
  40. package/dist/cjs/src/common/scalar.d.ts +27 -0
  41. package/dist/cjs/src/common/scalar.d.ts.map +1 -0
  42. package/dist/cjs/src/common/scalar.js +65 -0
  43. package/dist/cjs/src/common/scalar.js.map +1 -0
  44. package/dist/cjs/src/common/types.d.ts +9 -0
  45. package/dist/cjs/src/common/types.d.ts.map +1 -0
  46. package/dist/cjs/src/common/types.js +3 -0
  47. package/dist/cjs/src/common/types.js.map +1 -0
  48. package/dist/cjs/src/data/font/index.d.ts +2 -0
  49. package/dist/cjs/src/data/font/index.d.ts.map +1 -0
  50. package/dist/cjs/src/data/font/index.js +18 -0
  51. package/dist/cjs/src/data/font/index.js.map +1 -0
  52. package/dist/cjs/src/data/font/noto-mono-regular-48.d.ts +747 -0
  53. package/dist/cjs/src/data/font/noto-mono-regular-48.d.ts.map +1 -0
  54. package/dist/cjs/src/data/font/noto-mono-regular-48.js +15544 -0
  55. package/dist/cjs/src/data/font/noto-mono-regular-48.js.map +1 -0
  56. package/dist/cjs/src/data/font/noto-mono-regular-48.json +15540 -0
  57. package/dist/cjs/src/data/index.d.ts +2 -0
  58. package/dist/cjs/src/data/index.d.ts.map +1 -0
  59. package/dist/cjs/src/data/index.js +18 -0
  60. package/dist/cjs/src/data/index.js.map +1 -0
  61. package/dist/cjs/src/index.d.ts +4 -0
  62. package/dist/cjs/src/index.d.ts.map +1 -0
  63. package/dist/cjs/src/index.js +20 -0
  64. package/dist/cjs/src/index.js.map +1 -0
  65. package/dist/esm/playground.d.ts +2 -0
  66. package/dist/esm/playground.d.ts.map +1 -0
  67. package/dist/esm/playground.js +37 -0
  68. package/dist/esm/playground.js.map +1 -0
  69. package/dist/esm/src/canvas/canvas.d.ts +41 -0
  70. package/dist/esm/src/canvas/canvas.d.ts.map +1 -0
  71. package/dist/esm/src/canvas/canvas.js +83 -0
  72. package/dist/esm/src/canvas/canvas.js.map +1 -0
  73. package/dist/esm/src/canvas/context-2d.d.ts +37 -0
  74. package/dist/esm/src/canvas/context-2d.d.ts.map +1 -0
  75. package/dist/esm/src/canvas/context-2d.js +245 -0
  76. package/dist/esm/src/canvas/context-2d.js.map +1 -0
  77. package/dist/esm/src/canvas/index.d.ts +2 -0
  78. package/dist/esm/src/canvas/index.d.ts.map +1 -0
  79. package/dist/esm/src/canvas/index.js +18 -0
  80. package/dist/esm/src/canvas/index.js.map +1 -0
  81. package/dist/esm/src/common/array.d.ts +40 -0
  82. package/dist/esm/src/common/array.d.ts.map +1 -0
  83. package/dist/esm/src/common/array.js +99 -0
  84. package/dist/esm/src/common/array.js.map +1 -0
  85. package/dist/esm/src/common/colors.d.ts +62 -0
  86. package/dist/esm/src/common/colors.d.ts.map +1 -0
  87. package/dist/esm/src/common/colors.js +93 -0
  88. package/dist/esm/src/common/colors.js.map +1 -0
  89. package/dist/esm/src/common/hash.d.ts +3 -0
  90. package/dist/esm/src/common/hash.d.ts.map +1 -0
  91. package/dist/esm/src/common/hash.js +44 -0
  92. package/dist/esm/src/common/hash.js.map +1 -0
  93. package/dist/esm/src/common/index.d.ts +7 -0
  94. package/dist/esm/src/common/index.d.ts.map +1 -0
  95. package/dist/esm/src/common/index.js +23 -0
  96. package/dist/esm/src/common/index.js.map +1 -0
  97. package/dist/esm/src/common/ppm.d.ts +2 -0
  98. package/dist/esm/src/common/ppm.d.ts.map +1 -0
  99. package/dist/esm/src/common/ppm.js +21 -0
  100. package/dist/esm/src/common/ppm.js.map +1 -0
  101. package/dist/esm/src/common/scalar.d.ts +27 -0
  102. package/dist/esm/src/common/scalar.d.ts.map +1 -0
  103. package/dist/esm/src/common/scalar.js +65 -0
  104. package/dist/esm/src/common/scalar.js.map +1 -0
  105. package/dist/esm/src/common/types.d.ts +9 -0
  106. package/dist/esm/src/common/types.d.ts.map +1 -0
  107. package/dist/esm/src/common/types.js +3 -0
  108. package/dist/esm/src/common/types.js.map +1 -0
  109. package/dist/esm/src/data/font/index.d.ts +2 -0
  110. package/dist/esm/src/data/font/index.d.ts.map +1 -0
  111. package/dist/esm/src/data/font/index.js +18 -0
  112. package/dist/esm/src/data/font/index.js.map +1 -0
  113. package/dist/esm/src/data/font/noto-mono-regular-48.d.ts +747 -0
  114. package/dist/esm/src/data/font/noto-mono-regular-48.d.ts.map +1 -0
  115. package/dist/esm/src/data/font/noto-mono-regular-48.js +15544 -0
  116. package/dist/esm/src/data/font/noto-mono-regular-48.js.map +1 -0
  117. package/dist/esm/src/data/font/noto-mono-regular-48.json +15540 -0
  118. package/dist/esm/src/data/index.d.ts +2 -0
  119. package/dist/esm/src/data/index.d.ts.map +1 -0
  120. package/dist/esm/src/data/index.js +18 -0
  121. package/dist/esm/src/data/index.js.map +1 -0
  122. package/dist/esm/src/index.d.ts +4 -0
  123. package/dist/esm/src/index.d.ts.map +1 -0
  124. package/dist/esm/src/index.js +20 -0
  125. package/dist/esm/src/index.js.map +1 -0
  126. package/package.json +43 -0
  127. package/playground.ts +41 -0
  128. package/pnpm-lock.yaml +352 -0
  129. package/render_font.py +98 -0
  130. package/src/canvas/canvas.ts +123 -0
  131. package/src/canvas/context-2d.ts +305 -0
  132. package/src/canvas/index.ts +1 -0
  133. package/src/common/array.ts +176 -0
  134. package/src/common/colors.ts +93 -0
  135. package/src/common/hash.ts +46 -0
  136. package/src/common/index.ts +6 -0
  137. package/src/common/ppm.ts +28 -0
  138. package/src/common/scalar.ts +72 -0
  139. package/src/common/types.ts +10 -0
  140. package/src/data/font/index.ts +1 -0
  141. package/src/data/font/noto-mono-regular-48.json +15540 -0
  142. package/src/data/font/noto-mono-regular-48.ts +15540 -0
  143. package/src/data/index.ts +1 -0
  144. package/src/index.ts +3 -0
  145. package/tsconfig.cjs.json +10 -0
  146. package/tsconfig.esm.json +10 -0
  147. 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,6 @@
1
+ export * from "./types";
2
+ export * from "./array";
3
+ export * from "./hash";
4
+ export * from "./ppm";
5
+ export * from "./scalar";
6
+ export * from "./colors";
@@ -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";