@flighthq/bitmap 0.3.0-edge.1458.0c01b63

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 (219) hide show
  1. package/dist/bitmap.d.ts +17 -0
  2. package/dist/bitmap.d.ts.map +1 -0
  3. package/dist/bitmap.js +87 -0
  4. package/dist/bitmap.js.map +1 -0
  5. package/dist/bitmapAffine.d.ts +27 -0
  6. package/dist/bitmapAffine.d.ts.map +1 -0
  7. package/dist/bitmapAffine.js +159 -0
  8. package/dist/bitmapAffine.js.map +1 -0
  9. package/dist/bitmapAlpha.d.ts +27 -0
  10. package/dist/bitmapAlpha.d.ts.map +1 -0
  11. package/dist/bitmapAlpha.js +83 -0
  12. package/dist/bitmapAlpha.js.map +1 -0
  13. package/dist/bitmapBevel.d.ts +24 -0
  14. package/dist/bitmapBevel.d.ts.map +1 -0
  15. package/dist/bitmapBevel.js +102 -0
  16. package/dist/bitmapBevel.js.map +1 -0
  17. package/dist/bitmapBlur.d.ts +57 -0
  18. package/dist/bitmapBlur.d.ts.map +1 -0
  19. package/dist/bitmapBlur.js +263 -0
  20. package/dist/bitmapBlur.js.map +1 -0
  21. package/dist/bitmapChannel.d.ts +24 -0
  22. package/dist/bitmapChannel.d.ts.map +1 -0
  23. package/dist/bitmapChannel.js +127 -0
  24. package/dist/bitmapChannel.js.map +1 -0
  25. package/dist/bitmapColorMatrix.d.ts +57 -0
  26. package/dist/bitmapColorMatrix.d.ts.map +1 -0
  27. package/dist/bitmapColorMatrix.js +127 -0
  28. package/dist/bitmapColorMatrix.js.map +1 -0
  29. package/dist/bitmapCompare.d.ts +18 -0
  30. package/dist/bitmapCompare.d.ts.map +1 -0
  31. package/dist/bitmapCompare.js +64 -0
  32. package/dist/bitmapCompare.js.map +1 -0
  33. package/dist/bitmapComposite.d.ts +54 -0
  34. package/dist/bitmapComposite.d.ts.map +1 -0
  35. package/dist/bitmapComposite.js +262 -0
  36. package/dist/bitmapComposite.js.map +1 -0
  37. package/dist/bitmapConvolution.d.ts +17 -0
  38. package/dist/bitmapConvolution.d.ts.map +1 -0
  39. package/dist/bitmapConvolution.js +103 -0
  40. package/dist/bitmapConvolution.js.map +1 -0
  41. package/dist/bitmapCopy.d.ts +23 -0
  42. package/dist/bitmapCopy.d.ts.map +1 -0
  43. package/dist/bitmapCopy.js +78 -0
  44. package/dist/bitmapCopy.js.map +1 -0
  45. package/dist/bitmapCoverage.d.ts +11 -0
  46. package/dist/bitmapCoverage.d.ts.map +1 -0
  47. package/dist/bitmapCoverage.js +29 -0
  48. package/dist/bitmapCoverage.js.map +1 -0
  49. package/dist/bitmapCrop.d.ts +33 -0
  50. package/dist/bitmapCrop.d.ts.map +1 -0
  51. package/dist/bitmapCrop.js +175 -0
  52. package/dist/bitmapCrop.js.map +1 -0
  53. package/dist/bitmapDisplacement.d.ts +22 -0
  54. package/dist/bitmapDisplacement.d.ts.map +1 -0
  55. package/dist/bitmapDisplacement.js +111 -0
  56. package/dist/bitmapDisplacement.js.map +1 -0
  57. package/dist/bitmapDissolve.d.ts +21 -0
  58. package/dist/bitmapDissolve.d.ts.map +1 -0
  59. package/dist/bitmapDissolve.js +97 -0
  60. package/dist/bitmapDissolve.js.map +1 -0
  61. package/dist/bitmapDraw.d.ts +8 -0
  62. package/dist/bitmapDraw.d.ts.map +1 -0
  63. package/dist/bitmapDraw.js +14 -0
  64. package/dist/bitmapDraw.js.map +1 -0
  65. package/dist/bitmapEncode.d.ts +3 -0
  66. package/dist/bitmapEncode.d.ts.map +1 -0
  67. package/dist/bitmapEncode.js +18 -0
  68. package/dist/bitmapEncode.js.map +1 -0
  69. package/dist/bitmapFill.d.ts +12 -0
  70. package/dist/bitmapFill.d.ts.map +1 -0
  71. package/dist/bitmapFill.js +85 -0
  72. package/dist/bitmapFill.js.map +1 -0
  73. package/dist/bitmapFingerprint.d.ts +26 -0
  74. package/dist/bitmapFingerprint.d.ts.map +1 -0
  75. package/dist/bitmapFingerprint.js +99 -0
  76. package/dist/bitmapFingerprint.js.map +1 -0
  77. package/dist/bitmapFlip.d.ts +16 -0
  78. package/dist/bitmapFlip.d.ts.map +1 -0
  79. package/dist/bitmapFlip.js +98 -0
  80. package/dist/bitmapFlip.js.map +1 -0
  81. package/dist/bitmapFormat.d.ts +26 -0
  82. package/dist/bitmapFormat.d.ts.map +1 -0
  83. package/dist/bitmapFormat.js +80 -0
  84. package/dist/bitmapFormat.js.map +1 -0
  85. package/dist/bitmapFrom.d.ts +23 -0
  86. package/dist/bitmapFrom.d.ts.map +1 -0
  87. package/dist/bitmapFrom.js +90 -0
  88. package/dist/bitmapFrom.js.map +1 -0
  89. package/dist/bitmapGradient.d.ts +36 -0
  90. package/dist/bitmapGradient.d.ts.map +1 -0
  91. package/dist/bitmapGradient.js +176 -0
  92. package/dist/bitmapGradient.js.map +1 -0
  93. package/dist/bitmapGradientFill.d.ts +32 -0
  94. package/dist/bitmapGradientFill.d.ts.map +1 -0
  95. package/dist/bitmapGradientFill.js +120 -0
  96. package/dist/bitmapGradientFill.js.map +1 -0
  97. package/dist/bitmapHistogram.d.ts +20 -0
  98. package/dist/bitmapHistogram.d.ts.map +1 -0
  99. package/dist/bitmapHistogram.js +61 -0
  100. package/dist/bitmapHistogram.js.map +1 -0
  101. package/dist/bitmapImageChannel.d.ts +2 -0
  102. package/dist/bitmapImageChannel.d.ts.map +1 -0
  103. package/dist/bitmapImageChannel.js +2 -0
  104. package/dist/bitmapImageChannel.js.map +1 -0
  105. package/dist/bitmapMedian.d.ts +14 -0
  106. package/dist/bitmapMedian.d.ts.map +1 -0
  107. package/dist/bitmapMedian.js +77 -0
  108. package/dist/bitmapMedian.js.map +1 -0
  109. package/dist/bitmapMorphological.d.ts +29 -0
  110. package/dist/bitmapMorphological.d.ts.map +1 -0
  111. package/dist/bitmapMorphological.js +81 -0
  112. package/dist/bitmapMorphological.js.map +1 -0
  113. package/dist/bitmapNoise.d.ts +48 -0
  114. package/dist/bitmapNoise.d.ts.map +1 -0
  115. package/dist/bitmapNoise.js +245 -0
  116. package/dist/bitmapNoise.js.map +1 -0
  117. package/dist/bitmapPaletteMap.d.ts +17 -0
  118. package/dist/bitmapPaletteMap.d.ts.map +1 -0
  119. package/dist/bitmapPaletteMap.js +45 -0
  120. package/dist/bitmapPaletteMap.js.map +1 -0
  121. package/dist/bitmapPixel.d.ts +9 -0
  122. package/dist/bitmapPixel.d.ts.map +1 -0
  123. package/dist/bitmapPixel.js +36 -0
  124. package/dist/bitmapPixel.js.map +1 -0
  125. package/dist/bitmapPixelate.d.ts +13 -0
  126. package/dist/bitmapPixelate.d.ts.map +1 -0
  127. package/dist/bitmapPixelate.js +61 -0
  128. package/dist/bitmapPixelate.js.map +1 -0
  129. package/dist/bitmapQuery.d.ts +13 -0
  130. package/dist/bitmapQuery.d.ts.map +1 -0
  131. package/dist/bitmapQuery.js +46 -0
  132. package/dist/bitmapQuery.js.map +1 -0
  133. package/dist/bitmapRegion.d.ts +20 -0
  134. package/dist/bitmapRegion.d.ts.map +1 -0
  135. package/dist/bitmapRegion.js +28 -0
  136. package/dist/bitmapRegion.js.map +1 -0
  137. package/dist/bitmapResize.d.ts +17 -0
  138. package/dist/bitmapResize.d.ts.map +1 -0
  139. package/dist/bitmapResize.js +191 -0
  140. package/dist/bitmapResize.js.map +1 -0
  141. package/dist/bitmapRotate.d.ts +32 -0
  142. package/dist/bitmapRotate.d.ts.map +1 -0
  143. package/dist/bitmapRotate.js +143 -0
  144. package/dist/bitmapRotate.js.map +1 -0
  145. package/dist/bitmapShadow.d.ts +72 -0
  146. package/dist/bitmapShadow.d.ts.map +1 -0
  147. package/dist/bitmapShadow.js +175 -0
  148. package/dist/bitmapShadow.js.map +1 -0
  149. package/dist/bitmapSharpen.d.ts +16 -0
  150. package/dist/bitmapSharpen.d.ts.map +1 -0
  151. package/dist/bitmapSharpen.js +47 -0
  152. package/dist/bitmapSharpen.js.map +1 -0
  153. package/dist/bitmapTone.d.ts +28 -0
  154. package/dist/bitmapTone.d.ts.map +1 -0
  155. package/dist/bitmapTone.js +69 -0
  156. package/dist/bitmapTone.js.map +1 -0
  157. package/dist/bitmapTransform.d.ts +40 -0
  158. package/dist/bitmapTransform.d.ts.map +1 -0
  159. package/dist/bitmapTransform.js +163 -0
  160. package/dist/bitmapTransform.js.map +1 -0
  161. package/dist/bitmapWarp.d.ts +48 -0
  162. package/dist/bitmapWarp.d.ts.map +1 -0
  163. package/dist/bitmapWarp.js +284 -0
  164. package/dist/bitmapWarp.js.map +1 -0
  165. package/dist/contract.d.ts +43 -0
  166. package/dist/contract.d.ts.map +1 -0
  167. package/dist/contract.js +43 -0
  168. package/dist/contract.js.map +1 -0
  169. package/dist/explainBitmapReadback.d.ts +3 -0
  170. package/dist/explainBitmapReadback.d.ts.map +1 -0
  171. package/dist/explainBitmapReadback.js +39 -0
  172. package/dist/explainBitmapReadback.js.map +1 -0
  173. package/dist/index.d.ts +2 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +2 -0
  176. package/dist/index.js.map +1 -0
  177. package/package.json +48 -0
  178. package/src/bitmap.test.ts +88 -0
  179. package/src/bitmapAffine.test.ts +98 -0
  180. package/src/bitmapAlpha.test.ts +110 -0
  181. package/src/bitmapBevel.test.ts +61 -0
  182. package/src/bitmapBlur.test.ts +234 -0
  183. package/src/bitmapChannel.test.ts +97 -0
  184. package/src/bitmapColorMatrix.test.ts +214 -0
  185. package/src/bitmapCompare.test.ts +92 -0
  186. package/src/bitmapComposite.test.ts +259 -0
  187. package/src/bitmapConvolution.test.ts +130 -0
  188. package/src/bitmapCopy.test.ts +48 -0
  189. package/src/bitmapCoverage.test.ts +39 -0
  190. package/src/bitmapCrop.test.ts +116 -0
  191. package/src/bitmapDisplacement.test.ts +181 -0
  192. package/src/bitmapDissolve.test.ts +99 -0
  193. package/src/bitmapDraw.test.ts +68 -0
  194. package/src/bitmapEncode.test.ts +18 -0
  195. package/src/bitmapFill.test.ts +83 -0
  196. package/src/bitmapFingerprint.test.ts +103 -0
  197. package/src/bitmapFlip.test.ts +53 -0
  198. package/src/bitmapFormat.test.ts +124 -0
  199. package/src/bitmapFrom.test.ts +86 -0
  200. package/src/bitmapGradient.test.ts +85 -0
  201. package/src/bitmapGradientFill.test.ts +107 -0
  202. package/src/bitmapHistogram.test.ts +64 -0
  203. package/src/bitmapImageChannel.test.ts +19 -0
  204. package/src/bitmapMedian.test.ts +39 -0
  205. package/src/bitmapMorphological.test.ts +69 -0
  206. package/src/bitmapNoise.test.ts +163 -0
  207. package/src/bitmapPaletteMap.test.ts +49 -0
  208. package/src/bitmapPixel.test.ts +117 -0
  209. package/src/bitmapPixelate.test.ts +40 -0
  210. package/src/bitmapQuery.test.ts +42 -0
  211. package/src/bitmapRegion.test.ts +34 -0
  212. package/src/bitmapResize.test.ts +106 -0
  213. package/src/bitmapRotate.test.ts +108 -0
  214. package/src/bitmapShadow.test.ts +159 -0
  215. package/src/bitmapSharpen.test.ts +44 -0
  216. package/src/bitmapTone.test.ts +104 -0
  217. package/src/bitmapTransform.test.ts +128 -0
  218. package/src/bitmapWarp.test.ts +118 -0
  219. package/src/explainBitmapReadback.test.ts +84 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Applies a median filter to `source`, writing into `out`. Each output channel
3
+ * is the median of that channel over the `(2 * radius + 1)²` neighborhood,
4
+ * clamped at the bitmap edges. Median filtering removes salt-and-pepper noise
5
+ * and despeckles while preserving edges — something a linear convolution blur
6
+ * cannot do.
7
+ *
8
+ * `out` must be at least `source.width * source.height * 4` bytes and must NOT
9
+ * alias `source.bitmap.data` — each output pixel reads a neighborhood of
10
+ * source pixels.
11
+ */
12
+ export function medianBitmap(out, source, radius) {
13
+ const r = Math.max(0, Math.round(radius));
14
+ const w = source.width;
15
+ const h = source.height;
16
+ const bitmapWidth = source.bitmap.width;
17
+ const bitmapHeight = source.bitmap.height;
18
+ const data = source.bitmap.data;
19
+ const area = (2 * r + 1) * (2 * r + 1);
20
+ // Window scratch is reused across calls and grown as needed — a median pass
21
+ // is allocation-free after its first use at a given radius.
22
+ if (_windowRed === null || _windowRed.length < area) {
23
+ _windowRed = new Uint8Array(area);
24
+ _windowGreen = new Uint8Array(area);
25
+ _windowBlue = new Uint8Array(area);
26
+ _windowAlpha = new Uint8Array(area);
27
+ }
28
+ const rs = _windowRed;
29
+ const gs = _windowGreen;
30
+ const bs = _windowBlue;
31
+ const as = _windowAlpha;
32
+ for (let py = 0; py < h; py++) {
33
+ for (let px = 0; px < w; px++) {
34
+ let n = 0;
35
+ for (let ky = -r; ky <= r; ky++) {
36
+ const sy = Math.max(0, Math.min(bitmapHeight - 1, source.y + py + ky));
37
+ for (let kx = -r; kx <= r; kx++) {
38
+ const sx = Math.max(0, Math.min(bitmapWidth - 1, source.x + px + kx));
39
+ const si = (sy * bitmapWidth + sx) * 4;
40
+ rs[n] = data[si];
41
+ gs[n] = data[si + 1];
42
+ bs[n] = data[si + 2];
43
+ as[n] = data[si + 3];
44
+ n++;
45
+ }
46
+ }
47
+ const mid = n >> 1;
48
+ const di = (py * w + px) * 4;
49
+ out[di] = medianOf(rs, n, mid);
50
+ out[di + 1] = medianOf(gs, n, mid);
51
+ out[di + 2] = medianOf(bs, n, mid);
52
+ out[di + 3] = medianOf(as, n, mid);
53
+ }
54
+ }
55
+ }
56
+ // Insertion sort of the first `n` entries, then return the element at `mid`.
57
+ // `n` is small (an odd square), so insertion sort beats Array.sort's overhead
58
+ // and avoids per-pixel allocation.
59
+ function medianOf(values, n, mid) {
60
+ for (let i = 1; i < n; i++) {
61
+ const v = values[i];
62
+ let j = i - 1;
63
+ while (j >= 0 && values[j] > v) {
64
+ values[j + 1] = values[j];
65
+ j--;
66
+ }
67
+ values[j + 1] = v;
68
+ }
69
+ return values[mid];
70
+ }
71
+ // Per-window channel scratch, reused across calls and grown to the largest
72
+ // neighborhood seen so far.
73
+ let _windowRed = null;
74
+ let _windowGreen = null;
75
+ let _windowBlue = null;
76
+ let _windowAlpha = null;
77
+ //# sourceMappingURL=bitmapMedian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapMedian.js","sourceRoot":"","sources":["../src/bitmapMedian.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Applies morphological dilation to `source`, writing into `out`. Each output
4
+ * channel is the maximum of that channel over the `(2 * radius + 1)²`
5
+ * neighbourhood; all four channels (RGBA) are dilated independently.
6
+ *
7
+ * Dilation expands bright regions and thickens shapes. It is the dual of
8
+ * `erodeBitmap` — applying erosion then dilation gives a morphological opening,
9
+ * the reverse gives a closing.
10
+ *
11
+ * `out` must be at least `source.width * source.height * 4` bytes and must NOT
12
+ * alias `source.bitmap.data` — each output pixel reads a neighbourhood of
13
+ * source pixels.
14
+ */
15
+ export declare function dilateBitmap(out: Uint8ClampedArray, source: Readonly<BitmapRegion>, radius: number): void;
16
+ /**
17
+ * Applies morphological erosion to `source`, writing into `out`. Each output
18
+ * channel is the minimum of that channel over the `(2 * radius + 1)²`
19
+ * neighbourhood; all four channels (RGBA) are eroded independently.
20
+ *
21
+ * Erosion shrinks bright regions and thins shapes. It is the dual of
22
+ * `dilateBitmap`.
23
+ *
24
+ * `out` must be at least `source.width * source.height * 4` bytes and must NOT
25
+ * alias `source.bitmap.data` — each output pixel reads a neighbourhood of
26
+ * source pixels.
27
+ */
28
+ export declare function erodeBitmap(out: Uint8ClampedArray, source: Readonly<BitmapRegion>, radius: number): void;
29
+ //# sourceMappingURL=bitmapMorphological.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapMorphological.d.ts","sourceRoot":"","sources":["../src/bitmapMorphological.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAExG"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Applies morphological dilation to `source`, writing into `out`. Each output
3
+ * channel is the maximum of that channel over the `(2 * radius + 1)²`
4
+ * neighbourhood; all four channels (RGBA) are dilated independently.
5
+ *
6
+ * Dilation expands bright regions and thickens shapes. It is the dual of
7
+ * `erodeBitmap` — applying erosion then dilation gives a morphological opening,
8
+ * the reverse gives a closing.
9
+ *
10
+ * `out` must be at least `source.width * source.height * 4` bytes and must NOT
11
+ * alias `source.bitmap.data` — each output pixel reads a neighbourhood of
12
+ * source pixels.
13
+ */
14
+ export function dilateBitmap(out, source, radius) {
15
+ applyMorphological(out, source, radius, true);
16
+ }
17
+ /**
18
+ * Applies morphological erosion to `source`, writing into `out`. Each output
19
+ * channel is the minimum of that channel over the `(2 * radius + 1)²`
20
+ * neighbourhood; all four channels (RGBA) are eroded independently.
21
+ *
22
+ * Erosion shrinks bright regions and thins shapes. It is the dual of
23
+ * `dilateBitmap`.
24
+ *
25
+ * `out` must be at least `source.width * source.height * 4` bytes and must NOT
26
+ * alias `source.bitmap.data` — each output pixel reads a neighbourhood of
27
+ * source pixels.
28
+ */
29
+ export function erodeBitmap(out, source, radius) {
30
+ applyMorphological(out, source, radius, false);
31
+ }
32
+ function applyMorphological(out, source, radius, dilate) {
33
+ const r = Math.max(0, Math.round(radius));
34
+ const w = source.width;
35
+ const h = source.height;
36
+ const bitmapWidth = source.bitmap.width;
37
+ const bitmapHeight = source.bitmap.height;
38
+ const data = source.bitmap.data;
39
+ const identity = dilate ? 0 : 255;
40
+ for (let py = 0; py < h; py++) {
41
+ for (let px = 0; px < w; px++) {
42
+ let vR = identity;
43
+ let vG = identity;
44
+ let vB = identity;
45
+ let vA = identity;
46
+ for (let ky = -r; ky <= r; ky++) {
47
+ const sy = Math.max(0, Math.min(bitmapHeight - 1, source.y + py + ky));
48
+ for (let kx = -r; kx <= r; kx++) {
49
+ const sx = Math.max(0, Math.min(bitmapWidth - 1, source.x + px + kx));
50
+ const si = (sy * bitmapWidth + sx) * 4;
51
+ if (dilate) {
52
+ if (data[si] > vR)
53
+ vR = data[si];
54
+ if (data[si + 1] > vG)
55
+ vG = data[si + 1];
56
+ if (data[si + 2] > vB)
57
+ vB = data[si + 2];
58
+ if (data[si + 3] > vA)
59
+ vA = data[si + 3];
60
+ }
61
+ else {
62
+ if (data[si] < vR)
63
+ vR = data[si];
64
+ if (data[si + 1] < vG)
65
+ vG = data[si + 1];
66
+ if (data[si + 2] < vB)
67
+ vB = data[si + 2];
68
+ if (data[si + 3] < vA)
69
+ vA = data[si + 3];
70
+ }
71
+ }
72
+ }
73
+ const di = (py * w + px) * 4;
74
+ out[di] = vR;
75
+ out[di + 1] = vG;
76
+ out[di + 2] = vB;
77
+ out[di + 3] = vA;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=bitmapMorphological.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapMorphological.js","sourceRoot":"","sources":["../src/bitmapMorphological.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Fills the `dest` region with uniform random noise in `[low, high]`, derived
4
+ * deterministically from `seed` (the same seed always produces the same image,
5
+ * which a `Math.random()` fill could not guarantee — important for reproducible
6
+ * tests and a future C port). Region pixels outside the bitmap are skipped.
7
+ *
8
+ * When `grayScale` is true, R, G, and B share one value per pixel; otherwise
9
+ * each channel is independent. Alpha is set fully opaque (255).
10
+ */
11
+ export declare function fillBitmapNoise(dest: Readonly<BitmapRegion>, seed: number, low?: number, high?: number, grayScale?: boolean): void;
12
+ /**
13
+ * Fills `out` with fractal value noise summed over `octaves`. `baseX` and
14
+ * `baseY` are the wavelengths (in pixels) of the first octave: larger values
15
+ * produce smoother, lower-frequency noise. Each successive octave doubles the
16
+ * frequency and halves the amplitude. Output is normalized to 0..255.
17
+ *
18
+ * - `baseX`, `baseY`: wavelengths in pixels of the first octave (larger = smoother).
19
+ * - `octaves`: number of frequency doublings (1 = smooth; higher = more detail).
20
+ * - `seed`: deterministic integer seed.
21
+ * - `stitch`: when `true`, the noise field tiles seamlessly at the region borders.
22
+ * - `grayScale`: when `true`, R=G=B share one noise channel. Overrides
23
+ * `channelOptions` for the RGB channels.
24
+ * - `channelOptions`: bitmask of channels to fill (default `0x7` = RGB, matching
25
+ * OpenFL's `perlinNoise` default). Channels not selected are left unchanged in
26
+ * `dest`, except alpha: when the A bit is not selected, alpha is set opaque
27
+ * (255) rather than left as-is. Use `BITMAP_NOISE_CHANNEL_*` constants. When
28
+ * `grayScale` is true the same field drives all selected RGB channels.
29
+ *
30
+ * Output range is normalized to 0..255. Alpha defaults to 255 unless the A
31
+ * bit is explicitly included in `channelOptions`.
32
+ */
33
+ export declare function fillBitmapPerlinNoise(dest: Readonly<BitmapRegion>, baseX: number, baseY: number, octaves: number, seed: number, grayScale?: boolean, stitch?: boolean, channelOptions?: number): void;
34
+ /**
35
+ * Fills `dest` with fractal **turbulence** (absolute-value fBm) value noise,
36
+ * matching OpenFL's `BitmapData.perlinNoise` with `fractalNoise: false`.
37
+ * Turbulence sums `abs(octave)` values, producing a more vigorous, ridge-like
38
+ * texture than the smooth fractal sum.
39
+ *
40
+ * Parameters are identical to `fillBitmapPerlinNoise` except there is no
41
+ * `fractalNoise` flag (this function _is_ the turbulence variant).
42
+ */
43
+ export declare function fillBitmapTurbulence(dest: Readonly<BitmapRegion>, baseX: number, baseY: number, octaves: number, seed: number, grayScale?: boolean, stitch?: boolean, channelOptions?: number): void;
44
+ export declare const BITMAP_NOISE_CHANNEL_A = 8;
45
+ export declare const BITMAP_NOISE_CHANNEL_B = 4;
46
+ export declare const BITMAP_NOISE_CHANNEL_G = 2;
47
+ export declare const BITMAP_NOISE_CHANNEL_R = 1;
48
+ //# sourceMappingURL=bitmapNoise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapNoise.d.ts","sourceRoot":"","sources":["../src/bitmapNoise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAU,EACf,IAAI,GAAE,MAAY,EAClB,SAAS,GAAE,OAAe,GACzB,IAAI,CA+BN;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,OAAe,EAC1B,MAAM,GAAE,OAAe,EACvB,cAAc,GAAE,MAAY,GAC3B,IAAI,CA4CN;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,OAAe,EAC1B,MAAM,GAAE,OAAe,EACvB,cAAc,GAAE,MAAY,GAC3B,IAAI,CA6CN;AAED,eAAO,MAAM,sBAAsB,IAAM,CAAC;AAC1C,eAAO,MAAM,sBAAsB,IAAM,CAAC;AAC1C,eAAO,MAAM,sBAAsB,IAAM,CAAC;AAC1C,eAAO,MAAM,sBAAsB,IAAM,CAAC"}
@@ -0,0 +1,245 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ /**
3
+ * Fills the `dest` region with uniform random noise in `[low, high]`, derived
4
+ * deterministically from `seed` (the same seed always produces the same image,
5
+ * which a `Math.random()` fill could not guarantee — important for reproducible
6
+ * tests and a future C port). Region pixels outside the bitmap are skipped.
7
+ *
8
+ * When `grayScale` is true, R, G, and B share one value per pixel; otherwise
9
+ * each channel is independent. Alpha is set fully opaque (255).
10
+ */
11
+ export function fillBitmapNoise(dest, seed, low = 0, high = 255, grayScale = false) {
12
+ let state = (seed | 0) >>> 0 || 1;
13
+ const lo = Math.max(0, Math.min(255, low));
14
+ const span = Math.max(0, Math.min(255, high)) - lo;
15
+ const data = dest.bitmap.data;
16
+ const bitmapWidth = dest.bitmap.width;
17
+ for (let py = 0; py < dest.height; py++) {
18
+ const y = dest.y + py;
19
+ for (let px = 0; px < dest.width; px++) {
20
+ // Advance the generator for every region pixel so the field stays
21
+ // deterministic regardless of which pixels fall outside the bitmap.
22
+ state = nextRandomState(state);
23
+ const r = lo + (state / 0x100000000) * span;
24
+ let g = r;
25
+ let b = r;
26
+ if (!grayScale) {
27
+ state = nextRandomState(state);
28
+ g = lo + (state / 0x100000000) * span;
29
+ state = nextRandomState(state);
30
+ b = lo + (state / 0x100000000) * span;
31
+ }
32
+ const x = dest.x + px;
33
+ if (y < 0 || y >= dest.bitmap.height || x < 0 || x >= bitmapWidth)
34
+ continue;
35
+ const i = (y * bitmapWidth + x) * 4;
36
+ data[i] = Math.round(r);
37
+ data[i + 1] = Math.round(g);
38
+ data[i + 2] = Math.round(b);
39
+ data[i + 3] = 255;
40
+ }
41
+ }
42
+ invalidateBitmap(dest.bitmap);
43
+ }
44
+ /**
45
+ * Fills `out` with fractal value noise summed over `octaves`. `baseX` and
46
+ * `baseY` are the wavelengths (in pixels) of the first octave: larger values
47
+ * produce smoother, lower-frequency noise. Each successive octave doubles the
48
+ * frequency and halves the amplitude. Output is normalized to 0..255.
49
+ *
50
+ * - `baseX`, `baseY`: wavelengths in pixels of the first octave (larger = smoother).
51
+ * - `octaves`: number of frequency doublings (1 = smooth; higher = more detail).
52
+ * - `seed`: deterministic integer seed.
53
+ * - `stitch`: when `true`, the noise field tiles seamlessly at the region borders.
54
+ * - `grayScale`: when `true`, R=G=B share one noise channel. Overrides
55
+ * `channelOptions` for the RGB channels.
56
+ * - `channelOptions`: bitmask of channels to fill (default `0x7` = RGB, matching
57
+ * OpenFL's `perlinNoise` default). Channels not selected are left unchanged in
58
+ * `dest`, except alpha: when the A bit is not selected, alpha is set opaque
59
+ * (255) rather than left as-is. Use `BITMAP_NOISE_CHANNEL_*` constants. When
60
+ * `grayScale` is true the same field drives all selected RGB channels.
61
+ *
62
+ * Output range is normalized to 0..255. Alpha defaults to 255 unless the A
63
+ * bit is explicitly included in `channelOptions`.
64
+ */
65
+ export function fillBitmapPerlinNoise(dest, baseX, baseY, octaves, seed, grayScale = false, stitch = false, channelOptions = 0x7) {
66
+ const fx0 = baseX > 0 ? 1 / baseX : 0;
67
+ const fy0 = baseY > 0 ? 1 / baseY : 0;
68
+ const passes = Math.max(1, Math.round(octaves));
69
+ const data = dest.bitmap.data;
70
+ const bitmapWidth = dest.bitmap.width;
71
+ const w = dest.width;
72
+ const h = dest.height;
73
+ for (let py = 0; py < dest.height; py++) {
74
+ const y = dest.y + py;
75
+ if (y < 0 || y >= dest.bitmap.height)
76
+ continue;
77
+ for (let px = 0; px < dest.width; px++) {
78
+ const x = dest.x + px;
79
+ if (x < 0 || x >= bitmapWidth)
80
+ continue;
81
+ const di = (y * bitmapWidth + x) * 4;
82
+ const nx = stitch ? stitchedCoord(px * fx0, w * fx0) : px * fx0;
83
+ const ny = stitch ? stitchedCoord(py * fy0, h * fy0) : py * fy0;
84
+ if (grayScale) {
85
+ const value = fractalValueNoise(nx, ny, passes, seed | 0);
86
+ const byte = Math.round(value * 255);
87
+ if (channelOptions & BITMAP_NOISE_CHANNEL_R)
88
+ data[di] = byte;
89
+ if (channelOptions & BITMAP_NOISE_CHANNEL_G)
90
+ data[di + 1] = byte;
91
+ if (channelOptions & BITMAP_NOISE_CHANNEL_B)
92
+ data[di + 2] = byte;
93
+ }
94
+ else {
95
+ if (channelOptions & BITMAP_NOISE_CHANNEL_R) {
96
+ data[di] = Math.round(fractalValueNoise(nx, ny, passes, seed | 0) * 255);
97
+ }
98
+ if (channelOptions & BITMAP_NOISE_CHANNEL_G) {
99
+ data[di + 1] = Math.round(fractalValueNoise(nx, ny, passes, (seed | 0) + 0x9e3779b1) * 255);
100
+ }
101
+ if (channelOptions & BITMAP_NOISE_CHANNEL_B) {
102
+ data[di + 2] = Math.round(fractalValueNoise(nx, ny, passes, (seed | 0) + 0x9e3779b2) * 255);
103
+ }
104
+ }
105
+ if (channelOptions & BITMAP_NOISE_CHANNEL_A) {
106
+ data[di + 3] = Math.round(fractalValueNoise(nx, ny, passes, (seed | 0) + 0x9e3779b3) * 255);
107
+ }
108
+ else {
109
+ data[di + 3] = 255;
110
+ }
111
+ }
112
+ }
113
+ invalidateBitmap(dest.bitmap);
114
+ }
115
+ /**
116
+ * Fills `dest` with fractal **turbulence** (absolute-value fBm) value noise,
117
+ * matching OpenFL's `BitmapData.perlinNoise` with `fractalNoise: false`.
118
+ * Turbulence sums `abs(octave)` values, producing a more vigorous, ridge-like
119
+ * texture than the smooth fractal sum.
120
+ *
121
+ * Parameters are identical to `fillBitmapPerlinNoise` except there is no
122
+ * `fractalNoise` flag (this function _is_ the turbulence variant).
123
+ */
124
+ export function fillBitmapTurbulence(dest, baseX, baseY, octaves, seed, grayScale = false, stitch = false, channelOptions = 0x7) {
125
+ const fx0 = baseX > 0 ? 1 / baseX : 0;
126
+ const fy0 = baseY > 0 ? 1 / baseY : 0;
127
+ const passes = Math.max(1, Math.round(octaves));
128
+ const data = dest.bitmap.data;
129
+ const bitmapWidth = dest.bitmap.width;
130
+ const w = dest.width;
131
+ const h = dest.height;
132
+ for (let py = 0; py < dest.height; py++) {
133
+ const y = dest.y + py;
134
+ if (y < 0 || y >= dest.bitmap.height)
135
+ continue;
136
+ for (let px = 0; px < dest.width; px++) {
137
+ const x = dest.x + px;
138
+ if (x < 0 || x >= bitmapWidth)
139
+ continue;
140
+ const di = (y * bitmapWidth + x) * 4;
141
+ const nx = stitch ? stitchedCoord(px * fx0, w * fx0) : px * fx0;
142
+ const ny = stitch ? stitchedCoord(py * fy0, h * fy0) : py * fy0;
143
+ if (grayScale) {
144
+ const value = turbulenceNoise(nx, ny, passes, seed | 0);
145
+ const byte = Math.round(value * 255);
146
+ if (channelOptions & BITMAP_NOISE_CHANNEL_R)
147
+ data[di] = byte;
148
+ if (channelOptions & BITMAP_NOISE_CHANNEL_G)
149
+ data[di + 1] = byte;
150
+ if (channelOptions & BITMAP_NOISE_CHANNEL_B)
151
+ data[di + 2] = byte;
152
+ }
153
+ else {
154
+ if (channelOptions & BITMAP_NOISE_CHANNEL_R) {
155
+ data[di] = Math.round(turbulenceNoise(nx, ny, passes, seed | 0) * 255);
156
+ }
157
+ if (channelOptions & BITMAP_NOISE_CHANNEL_G) {
158
+ data[di + 1] = Math.round(turbulenceNoise(nx, ny, passes, (seed | 0) + 0x9e3779b1) * 255);
159
+ }
160
+ if (channelOptions & BITMAP_NOISE_CHANNEL_B) {
161
+ data[di + 2] = Math.round(turbulenceNoise(nx, ny, passes, (seed | 0) + 0x9e3779b2) * 255);
162
+ }
163
+ }
164
+ if (channelOptions & BITMAP_NOISE_CHANNEL_A) {
165
+ data[di + 3] = Math.round(turbulenceNoise(nx, ny, passes, (seed | 0) + 0x9e3779b3) * 255);
166
+ }
167
+ else {
168
+ data[di + 3] = 255;
169
+ }
170
+ }
171
+ }
172
+ invalidateBitmap(dest.bitmap);
173
+ }
174
+ export const BITMAP_NOISE_CHANNEL_A = 0x8;
175
+ export const BITMAP_NOISE_CHANNEL_B = 0x4;
176
+ export const BITMAP_NOISE_CHANNEL_G = 0x2;
177
+ export const BITMAP_NOISE_CHANNEL_R = 0x1;
178
+ // Fractal sum of value noise: doubling frequency, halving amplitude per octave,
179
+ // normalized back to 0..1 by the total amplitude.
180
+ function fractalValueNoise(x, y, octaves, seed) {
181
+ let sum = 0;
182
+ let amplitude = 1;
183
+ let amplitudeSum = 0;
184
+ let frequency = 1;
185
+ for (let o = 0; o < octaves; o++) {
186
+ sum += valueNoise(x * frequency, y * frequency, seed + o * 0x85ebca6b) * amplitude;
187
+ amplitudeSum += amplitude;
188
+ amplitude *= 0.5;
189
+ frequency *= 2;
190
+ }
191
+ return amplitudeSum > 0 ? sum / amplitudeSum : 0;
192
+ }
193
+ // Integer hash to a deterministic 0..1 value; the lattice corners of valueNoise.
194
+ function hashLattice(ix, iy, seed) {
195
+ let h = (Math.imul(ix, 374761393) + Math.imul(iy, 668265263) + Math.imul(seed, 0x9e3779b1)) | 0;
196
+ h = Math.imul(h ^ (h >>> 13), 1274126177);
197
+ return ((h ^ (h >>> 16)) >>> 0) / 0x100000000;
198
+ }
199
+ // Mulberry32 step: maps one 32-bit state to the next, used as an unsigned int.
200
+ function nextRandomState(state) {
201
+ let t = (state + 0x6d2b79f5) | 0;
202
+ t = Math.imul(t ^ (t >>> 15), t | 1);
203
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
204
+ return (t ^ (t >>> 14)) >>> 0 || 1;
205
+ }
206
+ // Smoothstep, so lattice cells blend without visible seams.
207
+ function smoothStep(t) {
208
+ return t * t * (3 - 2 * t);
209
+ }
210
+ // Wraps t into [0, period) so that integer lattice indices repeat, producing seamless tiling.
211
+ function stitchedCoord(t, period) {
212
+ if (period <= 0)
213
+ return t;
214
+ return ((t % period) + period) % period;
215
+ }
216
+ // Fractal turbulence: abs(2*v - 1) fBm, producing a more vigorous ridge-like texture than
217
+ // the smooth fractal sum (matches OpenFL perlinNoise with fractalNoise=false).
218
+ function turbulenceNoise(x, y, octaves, seed) {
219
+ let sum = 0;
220
+ let amplitude = 1;
221
+ let amplitudeSum = 0;
222
+ let frequency = 1;
223
+ for (let o = 0; o < octaves; o++) {
224
+ sum += Math.abs(valueNoise(x * frequency, y * frequency, seed + o * 0x85ebca6b) * 2 - 1) * amplitude;
225
+ amplitudeSum += amplitude;
226
+ amplitude *= 0.5;
227
+ frequency *= 2;
228
+ }
229
+ return amplitudeSum > 0 ? sum / amplitudeSum : 0;
230
+ }
231
+ // Bilinearly-interpolated lattice hash — one octave of value noise in 0..1.
232
+ function valueNoise(x, y, seed) {
233
+ const ix = Math.floor(x);
234
+ const iy = Math.floor(y);
235
+ const fx = smoothStep(x - ix);
236
+ const fy = smoothStep(y - iy);
237
+ const v00 = hashLattice(ix, iy, seed);
238
+ const v10 = hashLattice(ix + 1, iy, seed);
239
+ const v01 = hashLattice(ix, iy + 1, seed);
240
+ const v11 = hashLattice(ix + 1, iy + 1, seed);
241
+ const top = v00 + (v10 - v00) * fx;
242
+ const bottom = v01 + (v11 - v01) * fx;
243
+ return top + (bottom - top) * fy;
244
+ }
245
+ //# sourceMappingURL=bitmapNoise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapNoise.js","sourceRoot":"","sources":["../src/bitmapNoise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Remaps each color channel of `source` independently through a 256-entry
4
+ * lookup table, writing into `dest`. Each table is indexed by the 0..255 input
5
+ * channel value and supplies the 0..255 output value; a `null` table leaves
6
+ * that channel unchanged. The remapped size is the overlap of the two regions.
7
+ *
8
+ * This is the building block for levels, curves, gamma, posterize, and
9
+ * per-channel inversion. Unlike Flash's 32-bit-summing `paletteMap`, the
10
+ * channels are mapped independently, which is what level/curve adjustments
11
+ * need; build a table once and reuse it across frames.
12
+ *
13
+ * Safe to pass the same bitmap and region in `dest` and `source` — each
14
+ * pixel's channels are read before any channel of that pixel is written.
15
+ */
16
+ export declare function applyBitmapPaletteMap(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, redMap: ReadonlyArray<number> | null, greenMap: ReadonlyArray<number> | null, blueMap: ReadonlyArray<number> | null, alphaMap: ReadonlyArray<number> | null): void;
17
+ //# sourceMappingURL=bitmapPaletteMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPaletteMap.d.ts","sourceRoot":"","sources":["../src/bitmapPaletteMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,EACpC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,EACtC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,GACrC,IAAI,CA0BN"}
@@ -0,0 +1,45 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ /**
3
+ * Remaps each color channel of `source` independently through a 256-entry
4
+ * lookup table, writing into `dest`. Each table is indexed by the 0..255 input
5
+ * channel value and supplies the 0..255 output value; a `null` table leaves
6
+ * that channel unchanged. The remapped size is the overlap of the two regions.
7
+ *
8
+ * This is the building block for levels, curves, gamma, posterize, and
9
+ * per-channel inversion. Unlike Flash's 32-bit-summing `paletteMap`, the
10
+ * channels are mapped independently, which is what level/curve adjustments
11
+ * need; build a table once and reuse it across frames.
12
+ *
13
+ * Safe to pass the same bitmap and region in `dest` and `source` — each
14
+ * pixel's channels are read before any channel of that pixel is written.
15
+ */
16
+ export function applyBitmapPaletteMap(dest, source, redMap, greenMap, blueMap, alphaMap) {
17
+ const w = Math.min(dest.width, source.width);
18
+ const h = Math.min(dest.height, source.height);
19
+ const sd = source.bitmap.data;
20
+ const dd = dest.bitmap.data;
21
+ for (let py = 0; py < h; py++) {
22
+ const sy = source.y + py;
23
+ const dy = dest.y + py;
24
+ if (sy < 0 || sy >= source.bitmap.height || dy < 0 || dy >= dest.bitmap.height)
25
+ continue;
26
+ for (let px = 0; px < w; px++) {
27
+ const sx = source.x + px;
28
+ const dx = dest.x + px;
29
+ if (sx < 0 || sx >= source.bitmap.width || dx < 0 || dx >= dest.bitmap.width)
30
+ continue;
31
+ const si = (sy * source.bitmap.width + sx) * 4;
32
+ const di = (dy * dest.bitmap.width + dx) * 4;
33
+ const r = sd[si];
34
+ const g = sd[si + 1];
35
+ const b = sd[si + 2];
36
+ const a = sd[si + 3];
37
+ dd[di] = redMap ? redMap[r] : r;
38
+ dd[di + 1] = greenMap ? greenMap[g] : g;
39
+ dd[di + 2] = blueMap ? blueMap[b] : b;
40
+ dd[di + 3] = alphaMap ? alphaMap[a] : a;
41
+ }
42
+ }
43
+ invalidateBitmap(dest.bitmap);
44
+ }
45
+ //# sourceMappingURL=bitmapPaletteMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPaletteMap.js","sourceRoot":"","sources":["../src/bitmapPaletteMap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA4B,EAC5B,MAA8B,EAC9B,MAAoC,EACpC,QAAsC,EACtC,OAAqC,EACrC,QAAsC;IAEtC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,SAAS;QACzF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,SAAS;YACvF,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Bitmap } from '@flighthq/types/contract';
2
+ import type { ImageChannel } from './bitmapImageChannel';
3
+ export declare function getBitmapPixel(source: Readonly<Bitmap>, x: number, y: number): number;
4
+ export declare function getBitmapPixelChannel(source: Readonly<Bitmap>, x: number, y: number, channel: ImageChannel): number;
5
+ export declare function getBitmapPixelLuminance(source: Readonly<Bitmap>, x: number, y: number): number;
6
+ export declare function getBitmapPixelRgb(source: Readonly<Bitmap>, x: number, y: number): number;
7
+ export declare function setBitmapPixel(out: Bitmap, x: number, y: number, color: number): void;
8
+ export declare function setBitmapPixelRgb(out: Bitmap, x: number, y: number, color: number): void;
9
+ //# sourceMappingURL=bitmapPixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPixel.d.ts","sourceRoot":"","sources":["../src/bitmapPixel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOzD,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAEnH;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOrF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMxF"}