@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,17 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Remaps each color channel of `source` independently through a 256-entry
4
+ * lookup table, writing into `dest`. Each table is indexed by the 0..255 input
5
+ * channel value and supplies the 0..255 output value; a `null` table leaves
6
+ * that channel unchanged. The remapped size is the overlap of the two regions.
7
+ *
8
+ * This is the building block for levels, curves, gamma, posterize, and
9
+ * per-channel inversion. Unlike Flash's 32-bit-summing `paletteMap`, the
10
+ * channels are mapped independently, which is what level/curve adjustments
11
+ * need; build a table once and reuse it across frames.
12
+ *
13
+ * Safe to pass the same bitmap and region in `dest` and `source` — each
14
+ * pixel's channels are read before any channel of that pixel is written.
15
+ */
16
+ export declare function applyBitmapPaletteMap(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, redMap: ReadonlyArray<number> | null, greenMap: ReadonlyArray<number> | null, blueMap: ReadonlyArray<number> | null, alphaMap: ReadonlyArray<number> | null): void;
17
+ //# sourceMappingURL=bitmapPaletteMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPaletteMap.d.ts","sourceRoot":"","sources":["../src/bitmapPaletteMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,EACpC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,EACtC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,GACrC,IAAI,CA0BN"}
@@ -0,0 +1,45 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ /**
3
+ * Remaps each color channel of `source` independently through a 256-entry
4
+ * lookup table, writing into `dest`. Each table is indexed by the 0..255 input
5
+ * channel value and supplies the 0..255 output value; a `null` table leaves
6
+ * that channel unchanged. The remapped size is the overlap of the two regions.
7
+ *
8
+ * This is the building block for levels, curves, gamma, posterize, and
9
+ * per-channel inversion. Unlike Flash's 32-bit-summing `paletteMap`, the
10
+ * channels are mapped independently, which is what level/curve adjustments
11
+ * need; build a table once and reuse it across frames.
12
+ *
13
+ * Safe to pass the same bitmap and region in `dest` and `source` — each
14
+ * pixel's channels are read before any channel of that pixel is written.
15
+ */
16
+ export function applyBitmapPaletteMap(dest, source, redMap, greenMap, blueMap, alphaMap) {
17
+ const w = Math.min(dest.width, source.width);
18
+ const h = Math.min(dest.height, source.height);
19
+ const sd = source.bitmap.data;
20
+ const dd = dest.bitmap.data;
21
+ for (let py = 0; py < h; py++) {
22
+ const sy = source.y + py;
23
+ const dy = dest.y + py;
24
+ if (sy < 0 || sy >= source.bitmap.height || dy < 0 || dy >= dest.bitmap.height)
25
+ continue;
26
+ for (let px = 0; px < w; px++) {
27
+ const sx = source.x + px;
28
+ const dx = dest.x + px;
29
+ if (sx < 0 || sx >= source.bitmap.width || dx < 0 || dx >= dest.bitmap.width)
30
+ continue;
31
+ const si = (sy * source.bitmap.width + sx) * 4;
32
+ const di = (dy * dest.bitmap.width + dx) * 4;
33
+ const r = sd[si];
34
+ const g = sd[si + 1];
35
+ const b = sd[si + 2];
36
+ const a = sd[si + 3];
37
+ dd[di] = redMap ? redMap[r] : r;
38
+ dd[di + 1] = greenMap ? greenMap[g] : g;
39
+ dd[di + 2] = blueMap ? blueMap[b] : b;
40
+ dd[di + 3] = alphaMap ? alphaMap[a] : a;
41
+ }
42
+ }
43
+ invalidateBitmap(dest.bitmap);
44
+ }
45
+ //# sourceMappingURL=bitmapPaletteMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPaletteMap.js","sourceRoot":"","sources":["../src/bitmapPaletteMap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA4B,EAC5B,MAA8B,EAC9B,MAAoC,EACpC,QAAsC,EACtC,OAAqC,EACrC,QAAsC;IAEtC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,SAAS;QACzF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,SAAS;YACvF,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrB,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Bitmap } from '@flighthq/types/contract';
2
+ import type { ImageChannel } from './bitmapImageChannel';
3
+ export declare function getBitmapPixel(source: Readonly<Bitmap>, x: number, y: number): number;
4
+ export declare function getBitmapPixelChannel(source: Readonly<Bitmap>, x: number, y: number, channel: ImageChannel): number;
5
+ export declare function getBitmapPixelLuminance(source: Readonly<Bitmap>, x: number, y: number): number;
6
+ export declare function getBitmapPixelRgb(source: Readonly<Bitmap>, x: number, y: number): number;
7
+ export declare function setBitmapPixel(out: Bitmap, x: number, y: number, color: number): void;
8
+ export declare function setBitmapPixelRgb(out: Bitmap, x: number, y: number, color: number): void;
9
+ //# sourceMappingURL=bitmapPixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPixel.d.ts","sourceRoot":"","sources":["../src/bitmapPixel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOzD,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAEnH;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOrF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMxF"}
@@ -0,0 +1,36 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ // W3C luma coefficients for perceptual luminance (same as CSS saturate/grayscale).
3
+ const LUMA_R = 0.2126;
4
+ const LUMA_G = 0.7152;
5
+ const LUMA_B = 0.0722;
6
+ export function getBitmapPixel(source, x, y) {
7
+ const i = (y * source.width + x) * 4;
8
+ return ((source.data[i] << 24) | (source.data[i + 1] << 16) | (source.data[i + 2] << 8) | source.data[i + 3]) >>> 0;
9
+ }
10
+ export function getBitmapPixelChannel(source, x, y, channel) {
11
+ return source.data[(y * source.width + x) * 4 + channel];
12
+ }
13
+ export function getBitmapPixelLuminance(source, x, y) {
14
+ const i = (y * source.width + x) * 4;
15
+ return Math.round(source.data[i] * LUMA_R + source.data[i + 1] * LUMA_G + source.data[i + 2] * LUMA_B);
16
+ }
17
+ export function getBitmapPixelRgb(source, x, y) {
18
+ const i = (y * source.width + x) * 4;
19
+ return ((source.data[i] << 16) | (source.data[i + 1] << 8) | source.data[i + 2]) >>> 0;
20
+ }
21
+ export function setBitmapPixel(out, x, y, color) {
22
+ const i = (y * out.width + x) * 4;
23
+ out.data[i] = (color >>> 24) & 0xff;
24
+ out.data[i + 1] = (color >> 16) & 0xff;
25
+ out.data[i + 2] = (color >> 8) & 0xff;
26
+ out.data[i + 3] = color & 0xff;
27
+ invalidateBitmap(out);
28
+ }
29
+ export function setBitmapPixelRgb(out, x, y, color) {
30
+ const i = (y * out.width + x) * 4;
31
+ out.data[i] = (color >> 16) & 0xff;
32
+ out.data[i + 1] = (color >> 8) & 0xff;
33
+ out.data[i + 2] = color & 0xff;
34
+ invalidateBitmap(out);
35
+ }
36
+ //# sourceMappingURL=bitmapPixel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPixel.js","sourceRoot":"","sources":["../src/bitmapPixel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Pixelates (mosaics) `source` into `out`: the region is divided into
4
+ * `blockSize × blockSize` cells, each cell is averaged, and every output pixel
5
+ * in the cell takes that average color. `blockSize` is clamped to at least 1
6
+ * (a no-op copy at 1). Edge cells are clipped to the region.
7
+ *
8
+ * `out` must be at least `source.width * source.height * 4` bytes. Safe to pass
9
+ * `source.bitmap.data` as `out` for a full-bitmap region — each cell is fully
10
+ * read before it is written, and cells do not overlap.
11
+ */
12
+ export declare function pixelateBitmap(out: Uint8ClampedArray, source: Readonly<BitmapRegion>, blockSize: number): void;
13
+ //# sourceMappingURL=bitmapPixelate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPixelate.d.ts","sourceRoot":"","sources":["../src/bitmapPixelate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+C9G"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Pixelates (mosaics) `source` into `out`: the region is divided into
3
+ * `blockSize × blockSize` cells, each cell is averaged, and every output pixel
4
+ * in the cell takes that average color. `blockSize` is clamped to at least 1
5
+ * (a no-op copy at 1). Edge cells are clipped to the region.
6
+ *
7
+ * `out` must be at least `source.width * source.height * 4` bytes. Safe to pass
8
+ * `source.bitmap.data` as `out` for a full-bitmap region — each cell is fully
9
+ * read before it is written, and cells do not overlap.
10
+ */
11
+ export function pixelateBitmap(out, source, blockSize) {
12
+ const block = Math.max(1, Math.round(blockSize));
13
+ const w = source.width;
14
+ const h = source.height;
15
+ const bitmapWidth = source.bitmap.width;
16
+ const bitmapHeight = source.bitmap.height;
17
+ const data = source.bitmap.data;
18
+ for (let by = 0; by < h; by += block) {
19
+ const yEnd = Math.min(by + block, h);
20
+ for (let bx = 0; bx < w; bx += block) {
21
+ const xEnd = Math.min(bx + block, w);
22
+ let r = 0;
23
+ let g = 0;
24
+ let b = 0;
25
+ let a = 0;
26
+ let count = 0;
27
+ for (let py = by; py < yEnd; py++) {
28
+ const sy = source.y + py;
29
+ if (sy < 0 || sy >= bitmapHeight)
30
+ continue;
31
+ for (let px = bx; px < xEnd; px++) {
32
+ const sx = source.x + px;
33
+ if (sx < 0 || sx >= bitmapWidth)
34
+ continue;
35
+ const si = (sy * bitmapWidth + sx) * 4;
36
+ r += data[si];
37
+ g += data[si + 1];
38
+ b += data[si + 2];
39
+ a += data[si + 3];
40
+ count++;
41
+ }
42
+ }
43
+ if (count === 0)
44
+ continue;
45
+ const ar = Math.round(r / count);
46
+ const ag = Math.round(g / count);
47
+ const ab = Math.round(b / count);
48
+ const aa = Math.round(a / count);
49
+ for (let py = by; py < yEnd; py++) {
50
+ for (let px = bx; px < xEnd; px++) {
51
+ const di = (py * w + px) * 4;
52
+ out[di] = ar;
53
+ out[di + 1] = ag;
54
+ out[di + 2] = ab;
55
+ out[di + 3] = aa;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=bitmapPixelate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapPixelate.js","sourceRoot":"","sources":["../src/bitmapPixelate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { RectangleLike, BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Scans the `source` region for pixels matching `color` under `mask`
4
+ * (`findColor` true) or not matching it (false), and returns the tightest
5
+ * bounding rectangle of those pixels in bitmap-absolute coordinates, or `null`
6
+ * if none match. Region pixels outside the bitmap are skipped.
7
+ *
8
+ * The comparison is performed on the full packed 0xRRGGBBAA pixel value. To
9
+ * match by a subset of channels, supply a `mask` that isolates the relevant
10
+ * bytes — e.g. 0xffffff00 to ignore alpha.
11
+ */
12
+ export declare function getBitmapColorBoundsRectangle(source: Readonly<BitmapRegion>, mask: number, color: number, findColor?: boolean): RectangleLike | null;
13
+ //# sourceMappingURL=bitmapQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapQuery.d.ts","sourceRoot":"","sources":["../src/bitmapQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,OAAc,GACxB,aAAa,GAAG,IAAI,CA6BtB"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Scans the `source` region for pixels matching `color` under `mask`
3
+ * (`findColor` true) or not matching it (false), and returns the tightest
4
+ * bounding rectangle of those pixels in bitmap-absolute coordinates, or `null`
5
+ * if none match. Region pixels outside the bitmap are skipped.
6
+ *
7
+ * The comparison is performed on the full packed 0xRRGGBBAA pixel value. To
8
+ * match by a subset of channels, supply a `mask` that isolates the relevant
9
+ * bytes — e.g. 0xffffff00 to ignore alpha.
10
+ */
11
+ export function getBitmapColorBoundsRectangle(source, mask, color, findColor = true) {
12
+ const data = source.bitmap.data;
13
+ const bitmapWidth = source.bitmap.width;
14
+ const maskedColor = (color >>> 0) & (mask >>> 0);
15
+ let minX = Infinity;
16
+ let minY = Infinity;
17
+ let maxX = -1;
18
+ let maxY = -1;
19
+ for (let py = 0; py < source.height; py++) {
20
+ const y = source.y + py;
21
+ if (y < 0 || y >= source.bitmap.height)
22
+ continue;
23
+ for (let px = 0; px < source.width; px++) {
24
+ const x = source.x + px;
25
+ if (x < 0 || x >= bitmapWidth)
26
+ continue;
27
+ const i = (y * bitmapWidth + x) * 4;
28
+ const pixel = (((data[i] << 24) | (data[i + 1] << 16) | (data[i + 2] << 8) | data[i + 3]) >>> 0) & (mask >>> 0);
29
+ const matches = pixel === maskedColor;
30
+ if (matches === findColor) {
31
+ if (x < minX)
32
+ minX = x;
33
+ if (x > maxX)
34
+ maxX = x;
35
+ if (y < minY)
36
+ minY = y;
37
+ if (y > maxY)
38
+ maxY = y;
39
+ }
40
+ }
41
+ }
42
+ if (maxX === -1)
43
+ return null;
44
+ return { x: minX, y: minY, width: maxX - minX + 1, height: maxY - minY + 1 };
45
+ }
46
+ //# sourceMappingURL=bitmapQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapQuery.js","sourceRoot":"","sources":["../src/bitmapQuery.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAA8B,EAC9B,IAAY,EACZ,KAAa,EACb,YAAqB,IAAI;IAEzB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IACxC,MAAM,WAAW,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IAEd,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM;YAAE,SAAS;QACjD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,WAAW;gBAAE,SAAS;YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YAChH,MAAM,OAAO,GAAG,KAAK,KAAK,WAAW,CAAC;YACtC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,GAAG,IAAI;oBAAE,IAAI,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Bitmap, BitmapRegion } from '@flighthq/types/contract';
2
+ /**
3
+ * Allocates a `BitmapRegion`. With no bounds it covers the whole bitmap, so
4
+ * `createBitmapRegion(bitmap)` is the fast path for "operate on everything".
5
+ *
6
+ * Region functions read these fields synchronously and never retain the object,
7
+ * so in a hot loop you can allocate one region up front and reuse it with
8
+ * `setBitmapRegion` instead of building a literal per call.
9
+ */
10
+ export declare function createBitmapRegion(bitmap: Bitmap, x?: number, y?: number, width?: number, height?: number): BitmapRegion;
11
+ /**
12
+ * Writes region fields into an existing `out` region without allocating, and
13
+ * returns `out`. With no bounds it covers the whole bitmap. Use this to thread
14
+ * a single reusable region through a hot loop:
15
+ *
16
+ * const r = createBitmapRegion(bitmap);
17
+ * for (…) fillBitmapRectangle(setBitmapRegion(r, bitmap, x, y, w, h), color);
18
+ */
19
+ export declare function setBitmapRegion(out: BitmapRegion, bitmap: Bitmap, x?: number, y?: number, width?: number, height?: number): BitmapRegion;
20
+ //# sourceMappingURL=bitmapRegion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapRegion.d.ts","sourceRoot":"","sources":["../src/bitmapRegion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU,EACb,KAAK,GAAE,MAAqB,EAC5B,MAAM,GAAE,MAAsB,GAC7B,YAAY,CAEd;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,EACd,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU,EACb,KAAK,GAAE,MAAqB,EAC5B,MAAM,GAAE,MAAsB,GAC7B,YAAY,CAOd"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Allocates a `BitmapRegion`. With no bounds it covers the whole bitmap, so
3
+ * `createBitmapRegion(bitmap)` is the fast path for "operate on everything".
4
+ *
5
+ * Region functions read these fields synchronously and never retain the object,
6
+ * so in a hot loop you can allocate one region up front and reuse it with
7
+ * `setBitmapRegion` instead of building a literal per call.
8
+ */
9
+ export function createBitmapRegion(bitmap, x = 0, y = 0, width = bitmap.width, height = bitmap.height) {
10
+ return { bitmap, x, y, width, height };
11
+ }
12
+ /**
13
+ * Writes region fields into an existing `out` region without allocating, and
14
+ * returns `out`. With no bounds it covers the whole bitmap. Use this to thread
15
+ * a single reusable region through a hot loop:
16
+ *
17
+ * const r = createBitmapRegion(bitmap);
18
+ * for (…) fillBitmapRectangle(setBitmapRegion(r, bitmap, x, y, w, h), color);
19
+ */
20
+ export function setBitmapRegion(out, bitmap, x = 0, y = 0, width = bitmap.width, height = bitmap.height) {
21
+ out.bitmap = bitmap;
22
+ out.x = x;
23
+ out.y = y;
24
+ out.width = width;
25
+ out.height = height;
26
+ return out;
27
+ }
28
+ //# sourceMappingURL=bitmapRegion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapRegion.js","sourceRoot":"","sources":["../src/bitmapRegion.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,IAAY,CAAC,EACb,IAAY,CAAC,EACb,QAAgB,MAAM,CAAC,KAAK,EAC5B,SAAiB,MAAM,CAAC,MAAM;IAE9B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAiB,EACjB,MAAc,EACd,IAAY,CAAC,EACb,IAAY,CAAC,EACb,QAAgB,MAAM,CAAC,KAAK,EAC5B,SAAiB,MAAM,CAAC,MAAM;IAE9B,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACV,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IAClB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { BitmapRegion, BitmapResizeMode, BitmapResizeOptions } from '@flighthq/types/contract';
2
+ /**
3
+ * Resamples the `source` region into the `dest` region; `dest`'s dimensions
4
+ * define the target size. Modes:
5
+ * - `'nearest'`: fast, preserves hard edges (pixel art)
6
+ * - `'bilinear'` (default): smooth, interpolates four surrounding pixels
7
+ * - `'bicubic'`: high quality, Catmull-Rom interpolation over 4×4 neighbourhood
8
+ *
9
+ * `edgeMode` controls how boundary interpolation handles out-of-bounds
10
+ * coordinates (default `'clamp'`).
11
+ *
12
+ * Set `premultiplied: true` to avoid dark-halo bleed at transparent edges.
13
+ *
14
+ * `dest` must not alias `source` — output pixels read arbitrary source positions.
15
+ */
16
+ export declare function resizeBitmap(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, options?: BitmapResizeMode | Readonly<BitmapResizeOptions>): void;
17
+ //# sourceMappingURL=bitmapResize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapResize.d.ts","sourceRoot":"","sources":["../src/bitmapResize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,OAAO,GAAE,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,CAAc,GACrE,IAAI,CA8IN"}
@@ -0,0 +1,191 @@
1
+ import { invalidateBitmap } from './bitmap';
2
+ /**
3
+ * Resamples the `source` region into the `dest` region; `dest`'s dimensions
4
+ * define the target size. Modes:
5
+ * - `'nearest'`: fast, preserves hard edges (pixel art)
6
+ * - `'bilinear'` (default): smooth, interpolates four surrounding pixels
7
+ * - `'bicubic'`: high quality, Catmull-Rom interpolation over 4×4 neighbourhood
8
+ *
9
+ * `edgeMode` controls how boundary interpolation handles out-of-bounds
10
+ * coordinates (default `'clamp'`).
11
+ *
12
+ * Set `premultiplied: true` to avoid dark-halo bleed at transparent edges.
13
+ *
14
+ * `dest` must not alias `source` — output pixels read arbitrary source positions.
15
+ */
16
+ export function resizeBitmap(dest, source, options = 'bilinear') {
17
+ const opts = typeof options === 'string' ? { mode: options } : options;
18
+ const mode = opts.mode ?? 'bilinear';
19
+ const edgeMode = opts.edgeMode ?? 'clamp';
20
+ const premultiplied = opts.premultiplied ?? false;
21
+ const sw = source.width;
22
+ const sh = source.height;
23
+ const dw = dest.width;
24
+ const dh = dest.height;
25
+ if (sw === 0 || sh === 0 || dw === 0 || dh === 0)
26
+ return;
27
+ const sd = source.bitmap.data;
28
+ const dd = dest.bitmap.data;
29
+ const sStride = source.bitmap.width;
30
+ const dStride = dest.bitmap.width;
31
+ if (mode === 'nearest') {
32
+ for (let dy = 0; dy < dh; dy++) {
33
+ const oy = dest.y + dy;
34
+ if (oy < 0 || oy >= dest.bitmap.height)
35
+ continue;
36
+ const sy = source.y + Math.min(sh - 1, Math.floor((dy * sh) / dh));
37
+ if (sy < 0 || sy >= source.bitmap.height)
38
+ continue;
39
+ for (let dx = 0; dx < dw; dx++) {
40
+ const ox = dest.x + dx;
41
+ if (ox < 0 || ox >= dStride)
42
+ continue;
43
+ const sx = source.x + Math.min(sw - 1, Math.floor((dx * sw) / dw));
44
+ if (sx < 0 || sx >= sStride)
45
+ continue;
46
+ const si = (sy * sStride + sx) * 4;
47
+ const di = (oy * dStride + ox) * 4;
48
+ dd[di] = sd[si];
49
+ dd[di + 1] = sd[si + 1];
50
+ dd[di + 2] = sd[si + 2];
51
+ dd[di + 3] = sd[si + 3];
52
+ }
53
+ }
54
+ return;
55
+ }
56
+ const scaleX = sw / dw;
57
+ const scaleY = sh / dh;
58
+ if (mode === 'bicubic') {
59
+ for (let dy = 0; dy < dh; dy++) {
60
+ const oy = dest.y + dy;
61
+ if (oy < 0 || oy >= dest.bitmap.height)
62
+ continue;
63
+ const fy = (dy + 0.5) * scaleY - 0.5;
64
+ const y1 = Math.floor(fy);
65
+ const ty = fy - y1;
66
+ for (let dx = 0; dx < dw; dx++) {
67
+ const ox = dest.x + dx;
68
+ if (ox < 0 || ox >= dStride)
69
+ continue;
70
+ const fx = (dx + 0.5) * scaleX - 0.5;
71
+ const x1 = Math.floor(fx);
72
+ const tx = fx - x1;
73
+ const di = (oy * dStride + ox) * 4;
74
+ for (let c = 0; c < 4; c++) {
75
+ let sum = 0;
76
+ for (let m = -1; m <= 2; m++) {
77
+ const wy = catmullRomWeight(ty - m);
78
+ const ry = resolveResizeEdge(y1 + m, sh, edgeMode);
79
+ for (let n = -1; n <= 2; n++) {
80
+ const wx = catmullRomWeight(tx - n);
81
+ const rx = resolveResizeEdge(x1 + n, sw, edgeMode);
82
+ if (rx === null || ry === null)
83
+ continue;
84
+ const sy = source.y + ry;
85
+ const sx = source.x + rx;
86
+ const si = (sy * sStride + sx) * 4;
87
+ const v = premultiplied && c < 3 ? (sd[si + c] * sd[si + 3]) / 255 : sd[si + c];
88
+ sum += v * wy * wx;
89
+ }
90
+ }
91
+ dd[di + c] = Math.max(0, Math.min(255, Math.round(sum)));
92
+ }
93
+ if (premultiplied) {
94
+ const a = dd[di + 3];
95
+ if (a > 0) {
96
+ dd[di] = Math.min(255, Math.round((dd[di] * 255) / a));
97
+ dd[di + 1] = Math.min(255, Math.round((dd[di + 1] * 255) / a));
98
+ dd[di + 2] = Math.min(255, Math.round((dd[di + 2] * 255) / a));
99
+ }
100
+ else {
101
+ dd[di] = 0;
102
+ dd[di + 1] = 0;
103
+ dd[di + 2] = 0;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ return;
109
+ }
110
+ // bilinear
111
+ for (let dy = 0; dy < dh; dy++) {
112
+ const oy = dest.y + dy;
113
+ if (oy < 0 || oy >= dest.bitmap.height)
114
+ continue;
115
+ const fy = (dy + 0.5) * scaleY - 0.5;
116
+ const y0 = Math.floor(fy);
117
+ const ty = fy - y0;
118
+ const ry0 = resolveResizeEdge(y0, sh, edgeMode);
119
+ const ry1 = resolveResizeEdge(y0 + 1, sh, edgeMode);
120
+ for (let dx = 0; dx < dw; dx++) {
121
+ const ox = dest.x + dx;
122
+ if (ox < 0 || ox >= dStride)
123
+ continue;
124
+ const fx = (dx + 0.5) * scaleX - 0.5;
125
+ const x0 = Math.floor(fx);
126
+ const tx = fx - x0;
127
+ const rx0 = resolveResizeEdge(x0, sw, edgeMode);
128
+ const rx1 = resolveResizeEdge(x0 + 1, sw, edgeMode);
129
+ const di = (oy * dStride + ox) * 4;
130
+ const i00 = rx0 !== null && ry0 !== null ? ((source.y + ry0) * sStride + source.x + rx0) * 4 : -1;
131
+ const i10 = rx1 !== null && ry0 !== null ? ((source.y + ry0) * sStride + source.x + rx1) * 4 : -1;
132
+ const i01 = rx0 !== null && ry1 !== null ? ((source.y + ry1) * sStride + source.x + rx0) * 4 : -1;
133
+ const i11 = rx1 !== null && ry1 !== null ? ((source.y + ry1) * sStride + source.x + rx1) * 4 : -1;
134
+ for (let c = 0; c < 4; c++) {
135
+ let v00 = i00 >= 0 ? sd[i00 + c] : 0;
136
+ let v10 = i10 >= 0 ? sd[i10 + c] : 0;
137
+ let v01 = i01 >= 0 ? sd[i01 + c] : 0;
138
+ let v11 = i11 >= 0 ? sd[i11 + c] : 0;
139
+ if (premultiplied && c < 3) {
140
+ v00 = i00 >= 0 ? (v00 * sd[i00 + 3]) / 255 : 0;
141
+ v10 = i10 >= 0 ? (v10 * sd[i10 + 3]) / 255 : 0;
142
+ v01 = i01 >= 0 ? (v01 * sd[i01 + 3]) / 255 : 0;
143
+ v11 = i11 >= 0 ? (v11 * sd[i11 + 3]) / 255 : 0;
144
+ }
145
+ const top = v00 * (1 - tx) + v10 * tx;
146
+ const bottom = v01 * (1 - tx) + v11 * tx;
147
+ dd[di + c] = Math.round(top * (1 - ty) + bottom * ty);
148
+ }
149
+ if (premultiplied) {
150
+ const a = dd[di + 3];
151
+ if (a > 0) {
152
+ dd[di] = Math.min(255, Math.round((dd[di] * 255) / a));
153
+ dd[di + 1] = Math.min(255, Math.round((dd[di + 1] * 255) / a));
154
+ dd[di + 2] = Math.min(255, Math.round((dd[di + 2] * 255) / a));
155
+ }
156
+ else {
157
+ dd[di] = 0;
158
+ dd[di + 1] = 0;
159
+ dd[di + 2] = 0;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ invalidateBitmap(dest.bitmap);
165
+ }
166
+ function catmullRomWeight(t) {
167
+ const a = Math.abs(t);
168
+ if (a >= 2)
169
+ return 0;
170
+ if (a >= 1)
171
+ return -0.5 * a * a * a + 2.5 * a * a - 4 * a + 2;
172
+ return 1.5 * a * a * a - 2.5 * a * a + 1;
173
+ }
174
+ function resolveResizeEdge(v, size, mode) {
175
+ if (v >= 0 && v < size)
176
+ return v;
177
+ switch (mode) {
178
+ case 'clamp':
179
+ return Math.max(0, Math.min(size - 1, v));
180
+ case 'wrap':
181
+ return ((v % size) + size) % size;
182
+ case 'mirror': {
183
+ const period = 2 * size;
184
+ const wrapped = ((v % period) + period) % period;
185
+ return wrapped < size ? wrapped : period - 1 - wrapped;
186
+ }
187
+ default:
188
+ return null;
189
+ }
190
+ }
191
+ //# sourceMappingURL=bitmapResize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapResize.js","sourceRoot":"","sources":["../src/bitmapResize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { BitmapEdgeMode, BitmapRegion, BitmapResizeMode } from '@flighthq/types/contract';
2
+ /**
3
+ * Rotates the `source` region by `angle` radians into the `dest` region, around
4
+ * a pivot point in source coordinates. `pivotX` and `pivotY` default to the
5
+ * source region centre. `edgeMode` controls out-of-bounds source positions
6
+ * (default `'clamp'`). `sampleMode` controls interpolation quality (default
7
+ * `'bilinear'`).
8
+ *
9
+ * `dest` must not alias `source`.
10
+ */
11
+ export declare function rotateBitmap(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, angle: number, pivotX?: number, pivotY?: number, edgeMode?: BitmapEdgeMode, sampleMode?: BitmapResizeMode): void;
12
+ /**
13
+ * Rotates the `source` region 180° into the `dest` region. `dest` and `source`
14
+ * must have the same dimensions. Safe to pass the same bitmap and region in
15
+ * `dest` and `source` for an in-place rotation — when aliased, opposite pixels
16
+ * are swapped in pairs; otherwise the regions must not overlap.
17
+ */
18
+ export declare function rotateBitmap180(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
19
+ /**
20
+ * Rotates the `source` region 90° clockwise into the `dest` region. `dest`'s
21
+ * dimensions must be swapped relative to `source` (`dest.width === source.height`,
22
+ * `dest.height === source.width`). `dest` must not alias `source`.
23
+ */
24
+ export declare function rotateBitmapClockwise(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
25
+ /**
26
+ * Rotates the `source` region 90° counter-clockwise into the `dest` region.
27
+ * `dest`'s dimensions must be swapped relative to `source`
28
+ * (`dest.width === source.height`, `dest.height === source.width`). `dest` must
29
+ * not alias `source`.
30
+ */
31
+ export declare function rotateBitmapCounterClockwise(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
32
+ //# sourceMappingURL=bitmapRotate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmapRotate.d.ts","sourceRoot":"","sources":["../src/bitmapRotate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK/F;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAA+B,EACvC,MAAM,GAAE,MAAgC,EACxC,QAAQ,GAAE,cAAwB,EAClC,UAAU,GAAE,gBAA6B,GACxC,IAAI,CAQN;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAkClG;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAoBxG;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAoB/G"}