@flighthq/bitmap 0.3.0-next.1021.f5f1ee0

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 (214) 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 +131 -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 +17 -0
  86. package/dist/bitmapFrom.d.ts.map +1 -0
  87. package/dist/bitmapFrom.js +67 -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 +42 -0
  166. package/dist/contract.d.ts.map +1 -0
  167. package/dist/contract.js +42 -0
  168. package/dist/contract.js.map +1 -0
  169. package/dist/index.d.ts +2 -0
  170. package/dist/index.d.ts.map +1 -0
  171. package/dist/index.js +2 -0
  172. package/dist/index.js.map +1 -0
  173. package/package.json +48 -0
  174. package/src/bitmap.test.ts +88 -0
  175. package/src/bitmapAffine.test.ts +98 -0
  176. package/src/bitmapAlpha.test.ts +110 -0
  177. package/src/bitmapBevel.test.ts +61 -0
  178. package/src/bitmapBlur.test.ts +234 -0
  179. package/src/bitmapChannel.test.ts +97 -0
  180. package/src/bitmapColorMatrix.test.ts +214 -0
  181. package/src/bitmapCompare.test.ts +92 -0
  182. package/src/bitmapComposite.test.ts +259 -0
  183. package/src/bitmapConvolution.test.ts +130 -0
  184. package/src/bitmapCopy.test.ts +48 -0
  185. package/src/bitmapCoverage.test.ts +39 -0
  186. package/src/bitmapCrop.test.ts +116 -0
  187. package/src/bitmapDisplacement.test.ts +136 -0
  188. package/src/bitmapDissolve.test.ts +99 -0
  189. package/src/bitmapDraw.test.ts +68 -0
  190. package/src/bitmapEncode.test.ts +18 -0
  191. package/src/bitmapFill.test.ts +83 -0
  192. package/src/bitmapFingerprint.test.ts +103 -0
  193. package/src/bitmapFlip.test.ts +53 -0
  194. package/src/bitmapFormat.test.ts +124 -0
  195. package/src/bitmapFrom.test.ts +57 -0
  196. package/src/bitmapGradient.test.ts +85 -0
  197. package/src/bitmapGradientFill.test.ts +107 -0
  198. package/src/bitmapHistogram.test.ts +64 -0
  199. package/src/bitmapImageChannel.test.ts +19 -0
  200. package/src/bitmapMedian.test.ts +39 -0
  201. package/src/bitmapMorphological.test.ts +69 -0
  202. package/src/bitmapNoise.test.ts +163 -0
  203. package/src/bitmapPaletteMap.test.ts +49 -0
  204. package/src/bitmapPixel.test.ts +117 -0
  205. package/src/bitmapPixelate.test.ts +40 -0
  206. package/src/bitmapQuery.test.ts +42 -0
  207. package/src/bitmapRegion.test.ts +34 -0
  208. package/src/bitmapResize.test.ts +106 -0
  209. package/src/bitmapRotate.test.ts +108 -0
  210. package/src/bitmapShadow.test.ts +159 -0
  211. package/src/bitmapSharpen.test.ts +44 -0
  212. package/src/bitmapTone.test.ts +104 -0
  213. package/src/bitmapTransform.test.ts +128 -0
  214. package/src/bitmapWarp.test.ts +118 -0
@@ -0,0 +1,97 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ /**
3
+ * Transitions `dest` toward `source` one batch of pixels at a time, in a
4
+ * deterministic pseudo-random order — the classic dissolve wipe. Each call
5
+ * dissolves up to `pixelCount` not-yet-dissolved pixels and returns the next
6
+ * seed; pass that value back on the following call to continue the wipe without
7
+ * revisiting any pixel. Start a fresh dissolve with `seed = 0`. Once every pixel
8
+ * has dissolved the returned seed is terminal: further calls with it are no-ops.
9
+ *
10
+ * `seed` is an opaque progress cursor over a fixed permutation of the region's
11
+ * pixels, not a color or coordinate. The dissolve order is fully deterministic
12
+ * in the region's dimensions.
13
+ *
14
+ * When `source` is the same region as `dest` (same bitmap and identical
15
+ * bounds), dissolved pixels are set to `fillColor` (packed `0xRRGGBBAA`);
16
+ * otherwise each is copied from the matching pixel in
17
+ * `source` and `fillColor` is ignored. Pixels that fall outside the bitmap are
18
+ * clipped but still consume a step of the sequence.
19
+ */
20
+ export function dissolveBitmapPixels(dest, source, seed, pixelCount, fillColor = 0) {
21
+ const width = dest.width;
22
+ const height = dest.height;
23
+ const total = width * height;
24
+ if (total <= 0)
25
+ return seed;
26
+ let bits = 0;
27
+ while (1 << bits < total)
28
+ bits++;
29
+ const period = 1 << bits;
30
+ const mask = period - 1;
31
+ let cursor = seed < 0 ? 0 : seed > period ? period : seed | 0;
32
+ if (pixelCount <= 0)
33
+ return cursor;
34
+ const toFill = source.bitmap === dest.bitmap &&
35
+ source.x === dest.x &&
36
+ source.y === dest.y &&
37
+ source.width === dest.width &&
38
+ source.height === dest.height;
39
+ const fillR = (fillColor >>> 24) & 0xff;
40
+ const fillG = (fillColor >> 16) & 0xff;
41
+ const fillB = (fillColor >> 8) & 0xff;
42
+ const fillA = fillColor & 0xff;
43
+ const destData = dest.bitmap.data;
44
+ const destStride = dest.bitmap.width;
45
+ const destBitmapHeight = dest.bitmap.height;
46
+ const sourceData = source.bitmap.data;
47
+ const sourceStride = source.bitmap.width;
48
+ const sourceBitmapHeight = source.bitmap.height;
49
+ let dissolved = 0;
50
+ while (dissolved < pixelCount && cursor < period) {
51
+ const pixelIndex = permutePixelIndex(cursor, bits, mask);
52
+ cursor++;
53
+ if (pixelIndex >= total)
54
+ continue;
55
+ dissolved++;
56
+ const px = pixelIndex % width;
57
+ const py = (pixelIndex / width) | 0;
58
+ const dx = dest.x + px;
59
+ const dy = dest.y + py;
60
+ if (dx < 0 || dx >= destStride || dy < 0 || dy >= destBitmapHeight)
61
+ continue;
62
+ const di = (dy * destStride + dx) * 4;
63
+ if (toFill) {
64
+ destData[di] = fillR;
65
+ destData[di + 1] = fillG;
66
+ destData[di + 2] = fillB;
67
+ destData[di + 3] = fillA;
68
+ continue;
69
+ }
70
+ const sx = source.x + px;
71
+ const sy = source.y + py;
72
+ if (sx < 0 || sx >= sourceStride || sy < 0 || sy >= sourceBitmapHeight)
73
+ continue;
74
+ const si = (sy * sourceStride + sx) * 4;
75
+ destData[di] = sourceData[si];
76
+ destData[di + 1] = sourceData[si + 1];
77
+ destData[di + 2] = sourceData[si + 2];
78
+ destData[di + 3] = sourceData[si + 3];
79
+ }
80
+ invalidateBitmap(dest.bitmap);
81
+ return cursor;
82
+ }
83
+ // Bijection on [0, 2^bits): a composition of multiply-by-odd (invertible mod
84
+ // 2^bits), xor-shift, and xor-constant, each individually reversible. Walking
85
+ // `cursor` across the full period therefore visits every index in [0, total)
86
+ // exactly once (cycle-walking skips the indices >= total), which is what
87
+ // guarantees a dissolve eventually covers the whole region without repeats.
88
+ function permutePixelIndex(cursor, bits, mask) {
89
+ let v = cursor & mask;
90
+ const shift = bits > 1 ? bits >> 1 : 1;
91
+ v = Math.imul(v, 0x9e3779b1) & mask;
92
+ v ^= v >>> shift;
93
+ v = Math.imul(v, 0x85ebca77) & mask;
94
+ v ^= 0x27d4eb2f & mask;
95
+ return v & mask;
96
+ }
97
+ //# sourceMappingURL=bitmapDissolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapDissolve.js","sourceRoot":"","sources":["../src/bitmapDissolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Draws the `source` region onto a 2D canvas at `(x, y)` via `putImageData`.
4
+ * A region with a zero dimension is a no-op (`ImageData` requires positive
5
+ * dimensions).
6
+ */
7
+ export declare function drawBitmap(dest: HTMLCanvasElement, source: Readonly<BitmapRegion>, x: number, y: number): void;
8
+ //# sourceMappingURL=bitmapDraw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapDraw.d.ts","sourceRoot":"","sources":["../src/bitmapDraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAK9G"}
@@ -0,0 +1,14 @@
1
+ import { extractBitmapPixels } from './bitmapComposite';
2
+ /**
3
+ * Draws the `source` region onto a 2D canvas at `(x, y)` via `putImageData`.
4
+ * A region with a zero dimension is a no-op (`ImageData` requires positive
5
+ * dimensions).
6
+ */
7
+ export function drawBitmap(dest, source, x, y) {
8
+ if (source.width <= 0 || source.height <= 0)
9
+ return;
10
+ const domImageData = new globalThis.ImageData(source.width, source.height);
11
+ extractBitmapPixels(domImageData.data, source);
12
+ dest.getContext('2d').putImageData(domImageData, x, y);
13
+ }
14
+ //# sourceMappingURL=bitmapDraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapDraw.js","sourceRoot":"","sources":["../src/bitmapDraw.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAuB,EAAE,MAA8B,EAAE,CAAS,EAAE,CAAS;IACtG,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO;IACpD,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3E,mBAAmB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ImageFormat, Bitmap } from '@flighthq/types/contract';
2
+ export declare function encodeBitmap(source: Readonly<Bitmap>, format?: ImageFormat, quality?: number): Uint8Array;
3
+ //# sourceMappingURL=bitmapEncode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapEncode.d.ts","sourceRoot":"","sources":["../src/bitmapEncode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAE,WAAmB,EAAE,OAAO,GAAE,MAAY,GAAG,UAAU,CAgBrH"}
@@ -0,0 +1,18 @@
1
+ export function encodeBitmap(source, format = 'png', quality = 0.9) {
2
+ const canvas = document.createElement('canvas');
3
+ canvas.width = source.width;
4
+ canvas.height = source.height;
5
+ const domImageData = new globalThis.ImageData(source.width, source.height);
6
+ domImageData.data.set(source.data);
7
+ canvas.getContext('2d').putImageData(domImageData, 0, 0);
8
+ const mimeType = format === 'jpeg' ? 'image/jpeg' : 'image/png';
9
+ const dataUrl = canvas.toDataURL(mimeType, quality);
10
+ const base64 = dataUrl.slice(dataUrl.indexOf(',') + 1);
11
+ const binary = atob(base64);
12
+ const bytes = new Uint8Array(binary.length);
13
+ for (let i = 0; i < binary.length; i++) {
14
+ bytes[i] = binary.charCodeAt(i);
15
+ }
16
+ return bytes;
17
+ }
18
+ //# sourceMappingURL=bitmapEncode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapEncode.js","sourceRoot":"","sources":["../src/bitmapEncode.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAwB,EAAE,SAAsB,KAAK,EAAE,UAAkB,GAAG;IACvG,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3E,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { Bitmap, BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Fills the rectangular `dest` region with a packed RGBA `color`. Pixels of the
4
+ * region that fall outside the bitmap are skipped.
5
+ */
6
+ export declare function fillBitmapRectangle(dest: Readonly<BitmapRegion>, color: number): void;
7
+ /**
8
+ * Flood-fills a connected region of `out` starting at `(x, y)`. Uses a
9
+ * module-level visited buffer that grows as needed and is reused across calls.
10
+ */
11
+ export declare function floodFillBitmap(out: Bitmap, x: number, y: number, color: number): void;
12
+ //# sourceMappingURL=bitmapFill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFill.d.ts","sourceRoot":"","sources":["../src/bitmapFill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMrE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAmBrF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAuDtF"}
@@ -0,0 +1,85 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ let _floodFillVisited = null;
3
+ /**
4
+ * Fills the rectangular `dest` region with a packed RGBA `color`. Pixels of the
5
+ * region that fall outside the bitmap are skipped.
6
+ */
7
+ export function fillBitmapRectangle(dest, color) {
8
+ const r = (color >>> 24) & 0xff;
9
+ const g = (color >> 16) & 0xff;
10
+ const b = (color >> 8) & 0xff;
11
+ const a = color & 0xff;
12
+ for (let py = 0; py < dest.height; py++) {
13
+ const y = dest.y + py;
14
+ if (y < 0 || y >= dest.bitmap.height)
15
+ continue;
16
+ for (let px = 0; px < dest.width; px++) {
17
+ const x = dest.x + px;
18
+ if (x < 0 || x >= dest.bitmap.width)
19
+ continue;
20
+ const i = (y * dest.bitmap.width + x) * 4;
21
+ dest.bitmap.data[i] = r;
22
+ dest.bitmap.data[i + 1] = g;
23
+ dest.bitmap.data[i + 2] = b;
24
+ dest.bitmap.data[i + 3] = a;
25
+ }
26
+ }
27
+ invalidateBitmap(dest.bitmap);
28
+ }
29
+ /**
30
+ * Flood-fills a connected region of `out` starting at `(x, y)`. Uses a
31
+ * module-level visited buffer that grows as needed and is reused across calls.
32
+ */
33
+ export function floodFillBitmap(out, x, y, color) {
34
+ if (x < 0 || x >= out.width || y < 0 || y >= out.height)
35
+ return;
36
+ const fillR = (color >>> 24) & 0xff;
37
+ const fillG = (color >> 16) & 0xff;
38
+ const fillB = (color >> 8) & 0xff;
39
+ const fillA = color & 0xff;
40
+ const targetI = (y * out.width + x) * 4;
41
+ const targetR = out.data[targetI];
42
+ const targetG = out.data[targetI + 1];
43
+ const targetB = out.data[targetI + 2];
44
+ const targetA = out.data[targetI + 3];
45
+ if (targetR === fillR && targetG === fillG && targetB === fillB && targetA === fillA)
46
+ return;
47
+ const needed = out.width * out.height;
48
+ if (_floodFillVisited === null || _floodFillVisited.length < needed) {
49
+ _floodFillVisited = new Uint8Array(needed);
50
+ }
51
+ else {
52
+ _floodFillVisited.fill(0, 0, needed);
53
+ }
54
+ const visited = _floodFillVisited;
55
+ const stack = [x + y * out.width];
56
+ while (stack.length > 0) {
57
+ const idx = stack.pop();
58
+ if (visited[idx])
59
+ continue;
60
+ visited[idx] = 1;
61
+ const px = idx % out.width;
62
+ const py = Math.floor(idx / out.width);
63
+ const i = idx * 4;
64
+ if (out.data[i] !== targetR ||
65
+ out.data[i + 1] !== targetG ||
66
+ out.data[i + 2] !== targetB ||
67
+ out.data[i + 3] !== targetA) {
68
+ continue;
69
+ }
70
+ out.data[i] = fillR;
71
+ out.data[i + 1] = fillG;
72
+ out.data[i + 2] = fillB;
73
+ out.data[i + 3] = fillA;
74
+ if (px > 0)
75
+ stack.push(idx - 1);
76
+ if (px < out.width - 1)
77
+ stack.push(idx + 1);
78
+ if (py > 0)
79
+ stack.push(idx - out.width);
80
+ if (py < out.height - 1)
81
+ stack.push(idx + out.width);
82
+ }
83
+ invalidateBitmap(out);
84
+ }
85
+ //# sourceMappingURL=bitmapFill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFill.js","sourceRoot":"","sources":["../src/bitmapFill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Bitmap, BitmapFingerprint } from '@flighthq/types/contract';
2
+ /**
3
+ * The mean absolute per-channel difference (0..255) between two fingerprints of the same gridSize.
4
+ * Threshold it to gate regressions: ~0 is identical, small single digits are antialiasing/noise,
5
+ * large values mean a real visual change. Throws if the gridSizes differ — they are not comparable.
6
+ */
7
+ export declare function compareBitmapFingerprints(a: Readonly<BitmapFingerprint>, b: Readonly<BitmapFingerprint>): number;
8
+ /**
9
+ * Reduces a bitmap to a gridSize × gridSize grid of averaged RGB cells. Each cell averages the RGB
10
+ * of the source pixels that fall in it (alpha is ignored — visible colour is what regressions show
11
+ * up in). gridSize controls fidelity vs. text size; the default of 16 catches layout/colour shifts
12
+ * while staying ~1 KB as text. An empty bitmap yields an all-zero grid.
13
+ */
14
+ export declare function createBitmapFingerprint(source: Readonly<Bitmap>, gridSize?: number): BitmapFingerprint;
15
+ /**
16
+ * Serializes a fingerprint to a compact, git-diffable text line: `<gridSize>:<hex cells>`. This is
17
+ * what gets committed as a regression baseline instead of a screenshot.
18
+ */
19
+ export declare function formatBitmapFingerprint(fingerprint: Readonly<BitmapFingerprint>): string;
20
+ /**
21
+ * Parses the text form produced by formatBitmapFingerprint. Returns `null` for malformed input
22
+ * (wrong shape, odd hex length, or a cell count that is not gridSize × gridSize × 3) so callers can
23
+ * treat a corrupt baseline as "no baseline" rather than crashing.
24
+ */
25
+ export declare function parseBitmapFingerprint(text: string): BitmapFingerprint | null;
26
+ //# sourceMappingURL=bitmapFingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFingerprint.d.ts","sourceRoot":"","sources":["../src/bitmapFingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAQ1E;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAQhH;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAE,MAAW,GAAG,iBAAiB,CAkC1G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAOxF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiB7E"}
@@ -0,0 +1,99 @@
1
+ // A coarse downscaled RGB fingerprint: the bitmap is averaged into a gridSize × gridSize grid, so
2
+ // antialiasing jitter that breaks an exact hash washes out while gross changes still register. The
3
+ // committed regression baseline is the hex-encoded form (formatBitmapFingerprint), not a PNG.
4
+ const HEX = '0123456789abcdef';
5
+ /**
6
+ * The mean absolute per-channel difference (0..255) between two fingerprints of the same gridSize.
7
+ * Threshold it to gate regressions: ~0 is identical, small single digits are antialiasing/noise,
8
+ * large values mean a real visual change. Throws if the gridSizes differ — they are not comparable.
9
+ */
10
+ export function compareBitmapFingerprints(a, b) {
11
+ if (a.gridSize !== b.gridSize) {
12
+ throw new Error(`compareBitmapFingerprints: gridSize mismatch (${a.gridSize} vs ${b.gridSize})`);
13
+ }
14
+ if (a.cells.length === 0)
15
+ return 0;
16
+ let sum = 0;
17
+ for (let i = 0; i < a.cells.length; i++)
18
+ sum += Math.abs(a.cells[i] - b.cells[i]);
19
+ return sum / a.cells.length;
20
+ }
21
+ /**
22
+ * Reduces a bitmap to a gridSize × gridSize grid of averaged RGB cells. Each cell averages the RGB
23
+ * of the source pixels that fall in it (alpha is ignored — visible colour is what regressions show
24
+ * up in). gridSize controls fidelity vs. text size; the default of 16 catches layout/colour shifts
25
+ * while staying ~1 KB as text. An empty bitmap yields an all-zero grid.
26
+ */
27
+ export function createBitmapFingerprint(source, gridSize = 16) {
28
+ if (gridSize < 1)
29
+ throw new Error(`createBitmapFingerprint: gridSize must be >= 1 (got ${gridSize})`);
30
+ const cells = new Uint8Array(gridSize * gridSize * 3);
31
+ const { width, height, data } = source;
32
+ if (width === 0 || height === 0)
33
+ return { gridSize, cells };
34
+ for (let cy = 0; cy < gridSize; cy++) {
35
+ const y0 = Math.floor((cy * height) / gridSize);
36
+ const y1 = Math.max(y0 + 1, Math.floor(((cy + 1) * height) / gridSize));
37
+ for (let cx = 0; cx < gridSize; cx++) {
38
+ const x0 = Math.floor((cx * width) / gridSize);
39
+ const x1 = Math.max(x0 + 1, Math.floor(((cx + 1) * width) / gridSize));
40
+ let sumR = 0;
41
+ let sumG = 0;
42
+ let sumB = 0;
43
+ let count = 0;
44
+ for (let y = y0; y < y1 && y < height; y++) {
45
+ let i = (y * width + x0) * 4;
46
+ for (let x = x0; x < x1 && x < width; x++) {
47
+ sumR += data[i];
48
+ sumG += data[i + 1];
49
+ sumB += data[i + 2];
50
+ count++;
51
+ i += 4;
52
+ }
53
+ }
54
+ const c = (cy * gridSize + cx) * 3;
55
+ cells[c] = count === 0 ? 0 : Math.round(sumR / count);
56
+ cells[c + 1] = count === 0 ? 0 : Math.round(sumG / count);
57
+ cells[c + 2] = count === 0 ? 0 : Math.round(sumB / count);
58
+ }
59
+ }
60
+ return { gridSize, cells };
61
+ }
62
+ /**
63
+ * Serializes a fingerprint to a compact, git-diffable text line: `<gridSize>:<hex cells>`. This is
64
+ * what gets committed as a regression baseline instead of a screenshot.
65
+ */
66
+ export function formatBitmapFingerprint(fingerprint) {
67
+ const cells = fingerprint.cells;
68
+ let hex = '';
69
+ for (let i = 0; i < cells.length; i++) {
70
+ hex += HEX[(cells[i] >> 4) & 0xf] + HEX[cells[i] & 0xf];
71
+ }
72
+ return `${fingerprint.gridSize}:${hex}`;
73
+ }
74
+ /**
75
+ * Parses the text form produced by formatBitmapFingerprint. Returns `null` for malformed input
76
+ * (wrong shape, odd hex length, or a cell count that is not gridSize × gridSize × 3) so callers can
77
+ * treat a corrupt baseline as "no baseline" rather than crashing.
78
+ */
79
+ export function parseBitmapFingerprint(text) {
80
+ const colon = text.indexOf(':');
81
+ if (colon <= 0)
82
+ return null;
83
+ const gridSize = Number.parseInt(text.slice(0, colon), 10);
84
+ if (!Number.isInteger(gridSize) || gridSize < 1)
85
+ return null;
86
+ const hex = text.slice(colon + 1);
87
+ if (hex.length !== gridSize * gridSize * 3 * 2)
88
+ return null;
89
+ const cells = new Uint8Array(hex.length / 2);
90
+ for (let i = 0; i < cells.length; i++) {
91
+ const hi = HEX.indexOf(hex[i * 2]);
92
+ const lo = HEX.indexOf(hex[i * 2 + 1]);
93
+ if (hi < 0 || lo < 0)
94
+ return null;
95
+ cells[i] = (hi << 4) | lo;
96
+ }
97
+ return { gridSize, cells };
98
+ }
99
+ //# sourceMappingURL=bitmapFingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFingerprint.js","sourceRoot":"","sources":["../src/bitmapFingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Mirrors the `source` region left-to-right into the `dest` region. The mirror
4
+ * size is the overlap of the two regions. Safe to pass the same bitmap and
5
+ * region in `dest` and `source` for an in-place flip — when aliased, columns
6
+ * are swapped in pairs; otherwise `dest` and `source` must not overlap.
7
+ */
8
+ export declare function flipBitmapHorizontal(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
9
+ /**
10
+ * Mirrors the `source` region top-to-bottom into the `dest` region. The mirror
11
+ * size is the overlap of the two regions. Safe to pass the same bitmap and
12
+ * region in `dest` and `source` for an in-place flip — when aliased, rows are
13
+ * swapped in pairs; otherwise `dest` and `source` must not overlap.
14
+ */
15
+ export declare function flipBitmapVertical(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
16
+ //# sourceMappingURL=bitmapFlip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFlip.d.ts","sourceRoot":"","sources":["../src/bitmapFlip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAqBvG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAqBrG"}
@@ -0,0 +1,98 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ /**
3
+ * Mirrors the `source` region left-to-right into the `dest` region. The mirror
4
+ * size is the overlap of the two regions. Safe to pass the same bitmap and
5
+ * region in `dest` and `source` for an in-place flip — when aliased, columns
6
+ * are swapped in pairs; otherwise `dest` and `source` must not overlap.
7
+ */
8
+ export function flipBitmapHorizontal(dest, source) {
9
+ const w = Math.min(dest.width, source.width);
10
+ const h = Math.min(dest.height, source.height);
11
+ const data = dest.bitmap.data;
12
+ const stride = dest.bitmap.width;
13
+ if (isSameRegion(dest, source)) {
14
+ const half = w >> 1;
15
+ for (let py = 0; py < h; py++) {
16
+ const y = dest.y + py;
17
+ if (y < 0 || y >= dest.bitmap.height)
18
+ continue;
19
+ for (let px = 0; px < half; px++) {
20
+ const xa = dest.x + px;
21
+ const xb = dest.x + (w - 1 - px);
22
+ if (xa < 0 || xa >= stride || xb < 0 || xb >= stride)
23
+ continue;
24
+ swapPixels(data, (y * stride + xa) * 4, (y * stride + xb) * 4);
25
+ }
26
+ }
27
+ return;
28
+ }
29
+ copyMirrored(dest, source, w, h, true, false);
30
+ invalidateBitmap(dest.bitmap);
31
+ }
32
+ /**
33
+ * Mirrors the `source` region top-to-bottom into the `dest` region. The mirror
34
+ * size is the overlap of the two regions. Safe to pass the same bitmap and
35
+ * region in `dest` and `source` for an in-place flip — when aliased, rows are
36
+ * swapped in pairs; otherwise `dest` and `source` must not overlap.
37
+ */
38
+ export function flipBitmapVertical(dest, source) {
39
+ const w = Math.min(dest.width, source.width);
40
+ const h = Math.min(dest.height, source.height);
41
+ const data = dest.bitmap.data;
42
+ const stride = dest.bitmap.width;
43
+ if (isSameRegion(dest, source)) {
44
+ const half = h >> 1;
45
+ for (let py = 0; py < half; py++) {
46
+ const yTop = dest.y + py;
47
+ const yBottom = dest.y + (h - 1 - py);
48
+ if (yTop < 0 || yTop >= dest.bitmap.height || yBottom < 0 || yBottom >= dest.bitmap.height)
49
+ continue;
50
+ for (let px = 0; px < w; px++) {
51
+ const x = dest.x + px;
52
+ if (x < 0 || x >= stride)
53
+ continue;
54
+ swapPixels(data, (yTop * stride + x) * 4, (yBottom * stride + x) * 4);
55
+ }
56
+ }
57
+ return;
58
+ }
59
+ copyMirrored(dest, source, w, h, false, true);
60
+ invalidateBitmap(dest.bitmap);
61
+ }
62
+ // Copies source -> dest with optional per-axis mirroring. Used for the
63
+ // non-aliased flip path (distinct bitmaps or non-overlapping regions).
64
+ function copyMirrored(dest, source, w, h, mirrorX, mirrorY) {
65
+ const sd = source.bitmap.data;
66
+ const dd = dest.bitmap.data;
67
+ const sStride = source.bitmap.width;
68
+ const dStride = dest.bitmap.width;
69
+ for (let py = 0; py < h; py++) {
70
+ const sy = source.y + (mirrorY ? h - 1 - py : py);
71
+ const dy = dest.y + py;
72
+ if (sy < 0 || sy >= source.bitmap.height || dy < 0 || dy >= dest.bitmap.height)
73
+ continue;
74
+ for (let px = 0; px < w; px++) {
75
+ const sx = source.x + (mirrorX ? w - 1 - px : px);
76
+ const dx = dest.x + px;
77
+ if (sx < 0 || sx >= sStride || dx < 0 || dx >= dStride)
78
+ continue;
79
+ const si = (sy * sStride + sx) * 4;
80
+ const di = (dy * dStride + dx) * 4;
81
+ dd[di] = sd[si];
82
+ dd[di + 1] = sd[si + 1];
83
+ dd[di + 2] = sd[si + 2];
84
+ dd[di + 3] = sd[si + 3];
85
+ }
86
+ }
87
+ }
88
+ function isSameRegion(a, b) {
89
+ return a.bitmap === b.bitmap && a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
90
+ }
91
+ function swapPixels(data, a, b) {
92
+ for (let c = 0; c < 4; c++) {
93
+ const t = data[a + c];
94
+ data[a + c] = data[b + c];
95
+ data[b + c] = t;
96
+ }
97
+ }
98
+ //# sourceMappingURL=bitmapFlip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFlip.js","sourceRoot":"","sources":["../src/bitmapFlip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PixelOrder } from '@flighthq/types/contract';
2
+ /**
3
+ * Converts a packed pixel buffer from one channel order to another.
4
+ * Safe to pass the same buffer as both `out` and `source` — all four
5
+ * channels are read into locals before any write.
6
+ */
7
+ export declare function convertBitmapPixelOrder(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number, from: PixelOrder, to: PixelOrder): void;
8
+ /**
9
+ * Converts straight-alpha pixels to premultiplied alpha in place or into
10
+ * a separate buffer. RGB channels are multiplied by alpha/255.
11
+ * Safe to pass the same buffer as both `out` and `source`.
12
+ *
13
+ * Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
14
+ * ImageResource, set its `alphaType` to `premultiplied` to keep it truthful.
15
+ */
16
+ export declare function premultiplyBitmapPixels(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number): void;
17
+ /**
18
+ * Converts premultiplied-alpha pixels back to straight alpha in place or
19
+ * into a separate buffer. Pixels with alpha=0 are written as (0,0,0,0).
20
+ * Safe to pass the same buffer as both `out` and `source`.
21
+ *
22
+ * Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
23
+ * ImageResource, set its `alphaType` to `straight` to keep it truthful.
24
+ */
25
+ export declare function unpremultiplyBitmapPixels(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number): void;
26
+ //# sourceMappingURL=bitmapFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFormat.d.ts","sourceRoot":"","sources":["../src/bitmapFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,GACb,IAAI,CAiBN;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,IAAI,CAQN;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,IAAI,CAgBN"}