@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.
- package/dist/bitmap.d.ts +17 -0
- package/dist/bitmap.d.ts.map +1 -0
- package/dist/bitmap.js +87 -0
- package/dist/bitmap.js.map +1 -0
- package/dist/bitmapAffine.d.ts +27 -0
- package/dist/bitmapAffine.d.ts.map +1 -0
- package/dist/bitmapAffine.js +159 -0
- package/dist/bitmapAffine.js.map +1 -0
- package/dist/bitmapAlpha.d.ts +27 -0
- package/dist/bitmapAlpha.d.ts.map +1 -0
- package/dist/bitmapAlpha.js +83 -0
- package/dist/bitmapAlpha.js.map +1 -0
- package/dist/bitmapBevel.d.ts +24 -0
- package/dist/bitmapBevel.d.ts.map +1 -0
- package/dist/bitmapBevel.js +102 -0
- package/dist/bitmapBevel.js.map +1 -0
- package/dist/bitmapBlur.d.ts +57 -0
- package/dist/bitmapBlur.d.ts.map +1 -0
- package/dist/bitmapBlur.js +263 -0
- package/dist/bitmapBlur.js.map +1 -0
- package/dist/bitmapChannel.d.ts +24 -0
- package/dist/bitmapChannel.d.ts.map +1 -0
- package/dist/bitmapChannel.js +127 -0
- package/dist/bitmapChannel.js.map +1 -0
- package/dist/bitmapColorMatrix.d.ts +57 -0
- package/dist/bitmapColorMatrix.d.ts.map +1 -0
- package/dist/bitmapColorMatrix.js +127 -0
- package/dist/bitmapColorMatrix.js.map +1 -0
- package/dist/bitmapCompare.d.ts +18 -0
- package/dist/bitmapCompare.d.ts.map +1 -0
- package/dist/bitmapCompare.js +64 -0
- package/dist/bitmapCompare.js.map +1 -0
- package/dist/bitmapComposite.d.ts +54 -0
- package/dist/bitmapComposite.d.ts.map +1 -0
- package/dist/bitmapComposite.js +262 -0
- package/dist/bitmapComposite.js.map +1 -0
- package/dist/bitmapConvolution.d.ts +17 -0
- package/dist/bitmapConvolution.d.ts.map +1 -0
- package/dist/bitmapConvolution.js +103 -0
- package/dist/bitmapConvolution.js.map +1 -0
- package/dist/bitmapCopy.d.ts +23 -0
- package/dist/bitmapCopy.d.ts.map +1 -0
- package/dist/bitmapCopy.js +78 -0
- package/dist/bitmapCopy.js.map +1 -0
- package/dist/bitmapCoverage.d.ts +11 -0
- package/dist/bitmapCoverage.d.ts.map +1 -0
- package/dist/bitmapCoverage.js +29 -0
- package/dist/bitmapCoverage.js.map +1 -0
- package/dist/bitmapCrop.d.ts +33 -0
- package/dist/bitmapCrop.d.ts.map +1 -0
- package/dist/bitmapCrop.js +175 -0
- package/dist/bitmapCrop.js.map +1 -0
- package/dist/bitmapDisplacement.d.ts +22 -0
- package/dist/bitmapDisplacement.d.ts.map +1 -0
- package/dist/bitmapDisplacement.js +111 -0
- package/dist/bitmapDisplacement.js.map +1 -0
- package/dist/bitmapDissolve.d.ts +21 -0
- package/dist/bitmapDissolve.d.ts.map +1 -0
- package/dist/bitmapDissolve.js +97 -0
- package/dist/bitmapDissolve.js.map +1 -0
- package/dist/bitmapDraw.d.ts +8 -0
- package/dist/bitmapDraw.d.ts.map +1 -0
- package/dist/bitmapDraw.js +14 -0
- package/dist/bitmapDraw.js.map +1 -0
- package/dist/bitmapEncode.d.ts +3 -0
- package/dist/bitmapEncode.d.ts.map +1 -0
- package/dist/bitmapEncode.js +18 -0
- package/dist/bitmapEncode.js.map +1 -0
- package/dist/bitmapFill.d.ts +12 -0
- package/dist/bitmapFill.d.ts.map +1 -0
- package/dist/bitmapFill.js +85 -0
- package/dist/bitmapFill.js.map +1 -0
- package/dist/bitmapFingerprint.d.ts +26 -0
- package/dist/bitmapFingerprint.d.ts.map +1 -0
- package/dist/bitmapFingerprint.js +99 -0
- package/dist/bitmapFingerprint.js.map +1 -0
- package/dist/bitmapFlip.d.ts +16 -0
- package/dist/bitmapFlip.d.ts.map +1 -0
- package/dist/bitmapFlip.js +98 -0
- package/dist/bitmapFlip.js.map +1 -0
- package/dist/bitmapFormat.d.ts +26 -0
- package/dist/bitmapFormat.d.ts.map +1 -0
- package/dist/bitmapFormat.js +80 -0
- package/dist/bitmapFormat.js.map +1 -0
- package/dist/bitmapFrom.d.ts +23 -0
- package/dist/bitmapFrom.d.ts.map +1 -0
- package/dist/bitmapFrom.js +90 -0
- package/dist/bitmapFrom.js.map +1 -0
- package/dist/bitmapGradient.d.ts +36 -0
- package/dist/bitmapGradient.d.ts.map +1 -0
- package/dist/bitmapGradient.js +176 -0
- package/dist/bitmapGradient.js.map +1 -0
- package/dist/bitmapGradientFill.d.ts +32 -0
- package/dist/bitmapGradientFill.d.ts.map +1 -0
- package/dist/bitmapGradientFill.js +120 -0
- package/dist/bitmapGradientFill.js.map +1 -0
- package/dist/bitmapHistogram.d.ts +20 -0
- package/dist/bitmapHistogram.d.ts.map +1 -0
- package/dist/bitmapHistogram.js +61 -0
- package/dist/bitmapHistogram.js.map +1 -0
- package/dist/bitmapImageChannel.d.ts +2 -0
- package/dist/bitmapImageChannel.d.ts.map +1 -0
- package/dist/bitmapImageChannel.js +2 -0
- package/dist/bitmapImageChannel.js.map +1 -0
- package/dist/bitmapMedian.d.ts +14 -0
- package/dist/bitmapMedian.d.ts.map +1 -0
- package/dist/bitmapMedian.js +77 -0
- package/dist/bitmapMedian.js.map +1 -0
- package/dist/bitmapMorphological.d.ts +29 -0
- package/dist/bitmapMorphological.d.ts.map +1 -0
- package/dist/bitmapMorphological.js +81 -0
- package/dist/bitmapMorphological.js.map +1 -0
- package/dist/bitmapNoise.d.ts +48 -0
- package/dist/bitmapNoise.d.ts.map +1 -0
- package/dist/bitmapNoise.js +245 -0
- package/dist/bitmapNoise.js.map +1 -0
- package/dist/bitmapPaletteMap.d.ts +17 -0
- package/dist/bitmapPaletteMap.d.ts.map +1 -0
- package/dist/bitmapPaletteMap.js +45 -0
- package/dist/bitmapPaletteMap.js.map +1 -0
- package/dist/bitmapPixel.d.ts +9 -0
- package/dist/bitmapPixel.d.ts.map +1 -0
- package/dist/bitmapPixel.js +36 -0
- package/dist/bitmapPixel.js.map +1 -0
- package/dist/bitmapPixelate.d.ts +13 -0
- package/dist/bitmapPixelate.d.ts.map +1 -0
- package/dist/bitmapPixelate.js +61 -0
- package/dist/bitmapPixelate.js.map +1 -0
- package/dist/bitmapQuery.d.ts +13 -0
- package/dist/bitmapQuery.d.ts.map +1 -0
- package/dist/bitmapQuery.js +46 -0
- package/dist/bitmapQuery.js.map +1 -0
- package/dist/bitmapRegion.d.ts +20 -0
- package/dist/bitmapRegion.d.ts.map +1 -0
- package/dist/bitmapRegion.js +28 -0
- package/dist/bitmapRegion.js.map +1 -0
- package/dist/bitmapResize.d.ts +17 -0
- package/dist/bitmapResize.d.ts.map +1 -0
- package/dist/bitmapResize.js +191 -0
- package/dist/bitmapResize.js.map +1 -0
- package/dist/bitmapRotate.d.ts +32 -0
- package/dist/bitmapRotate.d.ts.map +1 -0
- package/dist/bitmapRotate.js +143 -0
- package/dist/bitmapRotate.js.map +1 -0
- package/dist/bitmapShadow.d.ts +72 -0
- package/dist/bitmapShadow.d.ts.map +1 -0
- package/dist/bitmapShadow.js +175 -0
- package/dist/bitmapShadow.js.map +1 -0
- package/dist/bitmapSharpen.d.ts +16 -0
- package/dist/bitmapSharpen.d.ts.map +1 -0
- package/dist/bitmapSharpen.js +47 -0
- package/dist/bitmapSharpen.js.map +1 -0
- package/dist/bitmapTone.d.ts +28 -0
- package/dist/bitmapTone.d.ts.map +1 -0
- package/dist/bitmapTone.js +69 -0
- package/dist/bitmapTone.js.map +1 -0
- package/dist/bitmapTransform.d.ts +40 -0
- package/dist/bitmapTransform.d.ts.map +1 -0
- package/dist/bitmapTransform.js +163 -0
- package/dist/bitmapTransform.js.map +1 -0
- package/dist/bitmapWarp.d.ts +48 -0
- package/dist/bitmapWarp.d.ts.map +1 -0
- package/dist/bitmapWarp.js +284 -0
- package/dist/bitmapWarp.js.map +1 -0
- package/dist/contract.d.ts +43 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +43 -0
- package/dist/contract.js.map +1 -0
- package/dist/explainBitmapReadback.d.ts +3 -0
- package/dist/explainBitmapReadback.d.ts.map +1 -0
- package/dist/explainBitmapReadback.js +39 -0
- package/dist/explainBitmapReadback.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
- package/src/bitmap.test.ts +88 -0
- package/src/bitmapAffine.test.ts +98 -0
- package/src/bitmapAlpha.test.ts +110 -0
- package/src/bitmapBevel.test.ts +61 -0
- package/src/bitmapBlur.test.ts +234 -0
- package/src/bitmapChannel.test.ts +97 -0
- package/src/bitmapColorMatrix.test.ts +214 -0
- package/src/bitmapCompare.test.ts +92 -0
- package/src/bitmapComposite.test.ts +259 -0
- package/src/bitmapConvolution.test.ts +130 -0
- package/src/bitmapCopy.test.ts +48 -0
- package/src/bitmapCoverage.test.ts +39 -0
- package/src/bitmapCrop.test.ts +116 -0
- package/src/bitmapDisplacement.test.ts +181 -0
- package/src/bitmapDissolve.test.ts +99 -0
- package/src/bitmapDraw.test.ts +68 -0
- package/src/bitmapEncode.test.ts +18 -0
- package/src/bitmapFill.test.ts +83 -0
- package/src/bitmapFingerprint.test.ts +103 -0
- package/src/bitmapFlip.test.ts +53 -0
- package/src/bitmapFormat.test.ts +124 -0
- package/src/bitmapFrom.test.ts +86 -0
- package/src/bitmapGradient.test.ts +85 -0
- package/src/bitmapGradientFill.test.ts +107 -0
- package/src/bitmapHistogram.test.ts +64 -0
- package/src/bitmapImageChannel.test.ts +19 -0
- package/src/bitmapMedian.test.ts +39 -0
- package/src/bitmapMorphological.test.ts +69 -0
- package/src/bitmapNoise.test.ts +163 -0
- package/src/bitmapPaletteMap.test.ts +49 -0
- package/src/bitmapPixel.test.ts +117 -0
- package/src/bitmapPixelate.test.ts +40 -0
- package/src/bitmapQuery.test.ts +42 -0
- package/src/bitmapRegion.test.ts +34 -0
- package/src/bitmapResize.test.ts +106 -0
- package/src/bitmapRotate.test.ts +108 -0
- package/src/bitmapShadow.test.ts +159 -0
- package/src/bitmapSharpen.test.ts +44 -0
- package/src/bitmapTone.test.ts +104 -0
- package/src/bitmapTransform.test.ts +128 -0
- package/src/bitmapWarp.test.ts +118 -0
- package/src/explainBitmapReadback.test.ts +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapDissolve.js","sourceRoot":"","sources":["../src/bitmapDissolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BitmapRegion } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Draws the `source` region onto a 2D canvas at `(x, y)` via `putImageData`.
|
|
4
|
+
* A region with a zero dimension is a no-op (`ImageData` requires positive
|
|
5
|
+
* dimensions).
|
|
6
|
+
*/
|
|
7
|
+
export declare function drawBitmap(dest: HTMLCanvasElement, source: Readonly<BitmapRegion>, x: number, y: number): void;
|
|
8
|
+
//# sourceMappingURL=bitmapDraw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapDraw.d.ts","sourceRoot":"","sources":["../src/bitmapDraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAK9G"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { extractBitmapPixels } from './bitmapComposite';
|
|
2
|
+
/**
|
|
3
|
+
* Draws the `source` region onto a 2D canvas at `(x, y)` via `putImageData`.
|
|
4
|
+
* A region with a zero dimension is a no-op (`ImageData` requires positive
|
|
5
|
+
* dimensions).
|
|
6
|
+
*/
|
|
7
|
+
export function drawBitmap(dest, source, x, y) {
|
|
8
|
+
if (source.width <= 0 || source.height <= 0)
|
|
9
|
+
return;
|
|
10
|
+
const domImageData = new globalThis.ImageData(source.width, source.height);
|
|
11
|
+
extractBitmapPixels(domImageData.data, source);
|
|
12
|
+
dest.getContext('2d').putImageData(domImageData, x, y);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=bitmapDraw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapDraw.js","sourceRoot":"","sources":["../src/bitmapDraw.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAuB,EAAE,MAA8B,EAAE,CAAS,EAAE,CAAS;IACtG,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO;IACpD,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3E,mBAAmB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapEncode.d.ts","sourceRoot":"","sources":["../src/bitmapEncode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAE,WAAmB,EAAE,OAAO,GAAE,MAAY,GAAG,UAAU,CAgBrH"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function encodeBitmap(source, format = 'png', quality = 0.9) {
|
|
2
|
+
const canvas = document.createElement('canvas');
|
|
3
|
+
canvas.width = source.width;
|
|
4
|
+
canvas.height = source.height;
|
|
5
|
+
const domImageData = new globalThis.ImageData(source.width, source.height);
|
|
6
|
+
domImageData.data.set(source.data);
|
|
7
|
+
canvas.getContext('2d').putImageData(domImageData, 0, 0);
|
|
8
|
+
const mimeType = format === 'jpeg' ? 'image/jpeg' : 'image/png';
|
|
9
|
+
const dataUrl = canvas.toDataURL(mimeType, quality);
|
|
10
|
+
const base64 = dataUrl.slice(dataUrl.indexOf(',') + 1);
|
|
11
|
+
const binary = atob(base64);
|
|
12
|
+
const bytes = new Uint8Array(binary.length);
|
|
13
|
+
for (let i = 0; i < binary.length; i++) {
|
|
14
|
+
bytes[i] = binary.charCodeAt(i);
|
|
15
|
+
}
|
|
16
|
+
return bytes;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=bitmapEncode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapEncode.js","sourceRoot":"","sources":["../src/bitmapEncode.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAwB,EAAE,SAAsB,KAAK,EAAE,UAAkB,GAAG;IACvG,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3E,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Bitmap, BitmapRegion } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Fills the rectangular `dest` region with a packed RGBA `color`. Pixels of the
|
|
4
|
+
* region that fall outside the bitmap are skipped.
|
|
5
|
+
*/
|
|
6
|
+
export declare function fillBitmapRectangle(dest: Readonly<BitmapRegion>, color: number): void;
|
|
7
|
+
/**
|
|
8
|
+
* Flood-fills a connected region of `out` starting at `(x, y)`. Uses a
|
|
9
|
+
* module-level visited buffer that grows as needed and is reused across calls.
|
|
10
|
+
*/
|
|
11
|
+
export declare function floodFillBitmap(out: Bitmap, x: number, y: number, color: number): void;
|
|
12
|
+
//# sourceMappingURL=bitmapFill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFill.d.ts","sourceRoot":"","sources":["../src/bitmapFill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMrE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAmBrF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAuDtF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { invalidateBitmap } from './bitmap';
|
|
2
|
+
let _floodFillVisited = null;
|
|
3
|
+
/**
|
|
4
|
+
* Fills the rectangular `dest` region with a packed RGBA `color`. Pixels of the
|
|
5
|
+
* region that fall outside the bitmap are skipped.
|
|
6
|
+
*/
|
|
7
|
+
export function fillBitmapRectangle(dest, color) {
|
|
8
|
+
const r = (color >>> 24) & 0xff;
|
|
9
|
+
const g = (color >> 16) & 0xff;
|
|
10
|
+
const b = (color >> 8) & 0xff;
|
|
11
|
+
const a = color & 0xff;
|
|
12
|
+
for (let py = 0; py < dest.height; py++) {
|
|
13
|
+
const y = dest.y + py;
|
|
14
|
+
if (y < 0 || y >= dest.bitmap.height)
|
|
15
|
+
continue;
|
|
16
|
+
for (let px = 0; px < dest.width; px++) {
|
|
17
|
+
const x = dest.x + px;
|
|
18
|
+
if (x < 0 || x >= dest.bitmap.width)
|
|
19
|
+
continue;
|
|
20
|
+
const i = (y * dest.bitmap.width + x) * 4;
|
|
21
|
+
dest.bitmap.data[i] = r;
|
|
22
|
+
dest.bitmap.data[i + 1] = g;
|
|
23
|
+
dest.bitmap.data[i + 2] = b;
|
|
24
|
+
dest.bitmap.data[i + 3] = a;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
invalidateBitmap(dest.bitmap);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Flood-fills a connected region of `out` starting at `(x, y)`. Uses a
|
|
31
|
+
* module-level visited buffer that grows as needed and is reused across calls.
|
|
32
|
+
*/
|
|
33
|
+
export function floodFillBitmap(out, x, y, color) {
|
|
34
|
+
if (x < 0 || x >= out.width || y < 0 || y >= out.height)
|
|
35
|
+
return;
|
|
36
|
+
const fillR = (color >>> 24) & 0xff;
|
|
37
|
+
const fillG = (color >> 16) & 0xff;
|
|
38
|
+
const fillB = (color >> 8) & 0xff;
|
|
39
|
+
const fillA = color & 0xff;
|
|
40
|
+
const targetI = (y * out.width + x) * 4;
|
|
41
|
+
const targetR = out.data[targetI];
|
|
42
|
+
const targetG = out.data[targetI + 1];
|
|
43
|
+
const targetB = out.data[targetI + 2];
|
|
44
|
+
const targetA = out.data[targetI + 3];
|
|
45
|
+
if (targetR === fillR && targetG === fillG && targetB === fillB && targetA === fillA)
|
|
46
|
+
return;
|
|
47
|
+
const needed = out.width * out.height;
|
|
48
|
+
if (_floodFillVisited === null || _floodFillVisited.length < needed) {
|
|
49
|
+
_floodFillVisited = new Uint8Array(needed);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
_floodFillVisited.fill(0, 0, needed);
|
|
53
|
+
}
|
|
54
|
+
const visited = _floodFillVisited;
|
|
55
|
+
const stack = [x + y * out.width];
|
|
56
|
+
while (stack.length > 0) {
|
|
57
|
+
const idx = stack.pop();
|
|
58
|
+
if (visited[idx])
|
|
59
|
+
continue;
|
|
60
|
+
visited[idx] = 1;
|
|
61
|
+
const px = idx % out.width;
|
|
62
|
+
const py = Math.floor(idx / out.width);
|
|
63
|
+
const i = idx * 4;
|
|
64
|
+
if (out.data[i] !== targetR ||
|
|
65
|
+
out.data[i + 1] !== targetG ||
|
|
66
|
+
out.data[i + 2] !== targetB ||
|
|
67
|
+
out.data[i + 3] !== targetA) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
out.data[i] = fillR;
|
|
71
|
+
out.data[i + 1] = fillG;
|
|
72
|
+
out.data[i + 2] = fillB;
|
|
73
|
+
out.data[i + 3] = fillA;
|
|
74
|
+
if (px > 0)
|
|
75
|
+
stack.push(idx - 1);
|
|
76
|
+
if (px < out.width - 1)
|
|
77
|
+
stack.push(idx + 1);
|
|
78
|
+
if (py > 0)
|
|
79
|
+
stack.push(idx - out.width);
|
|
80
|
+
if (py < out.height - 1)
|
|
81
|
+
stack.push(idx + out.width);
|
|
82
|
+
}
|
|
83
|
+
invalidateBitmap(out);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=bitmapFill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFill.js","sourceRoot":"","sources":["../src/bitmapFill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Bitmap, BitmapFingerprint } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* The mean absolute per-channel difference (0..255) between two fingerprints of the same gridSize.
|
|
4
|
+
* Threshold it to gate regressions: ~0 is identical, small single digits are antialiasing/noise,
|
|
5
|
+
* large values mean a real visual change. Throws if the gridSizes differ — they are not comparable.
|
|
6
|
+
*/
|
|
7
|
+
export declare function compareBitmapFingerprints(a: Readonly<BitmapFingerprint>, b: Readonly<BitmapFingerprint>): number;
|
|
8
|
+
/**
|
|
9
|
+
* Reduces a bitmap to a gridSize × gridSize grid of averaged RGB cells. Each cell averages the RGB
|
|
10
|
+
* of the source pixels that fall in it (alpha is ignored — visible colour is what regressions show
|
|
11
|
+
* up in). gridSize controls fidelity vs. text size; the default of 16 catches layout/colour shifts
|
|
12
|
+
* while staying ~1 KB as text. An empty bitmap yields an all-zero grid.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createBitmapFingerprint(source: Readonly<Bitmap>, gridSize?: number): BitmapFingerprint;
|
|
15
|
+
/**
|
|
16
|
+
* Serializes a fingerprint to a compact, git-diffable text line: `<gridSize>:<hex cells>`. This is
|
|
17
|
+
* what gets committed as a regression baseline instead of a screenshot.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatBitmapFingerprint(fingerprint: Readonly<BitmapFingerprint>): string;
|
|
20
|
+
/**
|
|
21
|
+
* Parses the text form produced by formatBitmapFingerprint. Returns `null` for malformed input
|
|
22
|
+
* (wrong shape, odd hex length, or a cell count that is not gridSize × gridSize × 3) so callers can
|
|
23
|
+
* treat a corrupt baseline as "no baseline" rather than crashing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseBitmapFingerprint(text: string): BitmapFingerprint | null;
|
|
26
|
+
//# sourceMappingURL=bitmapFingerprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFingerprint.d.ts","sourceRoot":"","sources":["../src/bitmapFingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAQ1E;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAQhH;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAE,MAAW,GAAG,iBAAiB,CAkC1G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAOxF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiB7E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// A coarse downscaled RGB fingerprint: the bitmap is averaged into a gridSize × gridSize grid, so
|
|
2
|
+
// antialiasing jitter that breaks an exact hash washes out while gross changes still register. The
|
|
3
|
+
// committed regression baseline is the hex-encoded form (formatBitmapFingerprint), not a PNG.
|
|
4
|
+
const HEX = '0123456789abcdef';
|
|
5
|
+
/**
|
|
6
|
+
* The mean absolute per-channel difference (0..255) between two fingerprints of the same gridSize.
|
|
7
|
+
* Threshold it to gate regressions: ~0 is identical, small single digits are antialiasing/noise,
|
|
8
|
+
* large values mean a real visual change. Throws if the gridSizes differ — they are not comparable.
|
|
9
|
+
*/
|
|
10
|
+
export function compareBitmapFingerprints(a, b) {
|
|
11
|
+
if (a.gridSize !== b.gridSize) {
|
|
12
|
+
throw new Error(`compareBitmapFingerprints: gridSize mismatch (${a.gridSize} vs ${b.gridSize})`);
|
|
13
|
+
}
|
|
14
|
+
if (a.cells.length === 0)
|
|
15
|
+
return 0;
|
|
16
|
+
let sum = 0;
|
|
17
|
+
for (let i = 0; i < a.cells.length; i++)
|
|
18
|
+
sum += Math.abs(a.cells[i] - b.cells[i]);
|
|
19
|
+
return sum / a.cells.length;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Reduces a bitmap to a gridSize × gridSize grid of averaged RGB cells. Each cell averages the RGB
|
|
23
|
+
* of the source pixels that fall in it (alpha is ignored — visible colour is what regressions show
|
|
24
|
+
* up in). gridSize controls fidelity vs. text size; the default of 16 catches layout/colour shifts
|
|
25
|
+
* while staying ~1 KB as text. An empty bitmap yields an all-zero grid.
|
|
26
|
+
*/
|
|
27
|
+
export function createBitmapFingerprint(source, gridSize = 16) {
|
|
28
|
+
if (gridSize < 1)
|
|
29
|
+
throw new Error(`createBitmapFingerprint: gridSize must be >= 1 (got ${gridSize})`);
|
|
30
|
+
const cells = new Uint8Array(gridSize * gridSize * 3);
|
|
31
|
+
const { width, height, data } = source;
|
|
32
|
+
if (width === 0 || height === 0)
|
|
33
|
+
return { gridSize, cells };
|
|
34
|
+
for (let cy = 0; cy < gridSize; cy++) {
|
|
35
|
+
const y0 = Math.floor((cy * height) / gridSize);
|
|
36
|
+
const y1 = Math.max(y0 + 1, Math.floor(((cy + 1) * height) / gridSize));
|
|
37
|
+
for (let cx = 0; cx < gridSize; cx++) {
|
|
38
|
+
const x0 = Math.floor((cx * width) / gridSize);
|
|
39
|
+
const x1 = Math.max(x0 + 1, Math.floor(((cx + 1) * width) / gridSize));
|
|
40
|
+
let sumR = 0;
|
|
41
|
+
let sumG = 0;
|
|
42
|
+
let sumB = 0;
|
|
43
|
+
let count = 0;
|
|
44
|
+
for (let y = y0; y < y1 && y < height; y++) {
|
|
45
|
+
let i = (y * width + x0) * 4;
|
|
46
|
+
for (let x = x0; x < x1 && x < width; x++) {
|
|
47
|
+
sumR += data[i];
|
|
48
|
+
sumG += data[i + 1];
|
|
49
|
+
sumB += data[i + 2];
|
|
50
|
+
count++;
|
|
51
|
+
i += 4;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const c = (cy * gridSize + cx) * 3;
|
|
55
|
+
cells[c] = count === 0 ? 0 : Math.round(sumR / count);
|
|
56
|
+
cells[c + 1] = count === 0 ? 0 : Math.round(sumG / count);
|
|
57
|
+
cells[c + 2] = count === 0 ? 0 : Math.round(sumB / count);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { gridSize, cells };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Serializes a fingerprint to a compact, git-diffable text line: `<gridSize>:<hex cells>`. This is
|
|
64
|
+
* what gets committed as a regression baseline instead of a screenshot.
|
|
65
|
+
*/
|
|
66
|
+
export function formatBitmapFingerprint(fingerprint) {
|
|
67
|
+
const cells = fingerprint.cells;
|
|
68
|
+
let hex = '';
|
|
69
|
+
for (let i = 0; i < cells.length; i++) {
|
|
70
|
+
hex += HEX[(cells[i] >> 4) & 0xf] + HEX[cells[i] & 0xf];
|
|
71
|
+
}
|
|
72
|
+
return `${fingerprint.gridSize}:${hex}`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parses the text form produced by formatBitmapFingerprint. Returns `null` for malformed input
|
|
76
|
+
* (wrong shape, odd hex length, or a cell count that is not gridSize × gridSize × 3) so callers can
|
|
77
|
+
* treat a corrupt baseline as "no baseline" rather than crashing.
|
|
78
|
+
*/
|
|
79
|
+
export function parseBitmapFingerprint(text) {
|
|
80
|
+
const colon = text.indexOf(':');
|
|
81
|
+
if (colon <= 0)
|
|
82
|
+
return null;
|
|
83
|
+
const gridSize = Number.parseInt(text.slice(0, colon), 10);
|
|
84
|
+
if (!Number.isInteger(gridSize) || gridSize < 1)
|
|
85
|
+
return null;
|
|
86
|
+
const hex = text.slice(colon + 1);
|
|
87
|
+
if (hex.length !== gridSize * gridSize * 3 * 2)
|
|
88
|
+
return null;
|
|
89
|
+
const cells = new Uint8Array(hex.length / 2);
|
|
90
|
+
for (let i = 0; i < cells.length; i++) {
|
|
91
|
+
const hi = HEX.indexOf(hex[i * 2]);
|
|
92
|
+
const lo = HEX.indexOf(hex[i * 2 + 1]);
|
|
93
|
+
if (hi < 0 || lo < 0)
|
|
94
|
+
return null;
|
|
95
|
+
cells[i] = (hi << 4) | lo;
|
|
96
|
+
}
|
|
97
|
+
return { gridSize, cells };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=bitmapFingerprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFingerprint.js","sourceRoot":"","sources":["../src/bitmapFingerprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BitmapRegion } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Mirrors the `source` region left-to-right into the `dest` region. The mirror
|
|
4
|
+
* size is the overlap of the two regions. Safe to pass the same bitmap and
|
|
5
|
+
* region in `dest` and `source` for an in-place flip — when aliased, columns
|
|
6
|
+
* are swapped in pairs; otherwise `dest` and `source` must not overlap.
|
|
7
|
+
*/
|
|
8
|
+
export declare function flipBitmapHorizontal(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
|
|
9
|
+
/**
|
|
10
|
+
* Mirrors the `source` region top-to-bottom into the `dest` region. The mirror
|
|
11
|
+
* size is the overlap of the two regions. Safe to pass the same bitmap and
|
|
12
|
+
* region in `dest` and `source` for an in-place flip — when aliased, rows are
|
|
13
|
+
* swapped in pairs; otherwise `dest` and `source` must not overlap.
|
|
14
|
+
*/
|
|
15
|
+
export declare function flipBitmapVertical(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>): void;
|
|
16
|
+
//# sourceMappingURL=bitmapFlip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFlip.d.ts","sourceRoot":"","sources":["../src/bitmapFlip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAqBvG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI,CAqBrG"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { invalidateBitmap } from './bitmap';
|
|
2
|
+
/**
|
|
3
|
+
* Mirrors the `source` region left-to-right into the `dest` region. The mirror
|
|
4
|
+
* size is the overlap of the two regions. Safe to pass the same bitmap and
|
|
5
|
+
* region in `dest` and `source` for an in-place flip — when aliased, columns
|
|
6
|
+
* are swapped in pairs; otherwise `dest` and `source` must not overlap.
|
|
7
|
+
*/
|
|
8
|
+
export function flipBitmapHorizontal(dest, source) {
|
|
9
|
+
const w = Math.min(dest.width, source.width);
|
|
10
|
+
const h = Math.min(dest.height, source.height);
|
|
11
|
+
const data = dest.bitmap.data;
|
|
12
|
+
const stride = dest.bitmap.width;
|
|
13
|
+
if (isSameRegion(dest, source)) {
|
|
14
|
+
const half = w >> 1;
|
|
15
|
+
for (let py = 0; py < h; py++) {
|
|
16
|
+
const y = dest.y + py;
|
|
17
|
+
if (y < 0 || y >= dest.bitmap.height)
|
|
18
|
+
continue;
|
|
19
|
+
for (let px = 0; px < half; px++) {
|
|
20
|
+
const xa = dest.x + px;
|
|
21
|
+
const xb = dest.x + (w - 1 - px);
|
|
22
|
+
if (xa < 0 || xa >= stride || xb < 0 || xb >= stride)
|
|
23
|
+
continue;
|
|
24
|
+
swapPixels(data, (y * stride + xa) * 4, (y * stride + xb) * 4);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
copyMirrored(dest, source, w, h, true, false);
|
|
30
|
+
invalidateBitmap(dest.bitmap);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Mirrors the `source` region top-to-bottom into the `dest` region. The mirror
|
|
34
|
+
* size is the overlap of the two regions. Safe to pass the same bitmap and
|
|
35
|
+
* region in `dest` and `source` for an in-place flip — when aliased, rows are
|
|
36
|
+
* swapped in pairs; otherwise `dest` and `source` must not overlap.
|
|
37
|
+
*/
|
|
38
|
+
export function flipBitmapVertical(dest, source) {
|
|
39
|
+
const w = Math.min(dest.width, source.width);
|
|
40
|
+
const h = Math.min(dest.height, source.height);
|
|
41
|
+
const data = dest.bitmap.data;
|
|
42
|
+
const stride = dest.bitmap.width;
|
|
43
|
+
if (isSameRegion(dest, source)) {
|
|
44
|
+
const half = h >> 1;
|
|
45
|
+
for (let py = 0; py < half; py++) {
|
|
46
|
+
const yTop = dest.y + py;
|
|
47
|
+
const yBottom = dest.y + (h - 1 - py);
|
|
48
|
+
if (yTop < 0 || yTop >= dest.bitmap.height || yBottom < 0 || yBottom >= dest.bitmap.height)
|
|
49
|
+
continue;
|
|
50
|
+
for (let px = 0; px < w; px++) {
|
|
51
|
+
const x = dest.x + px;
|
|
52
|
+
if (x < 0 || x >= stride)
|
|
53
|
+
continue;
|
|
54
|
+
swapPixels(data, (yTop * stride + x) * 4, (yBottom * stride + x) * 4);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
copyMirrored(dest, source, w, h, false, true);
|
|
60
|
+
invalidateBitmap(dest.bitmap);
|
|
61
|
+
}
|
|
62
|
+
// Copies source -> dest with optional per-axis mirroring. Used for the
|
|
63
|
+
// non-aliased flip path (distinct bitmaps or non-overlapping regions).
|
|
64
|
+
function copyMirrored(dest, source, w, h, mirrorX, mirrorY) {
|
|
65
|
+
const sd = source.bitmap.data;
|
|
66
|
+
const dd = dest.bitmap.data;
|
|
67
|
+
const sStride = source.bitmap.width;
|
|
68
|
+
const dStride = dest.bitmap.width;
|
|
69
|
+
for (let py = 0; py < h; py++) {
|
|
70
|
+
const sy = source.y + (mirrorY ? h - 1 - py : py);
|
|
71
|
+
const dy = dest.y + py;
|
|
72
|
+
if (sy < 0 || sy >= source.bitmap.height || dy < 0 || dy >= dest.bitmap.height)
|
|
73
|
+
continue;
|
|
74
|
+
for (let px = 0; px < w; px++) {
|
|
75
|
+
const sx = source.x + (mirrorX ? w - 1 - px : px);
|
|
76
|
+
const dx = dest.x + px;
|
|
77
|
+
if (sx < 0 || sx >= sStride || dx < 0 || dx >= dStride)
|
|
78
|
+
continue;
|
|
79
|
+
const si = (sy * sStride + sx) * 4;
|
|
80
|
+
const di = (dy * dStride + dx) * 4;
|
|
81
|
+
dd[di] = sd[si];
|
|
82
|
+
dd[di + 1] = sd[si + 1];
|
|
83
|
+
dd[di + 2] = sd[si + 2];
|
|
84
|
+
dd[di + 3] = sd[si + 3];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function isSameRegion(a, b) {
|
|
89
|
+
return a.bitmap === b.bitmap && a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
|
|
90
|
+
}
|
|
91
|
+
function swapPixels(data, a, b) {
|
|
92
|
+
for (let c = 0; c < 4; c++) {
|
|
93
|
+
const t = data[a + c];
|
|
94
|
+
data[a + c] = data[b + c];
|
|
95
|
+
data[b + c] = t;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=bitmapFlip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFlip.js","sourceRoot":"","sources":["../src/bitmapFlip.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA4B,EAAE,MAA8B;IAC/F,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,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACjC,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,SAAS;YAC/C,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;gBACjC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBACjC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM;oBAAE,SAAS;gBAC/D,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IACD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA4B,EAAE,MAA8B;IAC7F,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,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACjC,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACtC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,SAAS;YACrG,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;gBAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM;oBAAE,SAAS;gBACnC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IACD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,uEAAuE;AACvE,uEAAuE;AACvE,SAAS,YAAY,CACnB,IAA4B,EAC5B,MAA8B,EAC9B,CAAS,EACT,CAAS,EACT,OAAgB,EAChB,OAAgB;IAEhB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAClC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,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,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,OAAO;gBAAE,SAAS;YACjE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACnC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACxB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,CAAyB,EAAE,CAAyB;IACxE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC;AAC7G,CAAC;AAED,SAAS,UAAU,CAAC,IAAuB,EAAE,CAAS,EAAE,CAAS;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PixelOrder } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a packed pixel buffer from one channel order to another.
|
|
4
|
+
* Safe to pass the same buffer as both `out` and `source` — all four
|
|
5
|
+
* channels are read into locals before any write.
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertBitmapPixelOrder(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number, from: PixelOrder, to: PixelOrder): void;
|
|
8
|
+
/**
|
|
9
|
+
* Converts straight-alpha pixels to premultiplied alpha in place or into
|
|
10
|
+
* a separate buffer. RGB channels are multiplied by alpha/255.
|
|
11
|
+
* Safe to pass the same buffer as both `out` and `source`.
|
|
12
|
+
*
|
|
13
|
+
* Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
|
|
14
|
+
* Image, set its `alphaType` to `premultiplied` to keep it truthful.
|
|
15
|
+
*/
|
|
16
|
+
export declare function premultiplyBitmapPixels(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Converts premultiplied-alpha pixels back to straight alpha in place or
|
|
19
|
+
* into a separate buffer. Pixels with alpha=0 are written as (0,0,0,0).
|
|
20
|
+
* Safe to pass the same buffer as both `out` and `source`.
|
|
21
|
+
*
|
|
22
|
+
* Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
|
|
23
|
+
* Image, set its `alphaType` to `straight` to keep it truthful.
|
|
24
|
+
*/
|
|
25
|
+
export declare function unpremultiplyBitmapPixels(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, length: number): void;
|
|
26
|
+
//# sourceMappingURL=bitmapFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFormat.d.ts","sourceRoot":"","sources":["../src/bitmapFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,UAAU,GACb,IAAI,CAiBN;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,IAAI,CAQN;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,MAAM,EAAE,MAAM,GACb,IAAI,CAgBN"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a packed pixel buffer from one channel order to another.
|
|
3
|
+
* Safe to pass the same buffer as both `out` and `source` — all four
|
|
4
|
+
* channels are read into locals before any write.
|
|
5
|
+
*/
|
|
6
|
+
export function convertBitmapPixelOrder(out, source, length, from, to) {
|
|
7
|
+
if (from === to) {
|
|
8
|
+
if (out !== source)
|
|
9
|
+
out.set(source.subarray(0, length));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const [srcR, srcG, srcB, srcA] = channelOffsets(from);
|
|
13
|
+
const [dstR, dstG, dstB, dstA] = channelOffsets(to);
|
|
14
|
+
for (let i = 0; i < length; i += 4) {
|
|
15
|
+
const r = source[i + srcR];
|
|
16
|
+
const g = source[i + srcG];
|
|
17
|
+
const b = source[i + srcB];
|
|
18
|
+
const a = source[i + srcA];
|
|
19
|
+
out[i + dstR] = r;
|
|
20
|
+
out[i + dstG] = g;
|
|
21
|
+
out[i + dstB] = b;
|
|
22
|
+
out[i + dstA] = a;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Converts straight-alpha pixels to premultiplied alpha in place or into
|
|
27
|
+
* a separate buffer. RGB channels are multiplied by alpha/255.
|
|
28
|
+
* Safe to pass the same buffer as both `out` and `source`.
|
|
29
|
+
*
|
|
30
|
+
* Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
|
|
31
|
+
* Image, set its `alphaType` to `premultiplied` to keep it truthful.
|
|
32
|
+
*/
|
|
33
|
+
export function premultiplyBitmapPixels(out, source, length) {
|
|
34
|
+
for (let i = 0; i < length; i += 4) {
|
|
35
|
+
const a = source[i + 3] / 255;
|
|
36
|
+
out[i] = Math.round(source[i] * a);
|
|
37
|
+
out[i + 1] = Math.round(source[i + 1] * a);
|
|
38
|
+
out[i + 2] = Math.round(source[i + 2] * a);
|
|
39
|
+
out[i + 3] = source[i + 3];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Converts premultiplied-alpha pixels back to straight alpha in place or
|
|
44
|
+
* into a separate buffer. Pixels with alpha=0 are written as (0,0,0,0).
|
|
45
|
+
* Safe to pass the same buffer as both `out` and `source`.
|
|
46
|
+
*
|
|
47
|
+
* Operates on a raw buffer, not a Bitmap — if the buffer belongs to an
|
|
48
|
+
* Image, set its `alphaType` to `straight` to keep it truthful.
|
|
49
|
+
*/
|
|
50
|
+
export function unpremultiplyBitmapPixels(out, source, length) {
|
|
51
|
+
for (let i = 0; i < length; i += 4) {
|
|
52
|
+
const a = source[i + 3];
|
|
53
|
+
if (a === 0) {
|
|
54
|
+
out[i] = 0;
|
|
55
|
+
out[i + 1] = 0;
|
|
56
|
+
out[i + 2] = 0;
|
|
57
|
+
out[i + 3] = 0;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const inv = 255 / a;
|
|
61
|
+
out[i] = Math.min(255, Math.round(source[i] * inv));
|
|
62
|
+
out[i + 1] = Math.min(255, Math.round(source[i + 1] * inv));
|
|
63
|
+
out[i + 2] = Math.min(255, Math.round(source[i + 2] * inv));
|
|
64
|
+
out[i + 3] = a;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function channelOffsets(order) {
|
|
69
|
+
switch (order) {
|
|
70
|
+
case 'RGBA':
|
|
71
|
+
return [0, 1, 2, 3];
|
|
72
|
+
case 'BGRA':
|
|
73
|
+
return [2, 1, 0, 3];
|
|
74
|
+
case 'ARGB':
|
|
75
|
+
return [1, 2, 3, 0];
|
|
76
|
+
case 'ABGR':
|
|
77
|
+
return [3, 2, 1, 0];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=bitmapFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFormat.js","sourceRoot":"","sources":["../src/bitmapFormat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Image, Bitmap } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Reads a host-backed Image into a newly allocated, CPU-readable Bitmap. The readback draws
|
|
4
|
+
* through a detached canvas; callers that need both representations should retain both objects.
|
|
5
|
+
*/
|
|
6
|
+
export declare function captureBitmapFromImageResource(resource: Readonly<Image>): Bitmap;
|
|
7
|
+
export declare function createBitmapFromCanvas(canvas: HTMLCanvasElement, x?: number, y?: number, width?: number, height?: number): Bitmap;
|
|
8
|
+
/**
|
|
9
|
+
* Reads a bitmap out of any `CanvasImageSource` by drawing it into a scratch 2D canvas. Unlike
|
|
10
|
+
* createBitmapFromCanvas — which calls getContext('2d') and so only works on a 2D-rendered canvas —
|
|
11
|
+
* this captures a Gl or Wgpu canvas too, giving one readback path for every render backend.
|
|
12
|
+
* `width`/`height` are the device-pixel dimensions to capture (pass the render state's canvas size).
|
|
13
|
+
* For a Gl/Wgpu source, draw before the browser composites the frame away (in tests, enable the
|
|
14
|
+
* context's preserveDrawingBuffer, or read immediately after rendering).
|
|
15
|
+
*
|
|
16
|
+
* Returns `null` when the pixels cannot be read rather than letting a platform exception escape. A
|
|
17
|
+
* cross-origin source taints the scratch canvas and the platform refuses to return its pixels — that
|
|
18
|
+
* is an expected outcome of loading someone else's image, not a programmer error, so it takes the
|
|
19
|
+
* sentinel the diagnostics conventions reserve for expected failure. Call `explainBitmapReadback`
|
|
20
|
+
* with the same arguments for the reason; it re-derives it without allocating a bitmap.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createBitmapFromImageSource(source: CanvasImageSource, width: number, height: number): Bitmap | null;
|
|
23
|
+
//# sourceMappingURL=bitmapFrom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapFrom.d.ts","sourceRoot":"","sources":["../src/bitmapFrom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAG9D;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAiBhF;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,iBAAiB,EACzB,CAAC,GAAE,MAAU,EACb,CAAC,GAAE,MAAU,EACb,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAeR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BnH"}
|