@flighthq/surface 0.1.0

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 (210) hide show
  1. package/dist/index.d.ts +43 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +42 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/surface.d.ts +16 -0
  6. package/dist/surface.d.ts.map +1 -0
  7. package/dist/surface.js +84 -0
  8. package/dist/surface.js.map +1 -0
  9. package/dist/surfaceAffine.d.ts +27 -0
  10. package/dist/surfaceAffine.d.ts.map +1 -0
  11. package/dist/surfaceAffine.js +159 -0
  12. package/dist/surfaceAffine.js.map +1 -0
  13. package/dist/surfaceAlpha.d.ts +27 -0
  14. package/dist/surfaceAlpha.d.ts.map +1 -0
  15. package/dist/surfaceAlpha.js +83 -0
  16. package/dist/surfaceAlpha.js.map +1 -0
  17. package/dist/surfaceBevel.d.ts +42 -0
  18. package/dist/surfaceBevel.d.ts.map +1 -0
  19. package/dist/surfaceBevel.js +102 -0
  20. package/dist/surfaceBevel.js.map +1 -0
  21. package/dist/surfaceBlur.d.ts +62 -0
  22. package/dist/surfaceBlur.d.ts.map +1 -0
  23. package/dist/surfaceBlur.js +263 -0
  24. package/dist/surfaceBlur.js.map +1 -0
  25. package/dist/surfaceChannel.d.ts +24 -0
  26. package/dist/surfaceChannel.d.ts.map +1 -0
  27. package/dist/surfaceChannel.js +126 -0
  28. package/dist/surfaceChannel.js.map +1 -0
  29. package/dist/surfaceColorMatrix.d.ts +57 -0
  30. package/dist/surfaceColorMatrix.d.ts.map +1 -0
  31. package/dist/surfaceColorMatrix.js +127 -0
  32. package/dist/surfaceColorMatrix.js.map +1 -0
  33. package/dist/surfaceCompare.d.ts +18 -0
  34. package/dist/surfaceCompare.d.ts.map +1 -0
  35. package/dist/surfaceCompare.js +64 -0
  36. package/dist/surfaceCompare.js.map +1 -0
  37. package/dist/surfaceComposite.d.ts +53 -0
  38. package/dist/surfaceComposite.d.ts.map +1 -0
  39. package/dist/surfaceComposite.js +230 -0
  40. package/dist/surfaceComposite.js.map +1 -0
  41. package/dist/surfaceConvolution.d.ts +27 -0
  42. package/dist/surfaceConvolution.d.ts.map +1 -0
  43. package/dist/surfaceConvolution.js +103 -0
  44. package/dist/surfaceConvolution.js.map +1 -0
  45. package/dist/surfaceCopy.d.ts +23 -0
  46. package/dist/surfaceCopy.d.ts.map +1 -0
  47. package/dist/surfaceCopy.js +78 -0
  48. package/dist/surfaceCopy.js.map +1 -0
  49. package/dist/surfaceCoverage.d.ts +11 -0
  50. package/dist/surfaceCoverage.d.ts.map +1 -0
  51. package/dist/surfaceCoverage.js +29 -0
  52. package/dist/surfaceCoverage.js.map +1 -0
  53. package/dist/surfaceCrop.d.ts +33 -0
  54. package/dist/surfaceCrop.d.ts.map +1 -0
  55. package/dist/surfaceCrop.js +174 -0
  56. package/dist/surfaceCrop.js.map +1 -0
  57. package/dist/surfaceDisplacement.d.ts +48 -0
  58. package/dist/surfaceDisplacement.d.ts.map +1 -0
  59. package/dist/surfaceDisplacement.js +131 -0
  60. package/dist/surfaceDisplacement.js.map +1 -0
  61. package/dist/surfaceDissolve.d.ts +21 -0
  62. package/dist/surfaceDissolve.d.ts.map +1 -0
  63. package/dist/surfaceDissolve.js +97 -0
  64. package/dist/surfaceDissolve.js.map +1 -0
  65. package/dist/surfaceDraw.d.ts +8 -0
  66. package/dist/surfaceDraw.d.ts.map +1 -0
  67. package/dist/surfaceDraw.js +14 -0
  68. package/dist/surfaceDraw.js.map +1 -0
  69. package/dist/surfaceEncode.d.ts +3 -0
  70. package/dist/surfaceEncode.d.ts.map +1 -0
  71. package/dist/surfaceEncode.js +18 -0
  72. package/dist/surfaceEncode.js.map +1 -0
  73. package/dist/surfaceFill.d.ts +12 -0
  74. package/dist/surfaceFill.d.ts.map +1 -0
  75. package/dist/surfaceFill.js +85 -0
  76. package/dist/surfaceFill.js.map +1 -0
  77. package/dist/surfaceFingerprint.d.ts +26 -0
  78. package/dist/surfaceFingerprint.d.ts.map +1 -0
  79. package/dist/surfaceFingerprint.js +99 -0
  80. package/dist/surfaceFingerprint.js.map +1 -0
  81. package/dist/surfaceFlip.d.ts +16 -0
  82. package/dist/surfaceFlip.d.ts.map +1 -0
  83. package/dist/surfaceFlip.js +98 -0
  84. package/dist/surfaceFlip.js.map +1 -0
  85. package/dist/surfaceFormat.d.ts +26 -0
  86. package/dist/surfaceFormat.d.ts.map +1 -0
  87. package/dist/surfaceFormat.js +80 -0
  88. package/dist/surfaceFormat.js.map +1 -0
  89. package/dist/surfaceFrom.d.ts +14 -0
  90. package/dist/surfaceFrom.d.ts.map +1 -0
  91. package/dist/surfaceFrom.js +87 -0
  92. package/dist/surfaceFrom.js.map +1 -0
  93. package/dist/surfaceGradient.d.ts +57 -0
  94. package/dist/surfaceGradient.d.ts.map +1 -0
  95. package/dist/surfaceGradient.js +176 -0
  96. package/dist/surfaceGradient.js.map +1 -0
  97. package/dist/surfaceGradientFill.d.ts +32 -0
  98. package/dist/surfaceGradientFill.d.ts.map +1 -0
  99. package/dist/surfaceGradientFill.js +120 -0
  100. package/dist/surfaceGradientFill.js.map +1 -0
  101. package/dist/surfaceHistogram.d.ts +20 -0
  102. package/dist/surfaceHistogram.d.ts.map +1 -0
  103. package/dist/surfaceHistogram.js +61 -0
  104. package/dist/surfaceHistogram.js.map +1 -0
  105. package/dist/surfaceImageChannel.d.ts +2 -0
  106. package/dist/surfaceImageChannel.d.ts.map +1 -0
  107. package/dist/surfaceImageChannel.js +2 -0
  108. package/dist/surfaceImageChannel.js.map +1 -0
  109. package/dist/surfaceMedian.d.ts +14 -0
  110. package/dist/surfaceMedian.d.ts.map +1 -0
  111. package/dist/surfaceMedian.js +77 -0
  112. package/dist/surfaceMedian.js.map +1 -0
  113. package/dist/surfaceMorphological.d.ts +29 -0
  114. package/dist/surfaceMorphological.d.ts.map +1 -0
  115. package/dist/surfaceMorphological.js +81 -0
  116. package/dist/surfaceMorphological.js.map +1 -0
  117. package/dist/surfaceNoise.d.ts +48 -0
  118. package/dist/surfaceNoise.d.ts.map +1 -0
  119. package/dist/surfaceNoise.js +245 -0
  120. package/dist/surfaceNoise.js.map +1 -0
  121. package/dist/surfacePaletteMap.d.ts +17 -0
  122. package/dist/surfacePaletteMap.d.ts.map +1 -0
  123. package/dist/surfacePaletteMap.js +45 -0
  124. package/dist/surfacePaletteMap.js.map +1 -0
  125. package/dist/surfacePixel.d.ts +9 -0
  126. package/dist/surfacePixel.d.ts.map +1 -0
  127. package/dist/surfacePixel.js +36 -0
  128. package/dist/surfacePixel.js.map +1 -0
  129. package/dist/surfacePixelate.d.ts +13 -0
  130. package/dist/surfacePixelate.d.ts.map +1 -0
  131. package/dist/surfacePixelate.js +61 -0
  132. package/dist/surfacePixelate.js.map +1 -0
  133. package/dist/surfaceQuery.d.ts +13 -0
  134. package/dist/surfaceQuery.d.ts.map +1 -0
  135. package/dist/surfaceQuery.js +46 -0
  136. package/dist/surfaceQuery.js.map +1 -0
  137. package/dist/surfaceRegion.d.ts +20 -0
  138. package/dist/surfaceRegion.d.ts.map +1 -0
  139. package/dist/surfaceRegion.js +28 -0
  140. package/dist/surfaceRegion.js.map +1 -0
  141. package/dist/surfaceResize.d.ts +27 -0
  142. package/dist/surfaceResize.d.ts.map +1 -0
  143. package/dist/surfaceResize.js +191 -0
  144. package/dist/surfaceResize.js.map +1 -0
  145. package/dist/surfaceRotate.d.ts +32 -0
  146. package/dist/surfaceRotate.d.ts.map +1 -0
  147. package/dist/surfaceRotate.js +143 -0
  148. package/dist/surfaceRotate.js.map +1 -0
  149. package/dist/surfaceShadow.d.ts +107 -0
  150. package/dist/surfaceShadow.d.ts.map +1 -0
  151. package/dist/surfaceShadow.js +173 -0
  152. package/dist/surfaceShadow.js.map +1 -0
  153. package/dist/surfaceSharpen.d.ts +25 -0
  154. package/dist/surfaceSharpen.d.ts.map +1 -0
  155. package/dist/surfaceSharpen.js +47 -0
  156. package/dist/surfaceSharpen.js.map +1 -0
  157. package/dist/surfaceTone.d.ts +28 -0
  158. package/dist/surfaceTone.d.ts.map +1 -0
  159. package/dist/surfaceTone.js +69 -0
  160. package/dist/surfaceTone.js.map +1 -0
  161. package/dist/surfaceTransform.d.ts +40 -0
  162. package/dist/surfaceTransform.d.ts.map +1 -0
  163. package/dist/surfaceTransform.js +163 -0
  164. package/dist/surfaceTransform.js.map +1 -0
  165. package/dist/surfaceWarp.d.ts +48 -0
  166. package/dist/surfaceWarp.d.ts.map +1 -0
  167. package/dist/surfaceWarp.js +284 -0
  168. package/dist/surfaceWarp.js.map +1 -0
  169. package/package.json +39 -0
  170. package/src/surface.test.ts +78 -0
  171. package/src/surfaceAffine.test.ts +98 -0
  172. package/src/surfaceAlpha.test.ts +113 -0
  173. package/src/surfaceBevel.test.ts +67 -0
  174. package/src/surfaceBlur.test.ts +240 -0
  175. package/src/surfaceChannel.test.ts +97 -0
  176. package/src/surfaceColorMatrix.test.ts +220 -0
  177. package/src/surfaceCompare.test.ts +92 -0
  178. package/src/surfaceComposite.test.ts +256 -0
  179. package/src/surfaceConvolution.test.ts +136 -0
  180. package/src/surfaceCopy.test.ts +54 -0
  181. package/src/surfaceCoverage.test.ts +39 -0
  182. package/src/surfaceCrop.test.ts +116 -0
  183. package/src/surfaceDisplacement.test.ts +142 -0
  184. package/src/surfaceDissolve.test.ts +99 -0
  185. package/src/surfaceDraw.test.ts +38 -0
  186. package/src/surfaceEncode.test.ts +18 -0
  187. package/src/surfaceFill.test.ts +89 -0
  188. package/src/surfaceFingerprint.test.ts +103 -0
  189. package/src/surfaceFlip.test.ts +59 -0
  190. package/src/surfaceFormat.test.ts +124 -0
  191. package/src/surfaceFrom.test.ts +62 -0
  192. package/src/surfaceGradient.test.ts +91 -0
  193. package/src/surfaceGradientFill.test.ts +107 -0
  194. package/src/surfaceHistogram.test.ts +70 -0
  195. package/src/surfaceImageChannel.test.ts +19 -0
  196. package/src/surfaceMedian.test.ts +45 -0
  197. package/src/surfaceMorphological.test.ts +75 -0
  198. package/src/surfaceNoise.test.ts +169 -0
  199. package/src/surfacePaletteMap.test.ts +55 -0
  200. package/src/surfacePixel.test.ts +99 -0
  201. package/src/surfacePixelate.test.ts +46 -0
  202. package/src/surfaceQuery.test.ts +48 -0
  203. package/src/surfaceRegion.test.ts +34 -0
  204. package/src/surfaceResize.test.ts +112 -0
  205. package/src/surfaceRotate.test.ts +119 -0
  206. package/src/surfaceShadow.test.ts +165 -0
  207. package/src/surfaceSharpen.test.ts +50 -0
  208. package/src/surfaceTone.test.ts +104 -0
  209. package/src/surfaceTransform.test.ts +134 -0
  210. package/src/surfaceWarp.test.ts +124 -0
@@ -0,0 +1,98 @@
1
+ import { invalidateImageResource } from '@flighthq/image';
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 surface 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 flipSurfaceHorizontal(dest, source) {
9
+ const w = Math.min(dest.width, source.width);
10
+ const h = Math.min(dest.height, source.height);
11
+ const data = dest.surface.data;
12
+ const stride = dest.surface.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.surface.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
+ invalidateImageResource(dest.surface);
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 surface 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 flipSurfaceVertical(dest, source) {
39
+ const w = Math.min(dest.width, source.width);
40
+ const h = Math.min(dest.height, source.height);
41
+ const data = dest.surface.data;
42
+ const stride = dest.surface.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.surface.height || yBottom < 0 || yBottom >= dest.surface.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
+ invalidateImageResource(dest.surface);
61
+ }
62
+ // Copies source -> dest with optional per-axis mirroring. Used for the
63
+ // non-aliased flip path (distinct surfaces or non-overlapping regions).
64
+ function copyMirrored(dest, source, w, h, mirrorX, mirrorY) {
65
+ const sd = source.surface.data;
66
+ const dd = dest.surface.data;
67
+ const sStride = source.surface.width;
68
+ const dStride = dest.surface.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.surface.height || dy < 0 || dy >= dest.surface.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.surface === b.surface && 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=surfaceFlip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceFlip.js","sourceRoot":"","sources":["../src/surfaceFlip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PixelOrder } from '@flighthq/types';
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 convertSurfacePixelOrder(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 Surface — if the buffer belongs to an
14
+ * ImageResource, set its `alphaType` to `premultiplied` to keep it truthful.
15
+ */
16
+ export declare function premultiplySurfacePixels(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 Surface — if the buffer belongs to an
23
+ * ImageResource, set its `alphaType` to `straight` to keep it truthful.
24
+ */
25
+ export declare function unpremultiplySurfacePixels(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number): void;
26
+ //# sourceMappingURL=surfaceFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceFormat.d.ts","sourceRoot":"","sources":["../src/surfaceFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,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,wBAAwB,CACtC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,IAAI,CAQN;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,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 convertSurfacePixelOrder(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 Surface — if the buffer belongs to an
31
+ * ImageResource, set its `alphaType` to `premultiplied` to keep it truthful.
32
+ */
33
+ export function premultiplySurfacePixels(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 Surface — if the buffer belongs to an
48
+ * ImageResource, set its `alphaType` to `straight` to keep it truthful.
49
+ */
50
+ export function unpremultiplySurfacePixels(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=surfaceFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceFormat.js","sourceRoot":"","sources":["../src/surfaceFormat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ImageResource, Surface } from '@flighthq/types';
2
+ export declare function createImageResourceFromSurface(surface: Readonly<Surface>): ImageResource;
3
+ export declare function createSurfaceFromCanvas(canvas: HTMLCanvasElement, x?: number, y?: number, width?: number, height?: number): Surface;
4
+ export declare function createSurfaceFromImageResource(resource: Readonly<ImageResource>): Surface;
5
+ /**
6
+ * Reads a surface out of any `CanvasImageSource` by drawing it into a scratch 2D canvas. Unlike
7
+ * createSurfaceFromCanvas — which calls getContext('2d') and so only works on a 2D-rendered canvas —
8
+ * this captures a Gl or Wgpu canvas too, giving one readback path for every render backend.
9
+ * `width`/`height` are the device-pixel dimensions to capture (pass the render state's canvas size).
10
+ * For a Gl/Wgpu source, draw before the browser composites the frame away (in tests, enable the
11
+ * context's preserveDrawingBuffer, or read immediately after rendering).
12
+ */
13
+ export declare function createSurfaceFromImageSource(source: CanvasImageSource, width: number, height: number): Surface;
14
+ //# sourceMappingURL=surfaceFrom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceFrom.d.ts","sourceRoot":"","sources":["../src/surfaceFrom.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE9D,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,aAAa,CAQxF;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EACzB,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU,EACb,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAeT;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO,CAiCzF;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAiB9G"}
@@ -0,0 +1,87 @@
1
+ import { createEntity } from '@flighthq/entity';
2
+ import { createImageResourceFromCanvas } from '@flighthq/image';
3
+ export function createImageResourceFromSurface(surface) {
4
+ const canvas = document.createElement('canvas');
5
+ canvas.width = surface.width;
6
+ canvas.height = surface.height;
7
+ const domImageData = new globalThis.ImageData(surface.width, surface.height);
8
+ domImageData.data.set(surface.data);
9
+ canvas.getContext('2d').putImageData(domImageData, 0, 0);
10
+ return createImageResourceFromCanvas(canvas);
11
+ }
12
+ export function createSurfaceFromCanvas(canvas, x = 0, y = 0, width, height) {
13
+ const w = width ?? canvas.width;
14
+ const h = height ?? canvas.height;
15
+ const ctx = canvas.getContext('2d');
16
+ const raw = ctx.getImageData(x, y, w, h);
17
+ return createEntity({
18
+ alphaType: 'straight',
19
+ colorSpace: raw.colorSpace,
20
+ data: raw.data,
21
+ format: 'rgba8unorm',
22
+ height: raw.height,
23
+ source: null,
24
+ version: 0,
25
+ width: raw.width,
26
+ });
27
+ }
28
+ export function createSurfaceFromImageResource(resource) {
29
+ const canvas = document.createElement('canvas');
30
+ canvas.width = resource.width;
31
+ canvas.height = resource.height;
32
+ if (resource.source === null) {
33
+ // Data-only resource: copy its existing pixels when present, otherwise allocate a transparent buffer.
34
+ return createEntity({
35
+ alphaType: resource.alphaType,
36
+ colorSpace: 'srgb',
37
+ data: resource.data !== null
38
+ ? new Uint8ClampedArray(resource.data)
39
+ : new Uint8ClampedArray(resource.width * resource.height * 4),
40
+ format: resource.format,
41
+ height: resource.height,
42
+ source: null,
43
+ version: 0,
44
+ width: resource.width,
45
+ });
46
+ }
47
+ const ctx = canvas.getContext('2d');
48
+ ctx.drawImage(resource.source, 0, 0);
49
+ const raw = ctx.getImageData(0, 0, resource.width, resource.height);
50
+ return createEntity({
51
+ alphaType: 'straight',
52
+ colorSpace: raw.colorSpace,
53
+ data: raw.data,
54
+ format: 'rgba8unorm',
55
+ height: resource.height,
56
+ source: null,
57
+ version: 0,
58
+ width: resource.width,
59
+ });
60
+ }
61
+ /**
62
+ * Reads a surface out of any `CanvasImageSource` by drawing it into a scratch 2D canvas. Unlike
63
+ * createSurfaceFromCanvas — which calls getContext('2d') and so only works on a 2D-rendered canvas —
64
+ * this captures a Gl or Wgpu canvas too, giving one readback path for every render backend.
65
+ * `width`/`height` are the device-pixel dimensions to capture (pass the render state's canvas size).
66
+ * For a Gl/Wgpu source, draw before the browser composites the frame away (in tests, enable the
67
+ * context's preserveDrawingBuffer, or read immediately after rendering).
68
+ */
69
+ export function createSurfaceFromImageSource(source, width, height) {
70
+ const canvas = document.createElement('canvas');
71
+ canvas.width = width;
72
+ canvas.height = height;
73
+ const ctx = canvas.getContext('2d');
74
+ ctx.drawImage(source, 0, 0);
75
+ const raw = ctx.getImageData(0, 0, width, height);
76
+ return createEntity({
77
+ alphaType: 'straight',
78
+ colorSpace: raw.colorSpace,
79
+ data: raw.data,
80
+ format: 'rgba8unorm',
81
+ height,
82
+ source: null,
83
+ version: 0,
84
+ width,
85
+ });
86
+ }
87
+ //# sourceMappingURL=surfaceFrom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceFrom.js","sourceRoot":"","sources":["../src/surfaceFrom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { SurfaceRegion } from '@flighthq/types';
2
+ import type { SurfaceBevelType } from './surfaceBevel';
3
+ export interface SurfaceGradientBevelOptions {
4
+ /** Light direction in radians, pointing toward the light source. Default π/4. */
5
+ angle?: number;
6
+ /** Sampling offset along the light axis, in pixels. Default 4. */
7
+ distance?: number;
8
+ radiusX?: number;
9
+ radiusY?: number;
10
+ passes?: number;
11
+ /** Overall opacity multiplier. Default 1. */
12
+ intensity?: number;
13
+ /** Where the bevel is drawn relative to the shape. Default 'inner'. */
14
+ type?: SurfaceBevelType;
15
+ }
16
+ export interface SurfaceGradientGlowOptions {
17
+ radiusX?: number;
18
+ radiusY?: number;
19
+ passes?: number;
20
+ /** Overall opacity multiplier. Default 1. */
21
+ intensity?: number;
22
+ }
23
+ /**
24
+ * Fills `out` (256 RGBA entries, 1024 bytes) with a gradient lookup table built
25
+ * from parallel `colors` (packed 0xRRGGBB), `alphas` (0..1), and `ratios`
26
+ * (0..255, ascending) arrays. Indices below the first ratio take the first stop;
27
+ * indices above the last take the last stop; in between, channels are linearly
28
+ * interpolated.
29
+ */
30
+ export declare function buildSurfaceGradientRamp(out: Uint8ClampedArray, colors: ReadonlyArray<number>, alphas: ReadonlyArray<number>, ratios: ReadonlyArray<number>): void;
31
+ /**
32
+ * Produces a gradient bevel mask in `out`. Like `bevelSurface`, but the signed
33
+ * edge gradient (-1..1) indexes the 256-entry `ramp` instead of selecting one of
34
+ * two flat colors: -1 maps to ramp index 0 (shadow side), 0 to 128 (flat,
35
+ * typically transparent), +1 to 255 (highlight side).
36
+ *
37
+ * `ramp` must be 256 RGBA entries (1024 bytes); build it with
38
+ * `buildSurfaceGradientRamp`. `scratch` must be a distinct buffer from `out`,
39
+ * at least `source.width * source.height * 4` bytes; its contents are undefined
40
+ * after the call.
41
+ *
42
+ * `out` must NOT alias `source.surface.data`: `out` is used as the blur scratch,
43
+ * and the source alpha is read again afterward for `inner`/`outer` clipping.
44
+ */
45
+ export declare function gradientBevelSurface(out: Uint8ClampedArray, scratch: Uint8ClampedArray, source: Readonly<SurfaceRegion>, ramp: Readonly<Uint8ClampedArray>, options?: Readonly<SurfaceGradientBevelOptions>): void;
46
+ /**
47
+ * Produces a gradient glow mask in `out`. Like `glowSurface`, but the blurred
48
+ * source alpha (0..255) indexes the 256-entry `ramp` for both color and opacity,
49
+ * so the glow color varies with distance from the shape.
50
+ *
51
+ * `ramp` must be 256 RGBA entries (1024 bytes); build it with
52
+ * `buildSurfaceGradientRamp`. `scratch` must be at least
53
+ * `source.width * source.height * 4` bytes; its contents are undefined after the
54
+ * call. Safe to pass `source.surface.data` as `out` for a full-surface region.
55
+ */
56
+ export declare function gradientGlowSurface(out: Uint8ClampedArray, scratch: Uint8ClampedArray, source: Readonly<SurfaceRegion>, ramp: Readonly<Uint8ClampedArray>, options?: Readonly<SurfaceGradientGlowOptions>): void;
57
+ //# sourceMappingURL=surfaceGradient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceGradient.d.ts","sourceRoot":"","sources":["../src/surfaceGradient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,WAAW,2BAA2B;IAC1C,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,IAAI,CAqCN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACjC,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,IAAI,CAyCN;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACjC,OAAO,GAAE,QAAQ,CAAC,0BAA0B,CAAM,GACjD,IAAI,CA0BN"}
@@ -0,0 +1,176 @@
1
+ import { blurSurfacePixelsHorizontal, blurSurfacePixelsVertical } from './surfaceBlur';
2
+ /**
3
+ * Fills `out` (256 RGBA entries, 1024 bytes) with a gradient lookup table built
4
+ * from parallel `colors` (packed 0xRRGGBB), `alphas` (0..1), and `ratios`
5
+ * (0..255, ascending) arrays. Indices below the first ratio take the first stop;
6
+ * indices above the last take the last stop; in between, channels are linearly
7
+ * interpolated.
8
+ */
9
+ export function buildSurfaceGradientRamp(out, colors, alphas, ratios) {
10
+ const n = ratios.length;
11
+ if (n === 0) {
12
+ out.fill(0);
13
+ return;
14
+ }
15
+ for (let i = 0; i < 256; i++) {
16
+ let r;
17
+ let g;
18
+ let b;
19
+ let a;
20
+ if (i <= ratios[0]) {
21
+ r = (colors[0] >> 16) & 0xff;
22
+ g = (colors[0] >> 8) & 0xff;
23
+ b = colors[0] & 0xff;
24
+ a = alphas[0];
25
+ }
26
+ else if (i >= ratios[n - 1]) {
27
+ r = (colors[n - 1] >> 16) & 0xff;
28
+ g = (colors[n - 1] >> 8) & 0xff;
29
+ b = colors[n - 1] & 0xff;
30
+ a = alphas[n - 1];
31
+ }
32
+ else {
33
+ let j = 0;
34
+ while (j < n - 1 && ratios[j + 1] < i)
35
+ j++;
36
+ const span = ratios[j + 1] - ratios[j];
37
+ const t = span > 0 ? (i - ratios[j]) / span : 0;
38
+ r = lerp((colors[j] >> 16) & 0xff, (colors[j + 1] >> 16) & 0xff, t);
39
+ g = lerp((colors[j] >> 8) & 0xff, (colors[j + 1] >> 8) & 0xff, t);
40
+ b = lerp(colors[j] & 0xff, colors[j + 1] & 0xff, t);
41
+ a = lerp(alphas[j], alphas[j + 1], t);
42
+ }
43
+ const oi = i * 4;
44
+ out[oi] = Math.round(r);
45
+ out[oi + 1] = Math.round(g);
46
+ out[oi + 2] = Math.round(b);
47
+ out[oi + 3] = Math.round(a * 255);
48
+ }
49
+ }
50
+ /**
51
+ * Produces a gradient bevel mask in `out`. Like `bevelSurface`, but the signed
52
+ * edge gradient (-1..1) indexes the 256-entry `ramp` instead of selecting one of
53
+ * two flat colors: -1 maps to ramp index 0 (shadow side), 0 to 128 (flat,
54
+ * typically transparent), +1 to 255 (highlight side).
55
+ *
56
+ * `ramp` must be 256 RGBA entries (1024 bytes); build it with
57
+ * `buildSurfaceGradientRamp`. `scratch` must be a distinct buffer from `out`,
58
+ * at least `source.width * source.height * 4` bytes; its contents are undefined
59
+ * after the call.
60
+ *
61
+ * `out` must NOT alias `source.surface.data`: `out` is used as the blur scratch,
62
+ * and the source alpha is read again afterward for `inner`/`outer` clipping.
63
+ */
64
+ export function gradientBevelSurface(out, scratch, source, ramp, options = {}) {
65
+ const w = source.width;
66
+ const h = source.height;
67
+ const angle = options.angle ?? Math.PI / 4;
68
+ const distance = options.distance ?? 4;
69
+ const offsetX = Math.round(Math.cos(angle) * distance);
70
+ const offsetY = Math.round(Math.sin(angle) * distance);
71
+ const type = options.type ?? 'inner';
72
+ const intensity = options.intensity ?? 1;
73
+ for (let py = 0; py < h; py++) {
74
+ for (let px = 0; px < w; px++) {
75
+ const di = (py * w + px) * 4;
76
+ scratch[di] = 0;
77
+ scratch[di + 1] = 0;
78
+ scratch[di + 2] = 0;
79
+ scratch[di + 3] = readSourceAlpha(source, px, py);
80
+ }
81
+ }
82
+ blurAlphaField(scratch, out, w, h, options.radiusX, options.radiusY, options.passes);
83
+ for (let py = 0; py < h; py++) {
84
+ for (let px = 0; px < w; px++) {
85
+ const di = (py * w + px) * 4;
86
+ const lit = sampleField(scratch, w, h, px - offsetX, py - offsetY);
87
+ const shade = sampleField(scratch, w, h, px + offsetX, py + offsetY);
88
+ const gradient = lit - shade;
89
+ const idx = Math.max(0, Math.min(255, Math.round((gradient * 0.5 + 0.5) * 255)));
90
+ const ri = idx * 4;
91
+ const clip = type === 'inner'
92
+ ? readSourceAlpha(source, px, py) / 255
93
+ : type === 'outer'
94
+ ? 1 - readSourceAlpha(source, px, py) / 255
95
+ : 1;
96
+ out[di] = ramp[ri];
97
+ out[di + 1] = ramp[ri + 1];
98
+ out[di + 2] = ramp[ri + 2];
99
+ out[di + 3] = Math.min(255, Math.round(ramp[ri + 3] * intensity * clip));
100
+ }
101
+ }
102
+ }
103
+ /**
104
+ * Produces a gradient glow mask in `out`. Like `glowSurface`, but the blurred
105
+ * source alpha (0..255) indexes the 256-entry `ramp` for both color and opacity,
106
+ * so the glow color varies with distance from the shape.
107
+ *
108
+ * `ramp` must be 256 RGBA entries (1024 bytes); build it with
109
+ * `buildSurfaceGradientRamp`. `scratch` must be at least
110
+ * `source.width * source.height * 4` bytes; its contents are undefined after the
111
+ * call. Safe to pass `source.surface.data` as `out` for a full-surface region.
112
+ */
113
+ export function gradientGlowSurface(out, scratch, source, ramp, options = {}) {
114
+ const w = source.width;
115
+ const h = source.height;
116
+ const intensity = options.intensity ?? 1;
117
+ for (let py = 0; py < h; py++) {
118
+ for (let px = 0; px < w; px++) {
119
+ const di = (py * w + px) * 4;
120
+ out[di] = 0;
121
+ out[di + 1] = 0;
122
+ out[di + 2] = 0;
123
+ out[di + 3] = readSourceAlpha(source, px, py);
124
+ }
125
+ }
126
+ blurAlphaField(out, scratch, w, h, options.radiusX, options.radiusY, options.passes);
127
+ for (let py = 0; py < h; py++) {
128
+ for (let px = 0; px < w; px++) {
129
+ const di = (py * w + px) * 4;
130
+ const ri = out[di + 3] * 4;
131
+ out[di] = ramp[ri];
132
+ out[di + 1] = ramp[ri + 1];
133
+ out[di + 2] = ramp[ri + 2];
134
+ out[di + 3] = Math.min(255, Math.round(ramp[ri + 3] * intensity));
135
+ }
136
+ }
137
+ }
138
+ function blurAlphaField(field, scratch, w, h, radiusX, radiusY, passes) {
139
+ const rx = Math.max(0, Math.round(radiusX ?? 2));
140
+ const ry = Math.max(0, Math.round(radiusY ?? 2));
141
+ const p = Math.max(1, Math.round(passes ?? 1));
142
+ let a = field;
143
+ let b = scratch;
144
+ for (let pass = 0; pass < p; pass++) {
145
+ if (rx > 0) {
146
+ blurSurfacePixelsHorizontal(b, a, w, h, rx);
147
+ const t = a;
148
+ a = b;
149
+ b = t;
150
+ }
151
+ if (ry > 0) {
152
+ blurSurfacePixelsVertical(b, a, w, h, ry);
153
+ const t = a;
154
+ a = b;
155
+ b = t;
156
+ }
157
+ }
158
+ if (a !== field)
159
+ field.set(a.subarray(0, w * h * 4));
160
+ }
161
+ function lerp(from, to, t) {
162
+ return from + (to - from) * t;
163
+ }
164
+ function readSourceAlpha(source, px, py) {
165
+ const sx = source.x + px;
166
+ const sy = source.y + py;
167
+ if (sx < 0 || sx >= source.surface.width || sy < 0 || sy >= source.surface.height)
168
+ return 0;
169
+ return source.surface.data[(sy * source.surface.width + sx) * 4 + 3];
170
+ }
171
+ function sampleField(field, w, h, x, y) {
172
+ if (x < 0 || x >= w || y < 0 || y >= h)
173
+ return 0;
174
+ return field[(y * w + x) * 4 + 3] / 255;
175
+ }
176
+ //# sourceMappingURL=surfaceGradient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceGradient.js","sourceRoot":"","sources":["../src/surfaceGradient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { GradientSpread, SurfaceRegion } from '@flighthq/types';
2
+ /**
3
+ * Fills the `dest` region with a linear gradient defined by two points `(x0, y0)`
4
+ * and `(x1, y1)` in region-local coordinates. Each pixel's position along the
5
+ * gradient axis maps to a ramp index (0–255), which is looked up in the 256-entry
6
+ * RGBA `ramp` (1024 bytes). Build the ramp with `buildSurfaceGradientRamp`.
7
+ *
8
+ * `spread` controls what happens outside the axis span:
9
+ * - `'pad'` (default): extends the first or last stop color.
10
+ * - `'repeat'`: tiles the gradient.
11
+ * - `'reflect'`: mirrors the gradient alternately.
12
+ *
13
+ * Pixels outside the surface bounds are skipped.
14
+ */
15
+ export declare function fillSurfaceLinearGradient(dest: Readonly<SurfaceRegion>, ramp: Readonly<Uint8ClampedArray>, x0: number, y0: number, x1: number, y1: number, spread?: GradientSpread): void;
16
+ /**
17
+ * Fills the `dest` region with a radial gradient centered at `(cx, cy)` in
18
+ * region-local coordinates with the given `radius`. An optional focal point
19
+ * `(focalX, focalY)` shifts the gradient origin (defaults to the center).
20
+ * Each pixel's normalized distance maps to a ramp index (0–255), looked up in
21
+ * the 256-entry RGBA `ramp` (1024 bytes). Build the ramp with
22
+ * `buildSurfaceGradientRamp`.
23
+ *
24
+ * `spread` controls what happens outside the radius:
25
+ * - `'pad'` (default): extends the last stop color.
26
+ * - `'repeat'`: tiles the gradient.
27
+ * - `'reflect'`: mirrors the gradient alternately.
28
+ *
29
+ * Pixels outside the surface bounds are skipped.
30
+ */
31
+ export declare function fillSurfaceRadialGradient(dest: Readonly<SurfaceRegion>, ramp: Readonly<Uint8ClampedArray>, cx: number, cy: number, radius: number, focalX?: number, focalY?: number, spread?: GradientSpread): void;
32
+ //# sourceMappingURL=surfaceGradientFill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfaceGradientFill.d.ts","sourceRoot":"","sources":["../src/surfaceGradientFill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACjC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,cAAsB,GAC7B,IAAI,CA4BN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACjC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAW,EACnB,MAAM,GAAE,MAAW,EACnB,MAAM,GAAE,cAAsB,GAC7B,IAAI,CAgCN"}