@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.
- 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 +131 -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 +17 -0
- package/dist/bitmapFrom.d.ts.map +1 -0
- package/dist/bitmapFrom.js +67 -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 +42 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +42 -0
- package/dist/contract.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 +136 -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 +57 -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
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { invalidateBitmap } from './bitmap';
|
|
2
|
+
/**
|
|
3
|
+
* Copies one channel of `source` into a channel of `dest`. The copied size is
|
|
4
|
+
* the overlap of the two regions; pixels outside either bitmap are skipped.
|
|
5
|
+
*
|
|
6
|
+
* Safe to pass the same bitmap in `dest` and `source` as long as `destChannel`
|
|
7
|
+
* and `sourceChannel` differ (each pixel writes a different byte than it reads).
|
|
8
|
+
* Copying a channel to itself is always a no-op regardless of aliasing.
|
|
9
|
+
*/
|
|
10
|
+
export function copyBitmapChannel(dest, destChannel, source, sourceChannel) {
|
|
11
|
+
const w = Math.min(dest.width, source.width);
|
|
12
|
+
const h = Math.min(dest.height, source.height);
|
|
13
|
+
for (let py = 0; py < h; py++) {
|
|
14
|
+
const sy = source.y + py;
|
|
15
|
+
const dy = dest.y + py;
|
|
16
|
+
if (sy < 0 || sy >= source.bitmap.height || dy < 0 || dy >= dest.bitmap.height)
|
|
17
|
+
continue;
|
|
18
|
+
for (let px = 0; px < w; px++) {
|
|
19
|
+
const sx = source.x + px;
|
|
20
|
+
const dx = dest.x + px;
|
|
21
|
+
if (sx < 0 || sx >= source.bitmap.width || dx < 0 || dx >= dest.bitmap.width)
|
|
22
|
+
continue;
|
|
23
|
+
const si = (sy * source.bitmap.width + sx) * 4;
|
|
24
|
+
const di = (dy * dest.bitmap.width + dx) * 4;
|
|
25
|
+
dest.bitmap.data[di + destChannel] = source.bitmap.data[si + sourceChannel];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
invalidateBitmap(dest.bitmap);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Copies `source` into `dest`. The copied size is the overlap of the two
|
|
32
|
+
* regions; pixels outside either bitmap are skipped. When `composite` is
|
|
33
|
+
* true, `source` is alpha-composited (Porter-Duff source-over) over `dest`
|
|
34
|
+
* instead of overwriting it.
|
|
35
|
+
*
|
|
36
|
+
* Safe to pass the same bitmap in `dest` and `source` when the regions do not
|
|
37
|
+
* overlap. Overlapping regions produce undefined results because pixels are
|
|
38
|
+
* written before all source reads are complete.
|
|
39
|
+
*/
|
|
40
|
+
export function copyBitmapPixels(dest, source, composite = false) {
|
|
41
|
+
const w = Math.min(dest.width, source.width);
|
|
42
|
+
const h = Math.min(dest.height, source.height);
|
|
43
|
+
const sd = source.bitmap.data;
|
|
44
|
+
const dd = dest.bitmap.data;
|
|
45
|
+
for (let py = 0; py < h; py++) {
|
|
46
|
+
const sy = source.y + py;
|
|
47
|
+
const dy = dest.y + py;
|
|
48
|
+
if (sy < 0 || sy >= source.bitmap.height || dy < 0 || dy >= dest.bitmap.height)
|
|
49
|
+
continue;
|
|
50
|
+
for (let px = 0; px < w; px++) {
|
|
51
|
+
const sx = source.x + px;
|
|
52
|
+
const dx = dest.x + px;
|
|
53
|
+
if (sx < 0 || sx >= source.bitmap.width || dx < 0 || dx >= dest.bitmap.width)
|
|
54
|
+
continue;
|
|
55
|
+
const si = (sy * source.bitmap.width + sx) * 4;
|
|
56
|
+
const di = (dy * dest.bitmap.width + dx) * 4;
|
|
57
|
+
if (composite) {
|
|
58
|
+
const srcA = sd[si + 3] / 255;
|
|
59
|
+
const dstA = dd[di + 3] / 255;
|
|
60
|
+
const outA = srcA + dstA * (1 - srcA);
|
|
61
|
+
if (outA > 0) {
|
|
62
|
+
dd[di] = Math.round((sd[si] * srcA + dd[di] * dstA * (1 - srcA)) / outA);
|
|
63
|
+
dd[di + 1] = Math.round((sd[si + 1] * srcA + dd[di + 1] * dstA * (1 - srcA)) / outA);
|
|
64
|
+
dd[di + 2] = Math.round((sd[si + 2] * srcA + dd[di + 2] * dstA * (1 - srcA)) / outA);
|
|
65
|
+
dd[di + 3] = Math.round(outA * 255);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
dd[di] = sd[si];
|
|
70
|
+
dd[di + 1] = sd[si + 1];
|
|
71
|
+
dd[di + 2] = sd[si + 2];
|
|
72
|
+
dd[di + 3] = sd[si + 3];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
invalidateBitmap(dest.bitmap);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=bitmapCopy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapCopy.js","sourceRoot":"","sources":["../src/bitmapCopy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Bitmap } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the fraction of pixels (0..1) that differ from `backgroundColor` by more than
|
|
4
|
+
* `channelTolerance` on at least one RGBA channel. This is the "did anything render" signal: a blank
|
|
5
|
+
* frame (the whole bitmap still the clear colour, or fully transparent) returns ~0; a populated
|
|
6
|
+
* frame returns a meaningful fraction. `backgroundColor` is a packed 0xRRGGBBAA value — pass the
|
|
7
|
+
* render state's clear colour. `channelTolerance` (0..255) absorbs antialiasing fringe around the
|
|
8
|
+
* cleared edges so a genuinely empty frame does not creep above zero.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getBitmapCoverage(source: Readonly<Bitmap>, backgroundColor: number, channelTolerance?: number): number;
|
|
11
|
+
//# sourceMappingURL=bitmapCoverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapCoverage.d.ts","sourceRoot":"","sources":["../src/bitmapCoverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,eAAe,EAAE,MAAM,EACvB,gBAAgB,GAAE,MAAU,GAC3B,MAAM,CAqBR"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the fraction of pixels (0..1) that differ from `backgroundColor` by more than
|
|
3
|
+
* `channelTolerance` on at least one RGBA channel. This is the "did anything render" signal: a blank
|
|
4
|
+
* frame (the whole bitmap still the clear colour, or fully transparent) returns ~0; a populated
|
|
5
|
+
* frame returns a meaningful fraction. `backgroundColor` is a packed 0xRRGGBBAA value — pass the
|
|
6
|
+
* render state's clear colour. `channelTolerance` (0..255) absorbs antialiasing fringe around the
|
|
7
|
+
* cleared edges so a genuinely empty frame does not creep above zero.
|
|
8
|
+
*/
|
|
9
|
+
export function getBitmapCoverage(source, backgroundColor, channelTolerance = 0) {
|
|
10
|
+
const br = (backgroundColor >>> 24) & 0xff;
|
|
11
|
+
const bg = (backgroundColor >> 16) & 0xff;
|
|
12
|
+
const bb = (backgroundColor >> 8) & 0xff;
|
|
13
|
+
const ba = backgroundColor & 0xff;
|
|
14
|
+
const data = source.data;
|
|
15
|
+
const totalPixels = source.width * source.height;
|
|
16
|
+
if (totalPixels === 0)
|
|
17
|
+
return 0;
|
|
18
|
+
let covered = 0;
|
|
19
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
20
|
+
if (Math.abs(data[i] - br) > channelTolerance ||
|
|
21
|
+
Math.abs(data[i + 1] - bg) > channelTolerance ||
|
|
22
|
+
Math.abs(data[i + 2] - bb) > channelTolerance ||
|
|
23
|
+
Math.abs(data[i + 3] - ba) > channelTolerance) {
|
|
24
|
+
covered++;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return covered / totalPixels;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=bitmapCoverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapCoverage.js","sourceRoot":"","sources":["../src/bitmapCoverage.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,eAAuB,EACvB,mBAA2B,CAAC;IAE5B,MAAM,EAAE,GAAG,CAAC,eAAe,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,GAAG,eAAe,GAAG,IAAI,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IACjD,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IACE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,gBAAgB;YACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,gBAAgB;YAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,gBAAgB;YAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,gBAAgB,EAC7C,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,GAAG,WAAW,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RectangleLike, Bitmap, BitmapEdgeMode } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Allocates a new `Bitmap` containing the pixels of `source` cropped to
|
|
4
|
+
* `rect`. `rect` coordinates are relative to the `source` bitmap origin
|
|
5
|
+
* (not to a region offset). Pixels of `rect` that fall outside the bitmap
|
|
6
|
+
* are filled with transparent black.
|
|
7
|
+
*
|
|
8
|
+
* Returns a new `Bitmap` with the same `colorSpace`, `alphaType`, and
|
|
9
|
+
* `format` as `source`, with dimensions equal to `rect.width × rect.height`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function cropBitmap(source: Readonly<Bitmap>, rect: Readonly<RectangleLike>): Bitmap;
|
|
12
|
+
/**
|
|
13
|
+
* Allocates a new `Bitmap` with `source` padded by `left`, `top`, `right`,
|
|
14
|
+
* and `bottom` pixels on each side. Added pixels are filled according to
|
|
15
|
+
* `edgeMode`:
|
|
16
|
+
* - `'transparent'` (default): filled with transparent black.
|
|
17
|
+
* - `'clamp'`: border pixels of `source` are repeated.
|
|
18
|
+
* - `'wrap'`: `source` is tiled.
|
|
19
|
+
* - `'mirror'`: `source` is mirrored at the edges.
|
|
20
|
+
*
|
|
21
|
+
* When `edgeMode` is `'transparent'`, the optional `fillColor` (packed RGBA,
|
|
22
|
+
* e.g. `0xffffffff` for opaque white) overrides the default transparent fill.
|
|
23
|
+
* It is ignored for all other edge modes.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extendBitmap(source: Readonly<Bitmap>, left: number, top: number, right: number, bottom: number, edgeMode?: BitmapEdgeMode, fillColor?: number): Bitmap;
|
|
26
|
+
/**
|
|
27
|
+
* Allocates a new `Bitmap` with the transparent border of `source` removed.
|
|
28
|
+
* Finds the tightest bounding box of all pixels with alpha > 0 and returns a
|
|
29
|
+
* new bitmap cropped to that box. If the entire bitmap is transparent,
|
|
30
|
+
* returns a 1×1 transparent bitmap.
|
|
31
|
+
*/
|
|
32
|
+
export declare function trimBitmap(source: Readonly<Bitmap>): Bitmap;
|
|
33
|
+
//# sourceMappingURL=bitmapCrop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapCrop.d.ts","sourceRoot":"","sources":["../src/bitmapCrop.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGtF;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,MAAM,CAiC1F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,cAA8B,EACxC,SAAS,SAAI,GACZ,MAAM,CAkDR;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAgC3D"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import { BitmapTextureBackingKind } from '@flighthq/types/contract';
|
|
3
|
+
/**
|
|
4
|
+
* Allocates a new `Bitmap` containing the pixels of `source` cropped to
|
|
5
|
+
* `rect`. `rect` coordinates are relative to the `source` bitmap origin
|
|
6
|
+
* (not to a region offset). Pixels of `rect` that fall outside the bitmap
|
|
7
|
+
* are filled with transparent black.
|
|
8
|
+
*
|
|
9
|
+
* Returns a new `Bitmap` with the same `colorSpace`, `alphaType`, and
|
|
10
|
+
* `format` as `source`, with dimensions equal to `rect.width × rect.height`.
|
|
11
|
+
*/
|
|
12
|
+
export function cropBitmap(source, rect) {
|
|
13
|
+
const sw = source.width;
|
|
14
|
+
const sh = source.height;
|
|
15
|
+
const rx = Math.round(rect.x);
|
|
16
|
+
const ry = Math.round(rect.y);
|
|
17
|
+
const rw = Math.max(0, Math.round(rect.width));
|
|
18
|
+
const rh = Math.max(0, Math.round(rect.height));
|
|
19
|
+
const data = new Uint8ClampedArray(rw * rh * 4);
|
|
20
|
+
const sd = source.data;
|
|
21
|
+
for (let py = 0; py < rh; py++) {
|
|
22
|
+
const sy = ry + py;
|
|
23
|
+
if (sy < 0 || sy >= sh)
|
|
24
|
+
continue;
|
|
25
|
+
for (let px = 0; px < rw; px++) {
|
|
26
|
+
const sx = rx + px;
|
|
27
|
+
if (sx < 0 || sx >= sw)
|
|
28
|
+
continue;
|
|
29
|
+
const si = (sy * sw + sx) * 4;
|
|
30
|
+
const di = (py * rw + px) * 4;
|
|
31
|
+
data[di] = sd[si];
|
|
32
|
+
data[di + 1] = sd[si + 1];
|
|
33
|
+
data[di + 2] = sd[si + 2];
|
|
34
|
+
data[di + 3] = sd[si + 3];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return createEntity({
|
|
38
|
+
alphaType: source.alphaType,
|
|
39
|
+
colorSpace: source.colorSpace,
|
|
40
|
+
data,
|
|
41
|
+
format: source.format,
|
|
42
|
+
height: rh,
|
|
43
|
+
kind: BitmapTextureBackingKind,
|
|
44
|
+
version: 0,
|
|
45
|
+
width: rw,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Allocates a new `Bitmap` with `source` padded by `left`, `top`, `right`,
|
|
50
|
+
* and `bottom` pixels on each side. Added pixels are filled according to
|
|
51
|
+
* `edgeMode`:
|
|
52
|
+
* - `'transparent'` (default): filled with transparent black.
|
|
53
|
+
* - `'clamp'`: border pixels of `source` are repeated.
|
|
54
|
+
* - `'wrap'`: `source` is tiled.
|
|
55
|
+
* - `'mirror'`: `source` is mirrored at the edges.
|
|
56
|
+
*
|
|
57
|
+
* When `edgeMode` is `'transparent'`, the optional `fillColor` (packed RGBA,
|
|
58
|
+
* e.g. `0xffffffff` for opaque white) overrides the default transparent fill.
|
|
59
|
+
* It is ignored for all other edge modes.
|
|
60
|
+
*/
|
|
61
|
+
export function extendBitmap(source, left, top, right, bottom, edgeMode = 'transparent', fillColor = 0) {
|
|
62
|
+
const sw = source.width;
|
|
63
|
+
const sh = source.height;
|
|
64
|
+
const dw = sw + left + right;
|
|
65
|
+
const dh = sh + top + bottom;
|
|
66
|
+
const data = new Uint8ClampedArray(dw * dh * 4);
|
|
67
|
+
const sd = source.data;
|
|
68
|
+
const fr = (fillColor >>> 24) & 0xff;
|
|
69
|
+
const fg = (fillColor >> 16) & 0xff;
|
|
70
|
+
const fb = (fillColor >> 8) & 0xff;
|
|
71
|
+
const fa = fillColor & 0xff;
|
|
72
|
+
for (let py = 0; py < dh; py++) {
|
|
73
|
+
for (let px = 0; px < dw; px++) {
|
|
74
|
+
const sx = px - left;
|
|
75
|
+
const sy = py - top;
|
|
76
|
+
const di = (py * dw + px) * 4;
|
|
77
|
+
if (sx >= 0 && sx < sw && sy >= 0 && sy < sh) {
|
|
78
|
+
const si = (sy * sw + sx) * 4;
|
|
79
|
+
data[di] = sd[si];
|
|
80
|
+
data[di + 1] = sd[si + 1];
|
|
81
|
+
data[di + 2] = sd[si + 2];
|
|
82
|
+
data[di + 3] = sd[si + 3];
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const cx = resolveEdge(sx, sw, edgeMode);
|
|
86
|
+
const cy = resolveEdge(sy, sh, edgeMode);
|
|
87
|
+
if (cx !== null && cy !== null) {
|
|
88
|
+
const si = (cy * sw + cx) * 4;
|
|
89
|
+
data[di] = sd[si];
|
|
90
|
+
data[di + 1] = sd[si + 1];
|
|
91
|
+
data[di + 2] = sd[si + 2];
|
|
92
|
+
data[di + 3] = sd[si + 3];
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
data[di] = fr;
|
|
96
|
+
data[di + 1] = fg;
|
|
97
|
+
data[di + 2] = fb;
|
|
98
|
+
data[di + 3] = fa;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return createEntity({
|
|
104
|
+
alphaType: source.alphaType,
|
|
105
|
+
colorSpace: source.colorSpace,
|
|
106
|
+
data,
|
|
107
|
+
format: source.format,
|
|
108
|
+
height: dh,
|
|
109
|
+
kind: BitmapTextureBackingKind,
|
|
110
|
+
version: 0,
|
|
111
|
+
width: dw,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Allocates a new `Bitmap` with the transparent border of `source` removed.
|
|
116
|
+
* Finds the tightest bounding box of all pixels with alpha > 0 and returns a
|
|
117
|
+
* new bitmap cropped to that box. If the entire bitmap is transparent,
|
|
118
|
+
* returns a 1×1 transparent bitmap.
|
|
119
|
+
*/
|
|
120
|
+
export function trimBitmap(source) {
|
|
121
|
+
const sw = source.width;
|
|
122
|
+
const sh = source.height;
|
|
123
|
+
const sd = source.data;
|
|
124
|
+
let minX = sw;
|
|
125
|
+
let minY = sh;
|
|
126
|
+
let maxX = -1;
|
|
127
|
+
let maxY = -1;
|
|
128
|
+
for (let py = 0; py < sh; py++) {
|
|
129
|
+
for (let px = 0; px < sw; px++) {
|
|
130
|
+
const a = sd[(py * sw + px) * 4 + 3];
|
|
131
|
+
if (a > 0) {
|
|
132
|
+
if (px < minX)
|
|
133
|
+
minX = px;
|
|
134
|
+
if (px > maxX)
|
|
135
|
+
maxX = px;
|
|
136
|
+
if (py < minY)
|
|
137
|
+
minY = py;
|
|
138
|
+
if (py > maxY)
|
|
139
|
+
maxY = py;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (maxX < 0) {
|
|
144
|
+
return createEntity({
|
|
145
|
+
alphaType: source.alphaType,
|
|
146
|
+
colorSpace: source.colorSpace,
|
|
147
|
+
data: new Uint8ClampedArray(4),
|
|
148
|
+
format: source.format,
|
|
149
|
+
height: 1,
|
|
150
|
+
kind: BitmapTextureBackingKind,
|
|
151
|
+
version: 0,
|
|
152
|
+
width: 1,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return cropBitmap(source, { x: minX, y: minY, width: maxX - minX + 1, height: maxY - minY + 1 });
|
|
156
|
+
}
|
|
157
|
+
function resolveEdge(v, size, mode) {
|
|
158
|
+
if (v >= 0 && v < size)
|
|
159
|
+
return v;
|
|
160
|
+
switch (mode) {
|
|
161
|
+
case 'clamp':
|
|
162
|
+
return Math.max(0, Math.min(size - 1, v));
|
|
163
|
+
case 'wrap':
|
|
164
|
+
return ((v % size) + size) % size;
|
|
165
|
+
case 'mirror': {
|
|
166
|
+
const period = 2 * size;
|
|
167
|
+
const wrapped = ((v % period) + period) % period;
|
|
168
|
+
return wrapped < size ? wrapped : period - 1 - wrapped;
|
|
169
|
+
}
|
|
170
|
+
default:
|
|
171
|
+
// 'transparent'
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=bitmapCrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapCrop.js","sourceRoot":"","sources":["../src/bitmapCrop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BitmapDisplacementMapOptions, BitmapRegion } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Warps `source` by sampling each output pixel from a displaced source position,
|
|
4
|
+
* writing into `out`. The displacement for pixel (px, py) is read from `map` at
|
|
5
|
+
* the aligned position and scaled:
|
|
6
|
+
*
|
|
7
|
+
* dx = (mapValueX / 255 - 0.5) * scaleX
|
|
8
|
+
* dy = (mapValueY / 255 - 0.5) * scaleY
|
|
9
|
+
*
|
|
10
|
+
* A map value of 128 is approximately neutral (< 0.2px shift). Sampling uses
|
|
11
|
+
* bilinear interpolation.
|
|
12
|
+
*
|
|
13
|
+
* When `edgeMode` is set, it controls out-of-bounds behaviour using the standard
|
|
14
|
+
* `BitmapEdgeMode` values (`'clamp'`, `'wrap'`, `'mirror'`, `'transparent'`).
|
|
15
|
+
* Otherwise `mode` is used: `'wrap'` tiles, `'clamp'` holds the edge, `'ignore'`
|
|
16
|
+
* keeps the undisplaced source pixel, and `'color'` fills with `fillColor`.
|
|
17
|
+
*
|
|
18
|
+
* `out` must be at least `source.width * source.height * 4` bytes and must NOT
|
|
19
|
+
* alias `source.bitmap.data` — output pixels read arbitrary source positions.
|
|
20
|
+
*/
|
|
21
|
+
export declare function displaceBitmap(out: Uint8ClampedArray, source: Readonly<BitmapRegion>, options: Readonly<BitmapDisplacementMapOptions>): void;
|
|
22
|
+
//# sourceMappingURL=bitmapDisplacement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapDisplacement.d.ts","sourceRoot":"","sources":["../src/bitmapDisplacement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAkB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE3G;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC,GAC9C,IAAI,CAwFN"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warps `source` by sampling each output pixel from a displaced source position,
|
|
3
|
+
* writing into `out`. The displacement for pixel (px, py) is read from `map` at
|
|
4
|
+
* the aligned position and scaled:
|
|
5
|
+
*
|
|
6
|
+
* dx = (mapValueX / 255 - 0.5) * scaleX
|
|
7
|
+
* dy = (mapValueY / 255 - 0.5) * scaleY
|
|
8
|
+
*
|
|
9
|
+
* A map value of 128 is approximately neutral (< 0.2px shift). Sampling uses
|
|
10
|
+
* bilinear interpolation.
|
|
11
|
+
*
|
|
12
|
+
* When `edgeMode` is set, it controls out-of-bounds behaviour using the standard
|
|
13
|
+
* `BitmapEdgeMode` values (`'clamp'`, `'wrap'`, `'mirror'`, `'transparent'`).
|
|
14
|
+
* Otherwise `mode` is used: `'wrap'` tiles, `'clamp'` holds the edge, `'ignore'`
|
|
15
|
+
* keeps the undisplaced source pixel, and `'color'` fills with `fillColor`.
|
|
16
|
+
*
|
|
17
|
+
* `out` must be at least `source.width * source.height * 4` bytes and must NOT
|
|
18
|
+
* alias `source.bitmap.data` — output pixels read arbitrary source positions.
|
|
19
|
+
*/
|
|
20
|
+
export function displaceBitmap(out, source, options) {
|
|
21
|
+
const w = source.width;
|
|
22
|
+
const h = source.height;
|
|
23
|
+
const map = options.map;
|
|
24
|
+
const componentX = options.componentX ?? 0;
|
|
25
|
+
const componentY = options.componentY ?? 1;
|
|
26
|
+
const scaleX = options.scaleX ?? 0;
|
|
27
|
+
const scaleY = options.scaleY ?? 0;
|
|
28
|
+
const edgeMode = options.edgeMode;
|
|
29
|
+
const mode = options.mode ?? 'wrap';
|
|
30
|
+
const fillColor = options.fillColor ?? 0;
|
|
31
|
+
const fillR = (fillColor >>> 24) & 0xff;
|
|
32
|
+
const fillG = (fillColor >> 16) & 0xff;
|
|
33
|
+
const fillB = (fillColor >> 8) & 0xff;
|
|
34
|
+
const fillA = fillColor & 0xff;
|
|
35
|
+
for (let py = 0; py < h; py++) {
|
|
36
|
+
for (let px = 0; px < w; px++) {
|
|
37
|
+
const di = (py * w + px) * 4;
|
|
38
|
+
const mapVx = sampleMapChannel(map, px, py, componentX);
|
|
39
|
+
const mapVy = sampleMapChannel(map, px, py, componentY);
|
|
40
|
+
const rawSampleX = px + (mapVx / 255 - 0.5) * scaleX;
|
|
41
|
+
const rawSampleY = py + (mapVy / 255 - 0.5) * scaleY;
|
|
42
|
+
let sampleX = rawSampleX;
|
|
43
|
+
let sampleY = rawSampleY;
|
|
44
|
+
if (rawSampleX < 0 || rawSampleX >= w || rawSampleY < 0 || rawSampleY >= h) {
|
|
45
|
+
if (edgeMode !== undefined) {
|
|
46
|
+
const rx = resolveDisplacementEdge(rawSampleX, w, edgeMode);
|
|
47
|
+
const ry = resolveDisplacementEdge(rawSampleY, h, edgeMode);
|
|
48
|
+
if (rx === null || ry === null) {
|
|
49
|
+
out[di] = 0;
|
|
50
|
+
out[di + 1] = 0;
|
|
51
|
+
out[di + 2] = 0;
|
|
52
|
+
out[di + 3] = 0;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
sampleX = rx;
|
|
56
|
+
sampleY = ry;
|
|
57
|
+
}
|
|
58
|
+
else if (mode === 'wrap') {
|
|
59
|
+
sampleX = ((rawSampleX % w) + w) % w;
|
|
60
|
+
sampleY = ((rawSampleY % h) + h) % h;
|
|
61
|
+
}
|
|
62
|
+
else if (mode === 'clamp') {
|
|
63
|
+
sampleX = Math.max(0, Math.min(w - 1, rawSampleX));
|
|
64
|
+
sampleY = Math.max(0, Math.min(h - 1, rawSampleY));
|
|
65
|
+
}
|
|
66
|
+
else if (mode === 'ignore') {
|
|
67
|
+
sampleX = px;
|
|
68
|
+
sampleY = py;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
out[di] = fillR;
|
|
72
|
+
out[di + 1] = fillG;
|
|
73
|
+
out[di + 2] = fillB;
|
|
74
|
+
out[di + 3] = fillA;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const x0 = Math.floor(sampleX);
|
|
79
|
+
const y0 = Math.floor(sampleY);
|
|
80
|
+
const tx = sampleX - x0;
|
|
81
|
+
const ty = sampleY - y0;
|
|
82
|
+
const sStride = source.bitmap.width;
|
|
83
|
+
const sData = source.bitmap.data;
|
|
84
|
+
const x0c = source.x + Math.max(0, Math.min(w - 1, x0));
|
|
85
|
+
const x1c = source.x + Math.max(0, Math.min(w - 1, x0 + 1));
|
|
86
|
+
const y0c = source.y + Math.max(0, Math.min(h - 1, y0));
|
|
87
|
+
const y1c = source.y + Math.max(0, Math.min(h - 1, y0 + 1));
|
|
88
|
+
if (x0c < 0 || x0c >= sData.length / 4 || y0c < 0) {
|
|
89
|
+
out[di] = 0;
|
|
90
|
+
out[di + 1] = 0;
|
|
91
|
+
out[di + 2] = 0;
|
|
92
|
+
out[di + 3] = 0;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const i00 = (y0c * sStride + x0c) * 4;
|
|
96
|
+
const i10 = (y0c * sStride + x1c) * 4;
|
|
97
|
+
const i01 = (y1c * sStride + x0c) * 4;
|
|
98
|
+
const i11 = (y1c * sStride + x1c) * 4;
|
|
99
|
+
for (let c = 0; c < 4; c++) {
|
|
100
|
+
const top = sData[i00 + c] * (1 - tx) + sData[i10 + c] * tx;
|
|
101
|
+
const bottom = sData[i01 + c] * (1 - tx) + sData[i11 + c] * tx;
|
|
102
|
+
out[di + c] = Math.round(top * (1 - ty) + bottom * ty);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function resolveDisplacementEdge(v, size, mode) {
|
|
108
|
+
if (v >= 0 && v < size)
|
|
109
|
+
return v;
|
|
110
|
+
switch (mode) {
|
|
111
|
+
case 'clamp':
|
|
112
|
+
return Math.max(0, Math.min(size - 1, v));
|
|
113
|
+
case 'wrap':
|
|
114
|
+
return ((v % size) + size) % size;
|
|
115
|
+
case 'mirror': {
|
|
116
|
+
const period = 2 * size;
|
|
117
|
+
const wrapped = ((v % period) + period) % period;
|
|
118
|
+
return wrapped < size ? wrapped : period - 1 - wrapped;
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function sampleMapChannel(map, px, py, component) {
|
|
125
|
+
const mx = map.x + px;
|
|
126
|
+
const my = map.y + py;
|
|
127
|
+
if (mx < 0 || mx >= map.bitmap.width || my < 0 || my >= map.bitmap.height)
|
|
128
|
+
return 128;
|
|
129
|
+
return map.bitmap.data[(my * map.bitmap.width + mx) * 4 + component];
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=bitmapDisplacement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapDisplacement.js","sourceRoot":"","sources":["../src/bitmapDisplacement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BitmapRegion } from '@flighthq/types/contract';
|
|
2
|
+
/**
|
|
3
|
+
* Transitions `dest` toward `source` one batch of pixels at a time, in a
|
|
4
|
+
* deterministic pseudo-random order — the classic dissolve wipe. Each call
|
|
5
|
+
* dissolves up to `pixelCount` not-yet-dissolved pixels and returns the next
|
|
6
|
+
* seed; pass that value back on the following call to continue the wipe without
|
|
7
|
+
* revisiting any pixel. Start a fresh dissolve with `seed = 0`. Once every pixel
|
|
8
|
+
* has dissolved the returned seed is terminal: further calls with it are no-ops.
|
|
9
|
+
*
|
|
10
|
+
* `seed` is an opaque progress cursor over a fixed permutation of the region's
|
|
11
|
+
* pixels, not a color or coordinate. The dissolve order is fully deterministic
|
|
12
|
+
* in the region's dimensions.
|
|
13
|
+
*
|
|
14
|
+
* When `source` is the same region as `dest` (same bitmap and identical
|
|
15
|
+
* bounds), dissolved pixels are set to `fillColor` (packed `0xRRGGBBAA`);
|
|
16
|
+
* otherwise each is copied from the matching pixel in
|
|
17
|
+
* `source` and `fillColor` is ignored. Pixels that fall outside the bitmap are
|
|
18
|
+
* clipped but still consume a step of the sequence.
|
|
19
|
+
*/
|
|
20
|
+
export declare function dissolveBitmapPixels(dest: Readonly<BitmapRegion>, source: Readonly<BitmapRegion>, seed: number, pixelCount: number, fillColor?: number): number;
|
|
21
|
+
//# sourceMappingURL=bitmapDissolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitmapDissolve.d.ts","sourceRoot":"","sources":["../src/bitmapDissolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC5B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,MAAU,GACpB,MAAM,CAkER"}
|