@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 @@
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":"AAEA,kGAAkG;AAClG,mGAAmG;AACnG,8FAA8F;AAE9F,MAAM,GAAG,GAAG,kBAAkB,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,CAA8B,EAAE,CAA8B;IACtG,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAwB,EAAE,WAAmB,EAAE;IACrF,IAAI,QAAQ,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,QAAQ,GAAG,CAAC,CAAC;IAEtG,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE5D,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QACxE,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YACvE,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC7B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpB,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpB,KAAK,EAAE,CAAC;oBACR,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACnC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YACtD,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YAC1D,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAwC;IAC9E,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IAChC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,WAAW,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC"}
@@ -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
+ * Image, 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
+ * Image, 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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Converts a packed pixel buffer from one channel order to another.
3
+ * Safe to pass the same buffer as both `out` and `source` — all four
4
+ * channels are read into locals before any write.
5
+ */
6
+ export function convertBitmapPixelOrder(out, source, length, from, to) {
7
+ if (from === to) {
8
+ if (out !== source)
9
+ out.set(source.subarray(0, length));
10
+ return;
11
+ }
12
+ const [srcR, srcG, srcB, srcA] = channelOffsets(from);
13
+ const [dstR, dstG, dstB, dstA] = channelOffsets(to);
14
+ for (let i = 0; i < length; i += 4) {
15
+ const r = source[i + srcR];
16
+ const g = source[i + srcG];
17
+ const b = source[i + srcB];
18
+ const a = source[i + srcA];
19
+ out[i + dstR] = r;
20
+ out[i + dstG] = g;
21
+ out[i + dstB] = b;
22
+ out[i + dstA] = a;
23
+ }
24
+ }
25
+ /**
26
+ * Converts straight-alpha pixels to premultiplied alpha in place or into
27
+ * a separate buffer. RGB channels are multiplied by alpha/255.
28
+ * Safe to pass the same buffer as both `out` and `source`.
29
+ *
30
+ * Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
31
+ * Image, set its `alphaType` to `premultiplied` to keep it truthful.
32
+ */
33
+ export function premultiplyBitmapPixels(out, source, length) {
34
+ for (let i = 0; i < length; i += 4) {
35
+ const a = source[i + 3] / 255;
36
+ out[i] = Math.round(source[i] * a);
37
+ out[i + 1] = Math.round(source[i + 1] * a);
38
+ out[i + 2] = Math.round(source[i + 2] * a);
39
+ out[i + 3] = source[i + 3];
40
+ }
41
+ }
42
+ /**
43
+ * Converts premultiplied-alpha pixels back to straight alpha in place or
44
+ * into a separate buffer. Pixels with alpha=0 are written as (0,0,0,0).
45
+ * Safe to pass the same buffer as both `out` and `source`.
46
+ *
47
+ * Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
48
+ * Image, set its `alphaType` to `straight` to keep it truthful.
49
+ */
50
+ export function unpremultiplyBitmapPixels(out, source, length) {
51
+ for (let i = 0; i < length; i += 4) {
52
+ const a = source[i + 3];
53
+ if (a === 0) {
54
+ out[i] = 0;
55
+ out[i + 1] = 0;
56
+ out[i + 2] = 0;
57
+ out[i + 3] = 0;
58
+ }
59
+ else {
60
+ const inv = 255 / a;
61
+ out[i] = Math.min(255, Math.round(source[i] * inv));
62
+ out[i + 1] = Math.min(255, Math.round(source[i + 1] * inv));
63
+ out[i + 2] = Math.min(255, Math.round(source[i + 2] * inv));
64
+ out[i + 3] = a;
65
+ }
66
+ }
67
+ }
68
+ function channelOffsets(order) {
69
+ switch (order) {
70
+ case 'RGBA':
71
+ return [0, 1, 2, 3];
72
+ case 'BGRA':
73
+ return [2, 1, 0, 3];
74
+ case 'ARGB':
75
+ return [1, 2, 3, 0];
76
+ case 'ABGR':
77
+ return [3, 2, 1, 0];
78
+ }
79
+ }
80
+ //# sourceMappingURL=bitmapFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFormat.js","sourceRoot":"","sources":["../src/bitmapFormat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Image, Bitmap } from '@flighthq/types/contract';
2
+ /**
3
+ * Reads a host-backed Image into a newly allocated, CPU-readable Bitmap. The readback draws
4
+ * through a detached canvas; callers that need both representations should retain both objects.
5
+ */
6
+ export declare function captureBitmapFromImageResource(resource: Readonly<Image>): Bitmap;
7
+ export declare function createBitmapFromCanvas(canvas: HTMLCanvasElement, x?: number, y?: number, width?: number, height?: number): Bitmap;
8
+ /**
9
+ * Reads a bitmap out of any `CanvasImageSource` by drawing it into a scratch 2D canvas. Unlike
10
+ * createBitmapFromCanvas — which calls getContext('2d') and so only works on a 2D-rendered canvas —
11
+ * this captures a Gl or Wgpu canvas too, giving one readback path for every render backend.
12
+ * `width`/`height` are the device-pixel dimensions to capture (pass the render state's canvas size).
13
+ * For a Gl/Wgpu source, draw before the browser composites the frame away (in tests, enable the
14
+ * context's preserveDrawingBuffer, or read immediately after rendering).
15
+ *
16
+ * Returns `null` when the pixels cannot be read rather than letting a platform exception escape. A
17
+ * cross-origin source taints the scratch canvas and the platform refuses to return its pixels — that
18
+ * is an expected outcome of loading someone else's image, not a programmer error, so it takes the
19
+ * sentinel the diagnostics conventions reserve for expected failure. Call `explainBitmapReadback`
20
+ * with the same arguments for the reason; it re-derives it without allocating a bitmap.
21
+ */
22
+ export declare function createBitmapFromImageSource(source: CanvasImageSource, width: number, height: number): Bitmap | null;
23
+ //# sourceMappingURL=bitmapFrom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapFrom.d.ts","sourceRoot":"","sources":["../src/bitmapFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAG9D;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAiBhF;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU,EACb,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAeR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BnH"}