@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,18 @@
1
+ import type { Bitmap, BitmapMismatch } from '@flighthq/types/contract';
2
+ /**
3
+ * Compares two bitmaps pixel by pixel. Returns `null` if they are identical,
4
+ * or a new Bitmap showing per-channel absolute differences (with alpha set to
5
+ * 255 wherever any channel differs). Throws if the bitmaps have different
6
+ * dimensions — comparing incompatible bitmaps is a programmer error.
7
+ */
8
+ export declare function compareBitmap(source: Readonly<Bitmap>, other: Readonly<Bitmap>): Bitmap | null;
9
+ /**
10
+ * Compares two equally sized bitmaps with a per-channel tolerance and returns summary metrics rather
11
+ * than a diff image. A pixel is "mismatched" when its largest RGBA channel difference exceeds
12
+ * `channelTolerance` (0..255). Use a small tolerance plus a `fraction` threshold to assert that two
13
+ * backends rendered the same scene (cross-backend differential) or that a render still matches a prior
14
+ * one, while ignoring antialiasing noise. Throws if the bitmaps differ in size — comparing
15
+ * incompatible bitmaps is a programmer error (mirrors compareBitmap).
16
+ */
17
+ export declare function getBitmapMismatch(source: Readonly<Bitmap>, other: Readonly<Bitmap>, channelTolerance?: number): BitmapMismatch;
18
+ //# sourceMappingURL=bitmapCompare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapCompare.d.ts","sourceRoot":"","sources":["../src/bitmapCompare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAIvE;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAyB9F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,gBAAgB,GAAE,MAAU,GAC3B,cAAc,CA6BhB"}
@@ -0,0 +1,64 @@
1
+ import { createBitmap } from './bitmap';
2
+ /**
3
+ * Compares two bitmaps pixel by pixel. Returns `null` if they are identical,
4
+ * or a new Bitmap showing per-channel absolute differences (with alpha set to
5
+ * 255 wherever any channel differs). Throws if the bitmaps have different
6
+ * dimensions — comparing incompatible bitmaps is a programmer error.
7
+ */
8
+ export function compareBitmap(source, other) {
9
+ if (source.width !== other.width || source.height !== other.height) {
10
+ throw new Error(`compareBitmap: bitmap dimensions do not match (${source.width}×${source.height} vs ${other.width}×${other.height})`);
11
+ }
12
+ const result = createBitmap(source.width, source.height);
13
+ let hasDiff = false;
14
+ for (let i = 0; i < source.data.length; i += 4) {
15
+ const dr = Math.abs(source.data[i] - other.data[i]);
16
+ const dg = Math.abs(source.data[i + 1] - other.data[i + 1]);
17
+ const db = Math.abs(source.data[i + 2] - other.data[i + 2]);
18
+ const da = Math.abs(source.data[i + 3] - other.data[i + 3]);
19
+ if (dr !== 0 || dg !== 0 || db !== 0 || da !== 0) {
20
+ result.data[i] = dr;
21
+ result.data[i + 1] = dg;
22
+ result.data[i + 2] = db;
23
+ result.data[i + 3] = 255;
24
+ hasDiff = true;
25
+ }
26
+ }
27
+ return hasDiff ? result : null;
28
+ }
29
+ /**
30
+ * Compares two equally sized bitmaps with a per-channel tolerance and returns summary metrics rather
31
+ * than a diff image. A pixel is "mismatched" when its largest RGBA channel difference exceeds
32
+ * `channelTolerance` (0..255). Use a small tolerance plus a `fraction` threshold to assert that two
33
+ * backends rendered the same scene (cross-backend differential) or that a render still matches a prior
34
+ * one, while ignoring antialiasing noise. Throws if the bitmaps differ in size — comparing
35
+ * incompatible bitmaps is a programmer error (mirrors compareBitmap).
36
+ */
37
+ export function getBitmapMismatch(source, other, channelTolerance = 0) {
38
+ if (source.width !== other.width || source.height !== other.height) {
39
+ throw new Error(`getBitmapMismatch: bitmap dimensions do not match (${source.width}×${source.height} vs ${other.width}×${other.height})`);
40
+ }
41
+ const a = source.data;
42
+ const b = other.data;
43
+ const totalPixels = source.width * source.height;
44
+ let mismatchedPixels = 0;
45
+ let maxChannelDelta = 0;
46
+ for (let i = 0; i < a.length; i += 4) {
47
+ const dr = Math.abs(a[i] - b[i]);
48
+ const dg = Math.abs(a[i + 1] - b[i + 1]);
49
+ const db = Math.abs(a[i + 2] - b[i + 2]);
50
+ const da = Math.abs(a[i + 3] - b[i + 3]);
51
+ const pixelDelta = Math.max(dr, dg, db, da);
52
+ if (pixelDelta > maxChannelDelta)
53
+ maxChannelDelta = pixelDelta;
54
+ if (pixelDelta > channelTolerance)
55
+ mismatchedPixels++;
56
+ }
57
+ return {
58
+ mismatchedPixels,
59
+ totalPixels,
60
+ fraction: totalPixels === 0 ? 0 : mismatchedPixels / totalPixels,
61
+ maxChannelDelta,
62
+ };
63
+ }
64
+ //# sourceMappingURL=bitmapCompare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapCompare.js","sourceRoot":"","sources":["../src/bitmapCompare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ import { BitmapCompositeMode } from '@flighthq/types/contract';
3
+ /**
4
+ * Alpha-composites `pixels` over `dest`. `pixels` must be at least
5
+ * `dest.width * dest.height * 4` bytes in row-major RGBA order.
6
+ *
7
+ * `mode` is a BitmapCompositeMode — bitmap's single vocabulary spanning both the color-blend functions
8
+ * (Normal (default), Multiply, Screen, Add, Subtract, Darken, Lighten, Difference, Exclusion, Overlay,
9
+ * HardLight, SoftLight, ColorDodge, ColorBurn, Invert) and the Porter-Duff coverage operators (SourceOver,
10
+ * DestinationOut = erase, DestinationIn = alpha mask, Copy, Clear, Xor, and the atop/in/out set). A
11
+ * color-blend mode composites source-over; a coverage operator applies its factors with a Normal blend. An
12
+ * unknown mode composites source-over.
13
+ */
14
+ export declare function compositeBitmapPixels(dest: Readonly<BitmapRegion>, pixels: Readonly<Uint8ClampedArray>, mode?: BitmapCompositeMode): void;
15
+ /**
16
+ * Alpha-composites `source` over `dest`. See `compositeBitmapPixels` for the
17
+ * `mode` semantics.
18
+ */
19
+ export declare function compositeBitmapRegion(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, mode?: BitmapCompositeMode): void;
20
+ /**
21
+ * Copies `source` into `out` in row-major, tightly-packed RGBA order
22
+ * (stride = source.width). `out` must be at least
23
+ * `source.width * source.height * 4` bytes.
24
+ *
25
+ * Safe to pass `source.bitmap.data` as `out` when the region covers the
26
+ * full bitmap (x=0, y=0, width=source.bitmap.width,
27
+ * height=source.bitmap.height).
28
+ */
29
+ export declare function extractBitmapPixels(out: Uint8ClampedArray, source: Readonly<BitmapRegion>): void;
30
+ /**
31
+ * Copies `source` into `out` as one packed `0xRRGGBBAA` color per pixel
32
+ * (`0xRRGGBBAA` packed colors, the same packing `getBitmapPixel` returns), in row-major order with
33
+ * stride = source.width. `out` must hold at least
34
+ * `source.width * source.height` entries.
35
+ *
36
+ * This is the bulk, color-per-element counterpart to the byte-per-channel
37
+ * `extractBitmapPixels`: use it when you want to read or compare whole
38
+ * regions of colors without reassembling channel bytes.
39
+ */
40
+ export declare function extractBitmapPixels32(out: Uint32Array, source: Readonly<BitmapRegion>): void;
41
+ /**
42
+ * Writes `pixels` into `dest`, overwriting existing content.
43
+ * `pixels` must be at least `dest.width * dest.height * 4` bytes in
44
+ * row-major RGBA order.
45
+ */
46
+ export declare function writeBitmapPixels(dest: Readonly<BitmapRegion>, pixels: Readonly<Uint8ClampedArray>): void;
47
+ /**
48
+ * Writes `pixels` into `dest`, overwriting existing content. Each entry is a
49
+ * packed `0xRRGGBBAA` color (the form `setBitmapPixel` takes), read in
50
+ * row-major order. `pixels` must hold at least `dest.width * dest.height`
51
+ * entries. This is the color-per-element counterpart to `writeBitmapPixels`.
52
+ */
53
+ export declare function writeBitmapPixels32(dest: Readonly<BitmapRegion>, pixels: Readonly<Uint32Array>): void;
54
+ //# sourceMappingURL=bitmapComposite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapComposite.d.ts","sourceRoot":"","sources":["../src/bitmapComposite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,IAAI,GAAE,mBAAgD,GACrD,IAAI,CAoBN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,IAAI,GAAE,mBAAgD,GACrD,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAehG;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAgB5F;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAgBzG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAgBrG"}
@@ -0,0 +1,262 @@
1
+ import { BitmapCompositeMode } from '@flighthq/types/contract';
2
+ import { invalidateBitmap } from './bitmap';
3
+ /**
4
+ * Alpha-composites `pixels` over `dest`. `pixels` must be at least
5
+ * `dest.width * dest.height * 4` bytes in row-major RGBA order.
6
+ *
7
+ * `mode` is a BitmapCompositeMode — bitmap's single vocabulary spanning both the color-blend functions
8
+ * (Normal (default), Multiply, Screen, Add, Subtract, Darken, Lighten, Difference, Exclusion, Overlay,
9
+ * HardLight, SoftLight, ColorDodge, ColorBurn, Invert) and the Porter-Duff coverage operators (SourceOver,
10
+ * DestinationOut = erase, DestinationIn = alpha mask, Copy, Clear, Xor, and the atop/in/out set). A
11
+ * color-blend mode composites source-over; a coverage operator applies its factors with a Normal blend. An
12
+ * unknown mode composites source-over.
13
+ */
14
+ export function compositeBitmapPixels(dest, pixels, mode = BitmapCompositeMode.Normal) {
15
+ for (let py = 0; py < dest.height; py++) {
16
+ const y = dest.y + py;
17
+ if (y < 0 || y >= dest.bitmap.height)
18
+ continue;
19
+ for (let px = 0; px < dest.width; px++) {
20
+ const x = dest.x + px;
21
+ if (x < 0 || x >= dest.bitmap.width)
22
+ continue;
23
+ const si = (py * dest.width + px) * 4;
24
+ compositePixelInto(dest.bitmap.data, (y * dest.bitmap.width + x) * 4, pixels[si], pixels[si + 1], pixels[si + 2], pixels[si + 3], mode);
25
+ }
26
+ }
27
+ invalidateBitmap(dest.bitmap);
28
+ }
29
+ /**
30
+ * Alpha-composites `source` over `dest`. See `compositeBitmapPixels` for the
31
+ * `mode` semantics.
32
+ */
33
+ export function compositeBitmapRegion(dest, source, mode = BitmapCompositeMode.Normal) {
34
+ const sw = Math.min(dest.width, source.width);
35
+ const sh = Math.min(dest.height, source.height);
36
+ for (let py = 0; py < sh; py++) {
37
+ const sourceY = source.y + py;
38
+ const y = dest.y + py;
39
+ if (sourceY < 0 || sourceY >= source.bitmap.height || y < 0 || y >= dest.bitmap.height)
40
+ continue;
41
+ for (let px = 0; px < sw; px++) {
42
+ const sourceX = source.x + px;
43
+ const x = dest.x + px;
44
+ if (sourceX < 0 || sourceX >= source.bitmap.width || x < 0 || x >= dest.bitmap.width)
45
+ continue;
46
+ const si = (sourceY * source.bitmap.width + sourceX) * 4;
47
+ compositePixelInto(dest.bitmap.data, (y * dest.bitmap.width + x) * 4, source.bitmap.data[si], source.bitmap.data[si + 1], source.bitmap.data[si + 2], source.bitmap.data[si + 3], mode);
48
+ }
49
+ }
50
+ invalidateBitmap(dest.bitmap);
51
+ }
52
+ /**
53
+ * Copies `source` into `out` in row-major, tightly-packed RGBA order
54
+ * (stride = source.width). `out` must be at least
55
+ * `source.width * source.height * 4` bytes.
56
+ *
57
+ * Safe to pass `source.bitmap.data` as `out` when the region covers the
58
+ * full bitmap (x=0, y=0, width=source.bitmap.width,
59
+ * height=source.bitmap.height).
60
+ */
61
+ export function extractBitmapPixels(out, source) {
62
+ for (let py = 0; py < source.height; py++) {
63
+ const sourceY = source.y + py;
64
+ if (sourceY < 0 || sourceY >= source.bitmap.height)
65
+ continue;
66
+ for (let px = 0; px < source.width; px++) {
67
+ const sourceX = source.x + px;
68
+ if (sourceX < 0 || sourceX >= source.bitmap.width)
69
+ continue;
70
+ const si = (sourceY * source.bitmap.width + sourceX) * 4;
71
+ const di = (py * source.width + px) * 4;
72
+ out[di] = source.bitmap.data[si];
73
+ out[di + 1] = source.bitmap.data[si + 1];
74
+ out[di + 2] = source.bitmap.data[si + 2];
75
+ out[di + 3] = source.bitmap.data[si + 3];
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Copies `source` into `out` as one packed `0xRRGGBBAA` color per pixel
81
+ * (`0xRRGGBBAA` packed colors, the same packing `getBitmapPixel` returns), in row-major order with
82
+ * stride = source.width. `out` must hold at least
83
+ * `source.width * source.height` entries.
84
+ *
85
+ * This is the bulk, color-per-element counterpart to the byte-per-channel
86
+ * `extractBitmapPixels`: use it when you want to read or compare whole
87
+ * regions of colors without reassembling channel bytes.
88
+ */
89
+ export function extractBitmapPixels32(out, source) {
90
+ for (let py = 0; py < source.height; py++) {
91
+ const sourceY = source.y + py;
92
+ if (sourceY < 0 || sourceY >= source.bitmap.height)
93
+ continue;
94
+ for (let px = 0; px < source.width; px++) {
95
+ const sourceX = source.x + px;
96
+ if (sourceX < 0 || sourceX >= source.bitmap.width)
97
+ continue;
98
+ const si = (sourceY * source.bitmap.width + sourceX) * 4;
99
+ out[py * source.width + px] =
100
+ ((source.bitmap.data[si] << 24) |
101
+ (source.bitmap.data[si + 1] << 16) |
102
+ (source.bitmap.data[si + 2] << 8) |
103
+ source.bitmap.data[si + 3]) >>>
104
+ 0;
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * Writes `pixels` into `dest`, overwriting existing content.
110
+ * `pixels` must be at least `dest.width * dest.height * 4` bytes in
111
+ * row-major RGBA order.
112
+ */
113
+ export function writeBitmapPixels(dest, pixels) {
114
+ for (let py = 0; py < dest.height; py++) {
115
+ const y = dest.y + py;
116
+ if (y < 0 || y >= dest.bitmap.height)
117
+ continue;
118
+ for (let px = 0; px < dest.width; px++) {
119
+ const x = dest.x + px;
120
+ if (x < 0 || x >= dest.bitmap.width)
121
+ continue;
122
+ const si = (py * dest.width + px) * 4;
123
+ const di = (y * dest.bitmap.width + x) * 4;
124
+ dest.bitmap.data[di] = pixels[si];
125
+ dest.bitmap.data[di + 1] = pixels[si + 1];
126
+ dest.bitmap.data[di + 2] = pixels[si + 2];
127
+ dest.bitmap.data[di + 3] = pixels[si + 3];
128
+ }
129
+ }
130
+ invalidateBitmap(dest.bitmap);
131
+ }
132
+ /**
133
+ * Writes `pixels` into `dest`, overwriting existing content. Each entry is a
134
+ * packed `0xRRGGBBAA` color (the form `setBitmapPixel` takes), read in
135
+ * row-major order. `pixels` must hold at least `dest.width * dest.height`
136
+ * entries. This is the color-per-element counterpart to `writeBitmapPixels`.
137
+ */
138
+ export function writeBitmapPixels32(dest, pixels) {
139
+ for (let py = 0; py < dest.height; py++) {
140
+ const y = dest.y + py;
141
+ if (y < 0 || y >= dest.bitmap.height)
142
+ continue;
143
+ for (let px = 0; px < dest.width; px++) {
144
+ const x = dest.x + px;
145
+ if (x < 0 || x >= dest.bitmap.width)
146
+ continue;
147
+ const color = pixels[py * dest.width + px];
148
+ const di = (y * dest.bitmap.width + x) * 4;
149
+ dest.bitmap.data[di] = (color >>> 24) & 0xff;
150
+ dest.bitmap.data[di + 1] = (color >> 16) & 0xff;
151
+ dest.bitmap.data[di + 2] = (color >> 8) & 0xff;
152
+ dest.bitmap.data[di + 3] = color & 0xff;
153
+ }
154
+ }
155
+ invalidateBitmap(dest.bitmap);
156
+ }
157
+ // Premultiplied-free Porter-Duff coverage factors [Fa, Fb] for a BitmapCompositeMode, applied to the
158
+ // source and backdrop contributions respectively (out = Fa·αs·Cs' + Fb·αb·Cb over αo = Fa·αs + Fb·αb). The
159
+ // color-blend modes and any unknown mode composite source-over ([1, 1−αs]); the coverage operators pick
160
+ // their own factor pair. bitmap owns this Porter-Duff kernel (it does not depend on @flighthq/effects) so
161
+ // it stays self-contained for the WASM port.
162
+ function porterDuffFactors(mode, srcA, dstA) {
163
+ switch (mode) {
164
+ case BitmapCompositeMode.DestinationOver:
165
+ return [1 - dstA, 1];
166
+ case BitmapCompositeMode.SourceIn:
167
+ return [dstA, 0];
168
+ case BitmapCompositeMode.DestinationIn:
169
+ return [0, srcA];
170
+ case BitmapCompositeMode.SourceOut:
171
+ return [1 - dstA, 0];
172
+ case BitmapCompositeMode.DestinationOut:
173
+ return [0, 1 - srcA];
174
+ case BitmapCompositeMode.SourceAtop:
175
+ return [dstA, 1 - srcA];
176
+ case BitmapCompositeMode.DestinationAtop:
177
+ return [1 - dstA, srcA];
178
+ case BitmapCompositeMode.Xor:
179
+ return [1 - dstA, 1 - srcA];
180
+ case BitmapCompositeMode.Copy:
181
+ return [1, 0];
182
+ case BitmapCompositeMode.Clear:
183
+ return [0, 0];
184
+ default:
185
+ return [1, 1 - srcA];
186
+ }
187
+ }
188
+ // Separable per-channel color blend on 0..255 values. The coverage operators, Normal, and any unlisted
189
+ // mode return the source channel unchanged, so the composite reduces to the operator's Porter-Duff combine
190
+ // with no color mixing.
191
+ function blendChannel(mode, cb, cs) {
192
+ switch (mode) {
193
+ case BitmapCompositeMode.Multiply:
194
+ return (cb * cs) / 255;
195
+ case BitmapCompositeMode.Screen:
196
+ return cb + cs - (cb * cs) / 255;
197
+ case BitmapCompositeMode.Add:
198
+ return Math.min(255, cb + cs);
199
+ case BitmapCompositeMode.Subtract:
200
+ return Math.max(0, cb - cs);
201
+ case BitmapCompositeMode.Darken:
202
+ return Math.min(cb, cs);
203
+ case BitmapCompositeMode.Lighten:
204
+ return Math.max(cb, cs);
205
+ case BitmapCompositeMode.Difference:
206
+ return Math.abs(cb - cs);
207
+ case BitmapCompositeMode.Exclusion:
208
+ return cb + cs - (2 * cb * cs) / 255;
209
+ case BitmapCompositeMode.Overlay:
210
+ return cb < 128 ? (2 * cb * cs) / 255 : 255 - (2 * (255 - cb) * (255 - cs)) / 255;
211
+ case BitmapCompositeMode.HardLight:
212
+ return cs < 128 ? (2 * cb * cs) / 255 : 255 - (2 * (255 - cb) * (255 - cs)) / 255;
213
+ case BitmapCompositeMode.SoftLight:
214
+ return softLightChannel(cb, cs);
215
+ case BitmapCompositeMode.ColorDodge:
216
+ return cs >= 255 ? 255 : Math.min(255, (cb * 255) / (255 - cs));
217
+ case BitmapCompositeMode.ColorBurn:
218
+ return cs <= 0 ? 0 : 255 - Math.min(255, ((255 - cb) * 255) / cs);
219
+ case BitmapCompositeMode.Invert:
220
+ return 255 - cb;
221
+ default:
222
+ return cs;
223
+ }
224
+ }
225
+ // W3C soft-light per channel on 0..255 (the Photoshop/CSS pegtop-free formula). `cb` = backdrop,
226
+ // `cs` = source; both 0..255. The two-branch D(cb) form used by the spec, evaluated in normalized
227
+ // 0..1 space then scaled back.
228
+ function softLightChannel(cb, cs) {
229
+ const b = cb / 255;
230
+ const s = cs / 255;
231
+ const d = b <= 0.25 ? ((16 * b - 12) * b + 4) * b : Math.sqrt(b);
232
+ const out = s <= 0.5 ? b - (1 - 2 * s) * b * (1 - b) : b + (2 * s - 1) * (d - b);
233
+ return out * 255;
234
+ }
235
+ function compositePixelInto(dest, di, r, g, b, a, mode) {
236
+ const srcA = a / 255;
237
+ const dstA = dest[di + 3] / 255;
238
+ // W3C compositing: αo = Fa·αs + Fb·αb, Co = (Fa·αs·Cs' + Fb·αb·Cb) / αo, where Cs' is the blended source
239
+ // color and (Fa, Fb) are the mode's Porter-Duff factors. Source-over + a blend function covers the color
240
+ // modes; the coverage operators (Erase = DestinationOut, Alpha = DestinationIn, …) fall out of the same
241
+ // formula with a Normal blend. Read backdrop channels before writing any of them.
242
+ const [fa, fb] = porterDuffFactors(mode, srcA, dstA);
243
+ const outA = fa * srcA + fb * dstA;
244
+ if (outA <= 0) {
245
+ dest[di] = 0;
246
+ dest[di + 1] = 0;
247
+ dest[di + 2] = 0;
248
+ dest[di + 3] = 0;
249
+ return;
250
+ }
251
+ const cbR = dest[di];
252
+ const cbG = dest[di + 1];
253
+ const cbB = dest[di + 2];
254
+ const csR = (1 - dstA) * r + dstA * blendChannel(mode, cbR, r);
255
+ const csG = (1 - dstA) * g + dstA * blendChannel(mode, cbG, g);
256
+ const csB = (1 - dstA) * b + dstA * blendChannel(mode, cbB, b);
257
+ dest[di] = Math.round((fa * srcA * csR + fb * dstA * cbR) / outA);
258
+ dest[di + 1] = Math.round((fa * srcA * csG + fb * dstA * cbG) / outA);
259
+ dest[di + 2] = Math.round((fa * srcA * csB + fb * dstA * cbB) / outA);
260
+ dest[di + 3] = Math.round(outA * 255);
261
+ }
262
+ //# sourceMappingURL=bitmapComposite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapComposite.js","sourceRoot":"","sources":["../src/bitmapComposite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { BitmapConvolutionOptions, BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Applies a convolution kernel to `source` and writes into `out`.
4
+ * `out` must be at least `source.width * source.height * 4` bytes.
5
+ *
6
+ * `out` must not alias `source.bitmap.data` — convolution reads neighboring
7
+ * pixels during kernel evaluation; overlapping source and destination produces
8
+ * undefined results.
9
+ *
10
+ * Edge modes:
11
+ * - `'clamp'` (default): repeat the nearest edge pixel
12
+ * - `'transparent'`: treat out-of-bounds samples as transparent black
13
+ * - `'wrap'`: tile the bitmap toroidally
14
+ * - `'mirror'`: reflect the image at boundaries
15
+ */
16
+ export declare function convolveBitmap(out: Uint8ClampedArray, source: Readonly<BitmapRegion>, options: Readonly<BitmapConvolutionOptions>): void;
17
+ //# sourceMappingURL=bitmapConvolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapConvolution.d.ts","sourceRoot":"","sources":["../src/bitmapConvolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEvF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,GAC1C,IAAI,CAqEN"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Applies a convolution kernel to `source` and writes into `out`.
3
+ * `out` must be at least `source.width * source.height * 4` bytes.
4
+ *
5
+ * `out` must not alias `source.bitmap.data` — convolution reads neighboring
6
+ * pixels during kernel evaluation; overlapping source and destination produces
7
+ * undefined results.
8
+ *
9
+ * Edge modes:
10
+ * - `'clamp'` (default): repeat the nearest edge pixel
11
+ * - `'transparent'`: treat out-of-bounds samples as transparent black
12
+ * - `'wrap'`: tile the bitmap toroidally
13
+ * - `'mirror'`: reflect the image at boundaries
14
+ */
15
+ export function convolveBitmap(out, source, options) {
16
+ const { matrix, matrixX, matrixY } = options;
17
+ if (matrixX <= 0 || matrixY <= 0)
18
+ throw new Error('Convolution filter matrix dimensions must be positive');
19
+ if (matrix.length < matrixX * matrixY)
20
+ throw new Error('Convolution filter matrix does not match its dimensions');
21
+ const rawDivisor = options.divisor ?? getConvolutionDivisor(matrix, matrixX * matrixY);
22
+ const divisor = rawDivisor === 0 ? 1 : rawDivisor;
23
+ const bias = options.bias ?? 0;
24
+ const edge = options.edge ?? 'clamp';
25
+ const preserveAlpha = options.preserveAlpha ?? true;
26
+ const offsetX = Math.floor(matrixX / 2);
27
+ const offsetY = Math.floor(matrixY / 2);
28
+ const bitmapWidth = source.bitmap.width;
29
+ const bitmapHeight = source.bitmap.height;
30
+ const data = source.bitmap.data;
31
+ for (let py = 0; py < source.height; py++) {
32
+ for (let px = 0; px < source.width; px++) {
33
+ let r = 0;
34
+ let g = 0;
35
+ let b = 0;
36
+ let a = 0;
37
+ for (let ky = 0; ky < matrixY; ky++) {
38
+ const rawSampleY = source.y + py + ky - offsetY;
39
+ const weight_row_start = ky * matrixX;
40
+ for (let kx = 0; kx < matrixX; kx++) {
41
+ const rawSampleX = source.x + px + kx - offsetX;
42
+ const weight = matrix[weight_row_start + kx];
43
+ let sampleX;
44
+ let sampleY;
45
+ if (rawSampleY < 0 || rawSampleY >= bitmapHeight || rawSampleX < 0 || rawSampleX >= bitmapWidth) {
46
+ if (edge === 'transparent') {
47
+ continue;
48
+ }
49
+ else if (edge === 'wrap') {
50
+ sampleX = ((rawSampleX % bitmapWidth) + bitmapWidth) % bitmapWidth;
51
+ sampleY = ((rawSampleY % bitmapHeight) + bitmapHeight) % bitmapHeight;
52
+ }
53
+ else if (edge === 'mirror') {
54
+ sampleX = resolveConvolutionMirror(rawSampleX, bitmapWidth);
55
+ sampleY = resolveConvolutionMirror(rawSampleY, bitmapHeight);
56
+ }
57
+ else {
58
+ sampleX = rawSampleX < 0 ? 0 : rawSampleX >= bitmapWidth ? bitmapWidth - 1 : rawSampleX;
59
+ sampleY = rawSampleY < 0 ? 0 : rawSampleY >= bitmapHeight ? bitmapHeight - 1 : rawSampleY;
60
+ }
61
+ }
62
+ else {
63
+ sampleX = rawSampleX;
64
+ sampleY = rawSampleY;
65
+ }
66
+ const i = (sampleY * bitmapWidth + sampleX) * 4;
67
+ r += data[i] * weight;
68
+ g += data[i + 1] * weight;
69
+ b += data[i + 2] * weight;
70
+ a += data[i + 3] * weight;
71
+ }
72
+ }
73
+ const di = (py * source.width + px) * 4;
74
+ out[di] = clampByte(r / divisor + bias);
75
+ out[di + 1] = clampByte(g / divisor + bias);
76
+ out[di + 2] = clampByte(b / divisor + bias);
77
+ if (preserveAlpha) {
78
+ const cy = Math.max(0, Math.min(bitmapHeight - 1, source.y + py));
79
+ const cx = Math.max(0, Math.min(bitmapWidth - 1, source.x + px));
80
+ out[di + 3] = data[(cy * bitmapWidth + cx) * 4 + 3];
81
+ }
82
+ else {
83
+ out[di + 3] = clampByte(a / divisor + bias);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ function clampByte(value) {
89
+ return Math.max(0, Math.min(255, Math.round(value)));
90
+ }
91
+ function getConvolutionDivisor(matrix, length) {
92
+ let sum = 0;
93
+ for (let i = 0; i < length; i++) {
94
+ sum += matrix[i];
95
+ }
96
+ return sum === 0 ? 1 : sum;
97
+ }
98
+ function resolveConvolutionMirror(v, size) {
99
+ const period = 2 * size;
100
+ const wrapped = ((v % period) + period) % period;
101
+ return wrapped < size ? wrapped : period - 1 - wrapped;
102
+ }
103
+ //# sourceMappingURL=bitmapConvolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapConvolution.js","sourceRoot":"","sources":["../src/bitmapConvolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ import type { ImageChannel } from './bitmapImageChannel';
3
+ /**
4
+ * Copies one channel of `source` into a channel of `dest`. The copied size is
5
+ * the overlap of the two regions; pixels outside either bitmap are skipped.
6
+ *
7
+ * Safe to pass the same bitmap in `dest` and `source` as long as `destChannel`
8
+ * and `sourceChannel` differ (each pixel writes a different byte than it reads).
9
+ * Copying a channel to itself is always a no-op regardless of aliasing.
10
+ */
11
+ export declare function copyBitmapChannel(dest: Readonly<BitmapRegion>, destChannel: ImageChannel, source: Readonly<BitmapRegion>, sourceChannel: ImageChannel): void;
12
+ /**
13
+ * Copies `source` into `dest`. The copied size is the overlap of the two
14
+ * regions; pixels outside either bitmap are skipped. When `composite` is
15
+ * true, `source` is alpha-composited (Porter-Duff source-over) over `dest`
16
+ * instead of overwriting it.
17
+ *
18
+ * Safe to pass the same bitmap in `dest` and `source` when the regions do not
19
+ * overlap. Overlapping regions produce undefined results because pixels are
20
+ * written before all source reads are complete.
21
+ */
22
+ export declare function copyBitmapPixels(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, composite?: boolean): void;
23
+ //# sourceMappingURL=bitmapCopy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapCopy.d.ts","sourceRoot":"","sources":["../src/bitmapCopy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,WAAW,EAAE,YAAY,EACzB,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,aAAa,EAAE,YAAY,GAC1B,IAAI,CAiBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,SAAS,GAAE,OAAe,GACzB,IAAI,CAkCN"}