@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.
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/surface.d.ts +16 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +84 -0
- package/dist/surface.js.map +1 -0
- package/dist/surfaceAffine.d.ts +27 -0
- package/dist/surfaceAffine.d.ts.map +1 -0
- package/dist/surfaceAffine.js +159 -0
- package/dist/surfaceAffine.js.map +1 -0
- package/dist/surfaceAlpha.d.ts +27 -0
- package/dist/surfaceAlpha.d.ts.map +1 -0
- package/dist/surfaceAlpha.js +83 -0
- package/dist/surfaceAlpha.js.map +1 -0
- package/dist/surfaceBevel.d.ts +42 -0
- package/dist/surfaceBevel.d.ts.map +1 -0
- package/dist/surfaceBevel.js +102 -0
- package/dist/surfaceBevel.js.map +1 -0
- package/dist/surfaceBlur.d.ts +62 -0
- package/dist/surfaceBlur.d.ts.map +1 -0
- package/dist/surfaceBlur.js +263 -0
- package/dist/surfaceBlur.js.map +1 -0
- package/dist/surfaceChannel.d.ts +24 -0
- package/dist/surfaceChannel.d.ts.map +1 -0
- package/dist/surfaceChannel.js +126 -0
- package/dist/surfaceChannel.js.map +1 -0
- package/dist/surfaceColorMatrix.d.ts +57 -0
- package/dist/surfaceColorMatrix.d.ts.map +1 -0
- package/dist/surfaceColorMatrix.js +127 -0
- package/dist/surfaceColorMatrix.js.map +1 -0
- package/dist/surfaceCompare.d.ts +18 -0
- package/dist/surfaceCompare.d.ts.map +1 -0
- package/dist/surfaceCompare.js +64 -0
- package/dist/surfaceCompare.js.map +1 -0
- package/dist/surfaceComposite.d.ts +53 -0
- package/dist/surfaceComposite.d.ts.map +1 -0
- package/dist/surfaceComposite.js +230 -0
- package/dist/surfaceComposite.js.map +1 -0
- package/dist/surfaceConvolution.d.ts +27 -0
- package/dist/surfaceConvolution.d.ts.map +1 -0
- package/dist/surfaceConvolution.js +103 -0
- package/dist/surfaceConvolution.js.map +1 -0
- package/dist/surfaceCopy.d.ts +23 -0
- package/dist/surfaceCopy.d.ts.map +1 -0
- package/dist/surfaceCopy.js +78 -0
- package/dist/surfaceCopy.js.map +1 -0
- package/dist/surfaceCoverage.d.ts +11 -0
- package/dist/surfaceCoverage.d.ts.map +1 -0
- package/dist/surfaceCoverage.js +29 -0
- package/dist/surfaceCoverage.js.map +1 -0
- package/dist/surfaceCrop.d.ts +33 -0
- package/dist/surfaceCrop.d.ts.map +1 -0
- package/dist/surfaceCrop.js +174 -0
- package/dist/surfaceCrop.js.map +1 -0
- package/dist/surfaceDisplacement.d.ts +48 -0
- package/dist/surfaceDisplacement.d.ts.map +1 -0
- package/dist/surfaceDisplacement.js +131 -0
- package/dist/surfaceDisplacement.js.map +1 -0
- package/dist/surfaceDissolve.d.ts +21 -0
- package/dist/surfaceDissolve.d.ts.map +1 -0
- package/dist/surfaceDissolve.js +97 -0
- package/dist/surfaceDissolve.js.map +1 -0
- package/dist/surfaceDraw.d.ts +8 -0
- package/dist/surfaceDraw.d.ts.map +1 -0
- package/dist/surfaceDraw.js +14 -0
- package/dist/surfaceDraw.js.map +1 -0
- package/dist/surfaceEncode.d.ts +3 -0
- package/dist/surfaceEncode.d.ts.map +1 -0
- package/dist/surfaceEncode.js +18 -0
- package/dist/surfaceEncode.js.map +1 -0
- package/dist/surfaceFill.d.ts +12 -0
- package/dist/surfaceFill.d.ts.map +1 -0
- package/dist/surfaceFill.js +85 -0
- package/dist/surfaceFill.js.map +1 -0
- package/dist/surfaceFingerprint.d.ts +26 -0
- package/dist/surfaceFingerprint.d.ts.map +1 -0
- package/dist/surfaceFingerprint.js +99 -0
- package/dist/surfaceFingerprint.js.map +1 -0
- package/dist/surfaceFlip.d.ts +16 -0
- package/dist/surfaceFlip.d.ts.map +1 -0
- package/dist/surfaceFlip.js +98 -0
- package/dist/surfaceFlip.js.map +1 -0
- package/dist/surfaceFormat.d.ts +26 -0
- package/dist/surfaceFormat.d.ts.map +1 -0
- package/dist/surfaceFormat.js +80 -0
- package/dist/surfaceFormat.js.map +1 -0
- package/dist/surfaceFrom.d.ts +14 -0
- package/dist/surfaceFrom.d.ts.map +1 -0
- package/dist/surfaceFrom.js +87 -0
- package/dist/surfaceFrom.js.map +1 -0
- package/dist/surfaceGradient.d.ts +57 -0
- package/dist/surfaceGradient.d.ts.map +1 -0
- package/dist/surfaceGradient.js +176 -0
- package/dist/surfaceGradient.js.map +1 -0
- package/dist/surfaceGradientFill.d.ts +32 -0
- package/dist/surfaceGradientFill.d.ts.map +1 -0
- package/dist/surfaceGradientFill.js +120 -0
- package/dist/surfaceGradientFill.js.map +1 -0
- package/dist/surfaceHistogram.d.ts +20 -0
- package/dist/surfaceHistogram.d.ts.map +1 -0
- package/dist/surfaceHistogram.js +61 -0
- package/dist/surfaceHistogram.js.map +1 -0
- package/dist/surfaceImageChannel.d.ts +2 -0
- package/dist/surfaceImageChannel.d.ts.map +1 -0
- package/dist/surfaceImageChannel.js +2 -0
- package/dist/surfaceImageChannel.js.map +1 -0
- package/dist/surfaceMedian.d.ts +14 -0
- package/dist/surfaceMedian.d.ts.map +1 -0
- package/dist/surfaceMedian.js +77 -0
- package/dist/surfaceMedian.js.map +1 -0
- package/dist/surfaceMorphological.d.ts +29 -0
- package/dist/surfaceMorphological.d.ts.map +1 -0
- package/dist/surfaceMorphological.js +81 -0
- package/dist/surfaceMorphological.js.map +1 -0
- package/dist/surfaceNoise.d.ts +48 -0
- package/dist/surfaceNoise.d.ts.map +1 -0
- package/dist/surfaceNoise.js +245 -0
- package/dist/surfaceNoise.js.map +1 -0
- package/dist/surfacePaletteMap.d.ts +17 -0
- package/dist/surfacePaletteMap.d.ts.map +1 -0
- package/dist/surfacePaletteMap.js +45 -0
- package/dist/surfacePaletteMap.js.map +1 -0
- package/dist/surfacePixel.d.ts +9 -0
- package/dist/surfacePixel.d.ts.map +1 -0
- package/dist/surfacePixel.js +36 -0
- package/dist/surfacePixel.js.map +1 -0
- package/dist/surfacePixelate.d.ts +13 -0
- package/dist/surfacePixelate.d.ts.map +1 -0
- package/dist/surfacePixelate.js +61 -0
- package/dist/surfacePixelate.js.map +1 -0
- package/dist/surfaceQuery.d.ts +13 -0
- package/dist/surfaceQuery.d.ts.map +1 -0
- package/dist/surfaceQuery.js +46 -0
- package/dist/surfaceQuery.js.map +1 -0
- package/dist/surfaceRegion.d.ts +20 -0
- package/dist/surfaceRegion.d.ts.map +1 -0
- package/dist/surfaceRegion.js +28 -0
- package/dist/surfaceRegion.js.map +1 -0
- package/dist/surfaceResize.d.ts +27 -0
- package/dist/surfaceResize.d.ts.map +1 -0
- package/dist/surfaceResize.js +191 -0
- package/dist/surfaceResize.js.map +1 -0
- package/dist/surfaceRotate.d.ts +32 -0
- package/dist/surfaceRotate.d.ts.map +1 -0
- package/dist/surfaceRotate.js +143 -0
- package/dist/surfaceRotate.js.map +1 -0
- package/dist/surfaceShadow.d.ts +107 -0
- package/dist/surfaceShadow.d.ts.map +1 -0
- package/dist/surfaceShadow.js +173 -0
- package/dist/surfaceShadow.js.map +1 -0
- package/dist/surfaceSharpen.d.ts +25 -0
- package/dist/surfaceSharpen.d.ts.map +1 -0
- package/dist/surfaceSharpen.js +47 -0
- package/dist/surfaceSharpen.js.map +1 -0
- package/dist/surfaceTone.d.ts +28 -0
- package/dist/surfaceTone.d.ts.map +1 -0
- package/dist/surfaceTone.js +69 -0
- package/dist/surfaceTone.js.map +1 -0
- package/dist/surfaceTransform.d.ts +40 -0
- package/dist/surfaceTransform.d.ts.map +1 -0
- package/dist/surfaceTransform.js +163 -0
- package/dist/surfaceTransform.js.map +1 -0
- package/dist/surfaceWarp.d.ts +48 -0
- package/dist/surfaceWarp.d.ts.map +1 -0
- package/dist/surfaceWarp.js +284 -0
- package/dist/surfaceWarp.js.map +1 -0
- package/package.json +39 -0
- package/src/surface.test.ts +78 -0
- package/src/surfaceAffine.test.ts +98 -0
- package/src/surfaceAlpha.test.ts +113 -0
- package/src/surfaceBevel.test.ts +67 -0
- package/src/surfaceBlur.test.ts +240 -0
- package/src/surfaceChannel.test.ts +97 -0
- package/src/surfaceColorMatrix.test.ts +220 -0
- package/src/surfaceCompare.test.ts +92 -0
- package/src/surfaceComposite.test.ts +256 -0
- package/src/surfaceConvolution.test.ts +136 -0
- package/src/surfaceCopy.test.ts +54 -0
- package/src/surfaceCoverage.test.ts +39 -0
- package/src/surfaceCrop.test.ts +116 -0
- package/src/surfaceDisplacement.test.ts +142 -0
- package/src/surfaceDissolve.test.ts +99 -0
- package/src/surfaceDraw.test.ts +38 -0
- package/src/surfaceEncode.test.ts +18 -0
- package/src/surfaceFill.test.ts +89 -0
- package/src/surfaceFingerprint.test.ts +103 -0
- package/src/surfaceFlip.test.ts +59 -0
- package/src/surfaceFormat.test.ts +124 -0
- package/src/surfaceFrom.test.ts +62 -0
- package/src/surfaceGradient.test.ts +91 -0
- package/src/surfaceGradientFill.test.ts +107 -0
- package/src/surfaceHistogram.test.ts +70 -0
- package/src/surfaceImageChannel.test.ts +19 -0
- package/src/surfaceMedian.test.ts +45 -0
- package/src/surfaceMorphological.test.ts +75 -0
- package/src/surfaceNoise.test.ts +169 -0
- package/src/surfacePaletteMap.test.ts +55 -0
- package/src/surfacePixel.test.ts +99 -0
- package/src/surfacePixelate.test.ts +46 -0
- package/src/surfaceQuery.test.ts +48 -0
- package/src/surfaceRegion.test.ts +34 -0
- package/src/surfaceResize.test.ts +112 -0
- package/src/surfaceRotate.test.ts +119 -0
- package/src/surfaceShadow.test.ts +165 -0
- package/src/surfaceSharpen.test.ts +50 -0
- package/src/surfaceTone.test.ts +104 -0
- package/src/surfaceTransform.test.ts +134 -0
- package/src/surfaceWarp.test.ts +124 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { blurSurfacePixelsHorizontal, blurSurfacePixelsVertical } from './surfaceBlur';
|
|
2
|
+
/**
|
|
3
|
+
* Produces a bevel mask in `out`: a tinted highlight on the edge facing the
|
|
4
|
+
* light and a shadow on the opposite edge, derived from the directional
|
|
5
|
+
* gradient of the source's blurred alpha.
|
|
6
|
+
*
|
|
7
|
+
* The edge gradient is `m(p - L) - m(p + L)` where `m` is the blurred alpha and
|
|
8
|
+
* `L = (cos(angle), sin(angle)) * distance`. A positive gradient (edge facing the
|
|
9
|
+
* light) draws the highlight color; a negative gradient draws the shadow color.
|
|
10
|
+
*
|
|
11
|
+
* `type` clips the result: 'inner' keeps it inside the shape, 'outer' outside,
|
|
12
|
+
* 'both' applies no clipping.
|
|
13
|
+
*
|
|
14
|
+
* To complete the effect, composite `out` over the original source.
|
|
15
|
+
*
|
|
16
|
+
* `scratch` must be at least `source.width * source.height * 4` bytes; it must
|
|
17
|
+
* be a distinct buffer from `out` (the blurred alpha is sampled while `out` is
|
|
18
|
+
* written). Its contents are undefined after the call.
|
|
19
|
+
*
|
|
20
|
+
* `out` must NOT alias `source.surface.data`: `out` is used as the blur scratch,
|
|
21
|
+
* and the source alpha is read again afterward for `inner`/`outer` clipping.
|
|
22
|
+
*/
|
|
23
|
+
export function bevelSurface(out, scratch, source, options = {}) {
|
|
24
|
+
const w = source.width;
|
|
25
|
+
const h = source.height;
|
|
26
|
+
const angle = options.angle ?? Math.PI / 4;
|
|
27
|
+
const distance = options.distance ?? 4;
|
|
28
|
+
const offsetX = Math.round(Math.cos(angle) * distance);
|
|
29
|
+
const offsetY = Math.round(Math.sin(angle) * distance);
|
|
30
|
+
const type = options.type ?? 'inner';
|
|
31
|
+
const intensity = options.intensity ?? 1;
|
|
32
|
+
const highlightColor = options.highlightColor ?? 0xffffffff;
|
|
33
|
+
const shadowColor = options.shadowColor ?? 0x000000ff;
|
|
34
|
+
// Build the blurred alpha field `m` in scratch, using out as ping-pong buffer.
|
|
35
|
+
for (let py = 0; py < h; py++) {
|
|
36
|
+
for (let px = 0; px < w; px++) {
|
|
37
|
+
const di = (py * w + px) * 4;
|
|
38
|
+
scratch[di] = 0;
|
|
39
|
+
scratch[di + 1] = 0;
|
|
40
|
+
scratch[di + 2] = 0;
|
|
41
|
+
scratch[di + 3] = readSourceAlpha(source, px, py);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
blurField(scratch, out, w, h, options.radiusX, options.radiusY, options.passes);
|
|
45
|
+
for (let py = 0; py < h; py++) {
|
|
46
|
+
for (let px = 0; px < w; px++) {
|
|
47
|
+
const di = (py * w + px) * 4;
|
|
48
|
+
const lit = sampleField(scratch, w, h, px - offsetX, py - offsetY);
|
|
49
|
+
const shade = sampleField(scratch, w, h, px + offsetX, py + offsetY);
|
|
50
|
+
const gradient = lit - shade;
|
|
51
|
+
const color = gradient >= 0 ? highlightColor : shadowColor;
|
|
52
|
+
const colorAlpha = (color & 0xff) / 255;
|
|
53
|
+
const clip = type === 'inner'
|
|
54
|
+
? readSourceAlpha(source, px, py) / 255
|
|
55
|
+
: type === 'outer'
|
|
56
|
+
? 1 - readSourceAlpha(source, px, py) / 255
|
|
57
|
+
: 1;
|
|
58
|
+
const edgeIntensity = Math.min(1, Math.abs(gradient) * intensity);
|
|
59
|
+
out[di] = (color >>> 24) & 0xff;
|
|
60
|
+
out[di + 1] = (color >> 16) & 0xff;
|
|
61
|
+
out[di + 2] = (color >> 8) & 0xff;
|
|
62
|
+
out[di + 3] = Math.round(edgeIntensity * colorAlpha * clip * 255);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function blurField(field, scratch, w, h, radiusX, radiusY, passes) {
|
|
67
|
+
const rx = Math.max(0, Math.round(radiusX ?? 2));
|
|
68
|
+
const ry = Math.max(0, Math.round(radiusY ?? 2));
|
|
69
|
+
const p = Math.max(1, Math.round(passes ?? 1));
|
|
70
|
+
let a = field;
|
|
71
|
+
let b = scratch;
|
|
72
|
+
for (let pass = 0; pass < p; pass++) {
|
|
73
|
+
if (rx > 0) {
|
|
74
|
+
blurSurfacePixelsHorizontal(b, a, w, h, rx);
|
|
75
|
+
const t = a;
|
|
76
|
+
a = b;
|
|
77
|
+
b = t;
|
|
78
|
+
}
|
|
79
|
+
if (ry > 0) {
|
|
80
|
+
blurSurfacePixelsVertical(b, a, w, h, ry);
|
|
81
|
+
const t = a;
|
|
82
|
+
a = b;
|
|
83
|
+
b = t;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (a !== field)
|
|
87
|
+
field.set(a.subarray(0, w * h * 4));
|
|
88
|
+
}
|
|
89
|
+
function readSourceAlpha(source, px, py) {
|
|
90
|
+
const sx = source.x + px;
|
|
91
|
+
const sy = source.y + py;
|
|
92
|
+
if (sx < 0 || sx >= source.surface.width || sy < 0 || sy >= source.surface.height)
|
|
93
|
+
return 0;
|
|
94
|
+
return source.surface.data[(sy * source.surface.width + sx) * 4 + 3];
|
|
95
|
+
}
|
|
96
|
+
// Returns the blurred alpha at (x, y) normalized to 0..1; 0 outside the field.
|
|
97
|
+
function sampleField(field, w, h, x, y) {
|
|
98
|
+
if (x < 0 || x >= w || y < 0 || y >= h)
|
|
99
|
+
return 0;
|
|
100
|
+
return field[(y * w + x) * 4 + 3] / 255;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=surfaceBevel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfaceBevel.js","sourceRoot":"","sources":["../src/surfaceBevel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAsBvF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAsB,EACtB,OAA0B,EAC1B,MAA+B,EAC/B,UAAyC,EAAE;IAE3C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,UAAU,CAAC;IAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC;IAEtD,+EAA+E;IAC/E,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC;YAE7B,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;YAC3D,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;YACxC,MAAM,IAAI,GACR,IAAI,KAAK,OAAO;gBACd,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG;gBACvC,CAAC,CAAC,IAAI,KAAK,OAAO;oBAChB,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG;oBAC3C,CAAC,CAAC,CAAC,CAAC;YACV,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,CAAC;YAElE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;YAChC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YACnC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;YAClC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,KAAwB,EACxB,OAA0B,EAC1B,CAAS,EACT,CAAS,EACT,OAA2B,EAC3B,OAA2B,EAC3B,MAA0B;IAE1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,IAAI,CAAC,GAAG,OAAO,CAAC;IAChB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,2BAA2B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC,GAAG,CAAC,CAAC;YACN,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;QACD,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACX,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC,GAAG,CAAC,CAAC;YACN,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK,KAAK;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,MAA+B,EAAE,EAAU,EAAE,EAAU;IAC9E,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW,CAAC,KAAwB,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACvF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { SurfaceRegion } from '@flighthq/types';
|
|
2
|
+
export interface SurfaceBoxBlurOptions {
|
|
3
|
+
radiusX?: number;
|
|
4
|
+
radiusY?: number;
|
|
5
|
+
passes?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Single horizontal box blur pass using a sliding-window accumulator — O(n)
|
|
9
|
+
* per row regardless of radius. Reads from `source`, writes to `out`.
|
|
10
|
+
* `out` must not alias `source`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function blurSurfacePixelsHorizontal(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, width: number, height: number, radius: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* Single horizontal weighted blur pass. Kernel weights are applied at each
|
|
15
|
+
* position; `kernel.length` must be odd (2 * radius + 1). Reads from
|
|
16
|
+
* `source`, writes to `out`. `out` must not alias `source`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function blurSurfacePixelsHorizontalWeighted(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, width: number, height: number, kernel: Readonly<Float32Array>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Single vertical box blur pass using a sliding-window accumulator — O(n)
|
|
21
|
+
* per column regardless of radius. Reads from `source`, writes to `out`.
|
|
22
|
+
* `out` must not alias `source`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function blurSurfacePixelsVertical(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, width: number, height: number, radius: number): void;
|
|
25
|
+
/**
|
|
26
|
+
* Single vertical weighted blur pass. Kernel weights are applied at each
|
|
27
|
+
* position; `kernel.length` must be odd (2 * radius + 1). Reads from
|
|
28
|
+
* `source`, writes to `out`. `out` must not alias `source`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function blurSurfacePixelsVerticalWeighted(out: Uint8ClampedArray, source: Readonly<Uint8ClampedArray>, width: number, height: number, kernel: Readonly<Float32Array>): void;
|
|
31
|
+
/**
|
|
32
|
+
* Applies a box blur to `source` and writes the result into `out`.
|
|
33
|
+
* `scratch` is a ping-pong buffer; its contents are undefined after the
|
|
34
|
+
* call. Both must be at least `source.width * source.height * 4` bytes.
|
|
35
|
+
*
|
|
36
|
+
* `radiusX` and `radiusY` are the blur radius in pixels (default 2). `passes`
|
|
37
|
+
* repeats the H+V pass pair (default 1); multiple passes approximate a Gaussian.
|
|
38
|
+
*
|
|
39
|
+
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
40
|
+
* full surface.
|
|
41
|
+
*/
|
|
42
|
+
export declare function boxBlurSurface(out: Uint8ClampedArray, scratch: Uint8ClampedArray, source: Readonly<SurfaceRegion>, options?: Readonly<SurfaceBoxBlurOptions>): void;
|
|
43
|
+
/**
|
|
44
|
+
* Fills `out` with a normalized 1-D Gaussian kernel of length `2 * radius + 1`.
|
|
45
|
+
* `out` must be a `Float32Array` of exactly that length. Caller allocates once
|
|
46
|
+
* and reuses across frames.
|
|
47
|
+
*/
|
|
48
|
+
export declare function computeGaussianKernel(out: Float32Array, radius: number, sigma: number): void;
|
|
49
|
+
/**
|
|
50
|
+
* Applies a Gaussian blur to `source` and writes the result into `out`.
|
|
51
|
+
* `scratch` is a ping-pong buffer; its contents are undefined after the
|
|
52
|
+
* call. Both must be at least `source.width * source.height * 4` bytes.
|
|
53
|
+
*
|
|
54
|
+
* `sigmaX` and `sigmaY` are the standard deviation of the Gaussian (CSS
|
|
55
|
+
* `blur(Xpx)` uses sigma = X). `sigmaY` defaults to `sigmaX`. `passes`
|
|
56
|
+
* repeats the H+V pass pair (default 1).
|
|
57
|
+
*
|
|
58
|
+
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
59
|
+
* full surface.
|
|
60
|
+
*/
|
|
61
|
+
export declare function gaussianBlurSurface(out: Uint8ClampedArray, scratch: Uint8ClampedArray, source: Readonly<SurfaceRegion>, sigmaX: number, sigmaY?: number, passes?: number): void;
|
|
62
|
+
//# sourceMappingURL=surfaceBlur.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfaceBlur.d.ts","sourceRoot":"","sources":["../src/surfaceBlur.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CA2CN;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAwBN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,IAAI,CA0CN;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAwBN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,OAAO,GAAE,QAAQ,CAAC,qBAAqB,CAAM,GAC5C,IAAI,CA4BN;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAmB5F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAe,EACvB,MAAM,GAAE,MAAU,GACjB,IAAI,CAiCN"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { extractSurfacePixels } from './surfaceComposite';
|
|
2
|
+
/**
|
|
3
|
+
* Single horizontal box blur pass using a sliding-window accumulator — O(n)
|
|
4
|
+
* per row regardless of radius. Reads from `source`, writes to `out`.
|
|
5
|
+
* `out` must not alias `source`.
|
|
6
|
+
*/
|
|
7
|
+
export function blurSurfacePixelsHorizontal(out, source, width, height, radius) {
|
|
8
|
+
for (let y = 0; y < height; y++) {
|
|
9
|
+
const rowOffset = y * width;
|
|
10
|
+
let r = 0;
|
|
11
|
+
let g = 0;
|
|
12
|
+
let b = 0;
|
|
13
|
+
let a = 0;
|
|
14
|
+
let count = 0;
|
|
15
|
+
const initEnd = Math.min(radius + 1, width);
|
|
16
|
+
for (let x = 0; x < initEnd; x++) {
|
|
17
|
+
const i = (rowOffset + x) * 4;
|
|
18
|
+
r += source[i];
|
|
19
|
+
g += source[i + 1];
|
|
20
|
+
b += source[i + 2];
|
|
21
|
+
a += source[i + 3];
|
|
22
|
+
count++;
|
|
23
|
+
}
|
|
24
|
+
for (let x = 0; x < width; x++) {
|
|
25
|
+
const di = (rowOffset + x) * 4;
|
|
26
|
+
out[di] = Math.round(r / count);
|
|
27
|
+
out[di + 1] = Math.round(g / count);
|
|
28
|
+
out[di + 2] = Math.round(b / count);
|
|
29
|
+
out[di + 3] = Math.round(a / count);
|
|
30
|
+
const leaving = x - radius;
|
|
31
|
+
if (leaving >= 0) {
|
|
32
|
+
const li = (rowOffset + leaving) * 4;
|
|
33
|
+
r -= source[li];
|
|
34
|
+
g -= source[li + 1];
|
|
35
|
+
b -= source[li + 2];
|
|
36
|
+
a -= source[li + 3];
|
|
37
|
+
count--;
|
|
38
|
+
}
|
|
39
|
+
const entering = x + radius + 1;
|
|
40
|
+
if (entering < width) {
|
|
41
|
+
const ei = (rowOffset + entering) * 4;
|
|
42
|
+
r += source[ei];
|
|
43
|
+
g += source[ei + 1];
|
|
44
|
+
b += source[ei + 2];
|
|
45
|
+
a += source[ei + 3];
|
|
46
|
+
count++;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Single horizontal weighted blur pass. Kernel weights are applied at each
|
|
53
|
+
* position; `kernel.length` must be odd (2 * radius + 1). Reads from
|
|
54
|
+
* `source`, writes to `out`. `out` must not alias `source`.
|
|
55
|
+
*/
|
|
56
|
+
export function blurSurfacePixelsHorizontalWeighted(out, source, width, height, kernel) {
|
|
57
|
+
const radius = (kernel.length - 1) >> 1;
|
|
58
|
+
for (let y = 0; y < height; y++) {
|
|
59
|
+
for (let x = 0; x < width; x++) {
|
|
60
|
+
let r = 0;
|
|
61
|
+
let g = 0;
|
|
62
|
+
let b = 0;
|
|
63
|
+
let a = 0;
|
|
64
|
+
for (let k = 0; k < kernel.length; k++) {
|
|
65
|
+
const px = Math.max(0, Math.min(width - 1, x + k - radius));
|
|
66
|
+
const i = (y * width + px) * 4;
|
|
67
|
+
const w = kernel[k];
|
|
68
|
+
r += source[i] * w;
|
|
69
|
+
g += source[i + 1] * w;
|
|
70
|
+
b += source[i + 2] * w;
|
|
71
|
+
a += source[i + 3] * w;
|
|
72
|
+
}
|
|
73
|
+
const di = (y * width + x) * 4;
|
|
74
|
+
out[di] = Math.round(r);
|
|
75
|
+
out[di + 1] = Math.round(g);
|
|
76
|
+
out[di + 2] = Math.round(b);
|
|
77
|
+
out[di + 3] = Math.round(a);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Single vertical box blur pass using a sliding-window accumulator — O(n)
|
|
83
|
+
* per column regardless of radius. Reads from `source`, writes to `out`.
|
|
84
|
+
* `out` must not alias `source`.
|
|
85
|
+
*/
|
|
86
|
+
export function blurSurfacePixelsVertical(out, source, width, height, radius) {
|
|
87
|
+
for (let x = 0; x < width; x++) {
|
|
88
|
+
let r = 0;
|
|
89
|
+
let g = 0;
|
|
90
|
+
let b = 0;
|
|
91
|
+
let a = 0;
|
|
92
|
+
let count = 0;
|
|
93
|
+
const initEnd = Math.min(radius + 1, height);
|
|
94
|
+
for (let y = 0; y < initEnd; y++) {
|
|
95
|
+
const i = (y * width + x) * 4;
|
|
96
|
+
r += source[i];
|
|
97
|
+
g += source[i + 1];
|
|
98
|
+
b += source[i + 2];
|
|
99
|
+
a += source[i + 3];
|
|
100
|
+
count++;
|
|
101
|
+
}
|
|
102
|
+
for (let y = 0; y < height; y++) {
|
|
103
|
+
const di = (y * width + x) * 4;
|
|
104
|
+
out[di] = Math.round(r / count);
|
|
105
|
+
out[di + 1] = Math.round(g / count);
|
|
106
|
+
out[di + 2] = Math.round(b / count);
|
|
107
|
+
out[di + 3] = Math.round(a / count);
|
|
108
|
+
const leaving = y - radius;
|
|
109
|
+
if (leaving >= 0) {
|
|
110
|
+
const li = (leaving * width + x) * 4;
|
|
111
|
+
r -= source[li];
|
|
112
|
+
g -= source[li + 1];
|
|
113
|
+
b -= source[li + 2];
|
|
114
|
+
a -= source[li + 3];
|
|
115
|
+
count--;
|
|
116
|
+
}
|
|
117
|
+
const entering = y + radius + 1;
|
|
118
|
+
if (entering < height) {
|
|
119
|
+
const ei = (entering * width + x) * 4;
|
|
120
|
+
r += source[ei];
|
|
121
|
+
g += source[ei + 1];
|
|
122
|
+
b += source[ei + 2];
|
|
123
|
+
a += source[ei + 3];
|
|
124
|
+
count++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Single vertical weighted blur pass. Kernel weights are applied at each
|
|
131
|
+
* position; `kernel.length` must be odd (2 * radius + 1). Reads from
|
|
132
|
+
* `source`, writes to `out`. `out` must not alias `source`.
|
|
133
|
+
*/
|
|
134
|
+
export function blurSurfacePixelsVerticalWeighted(out, source, width, height, kernel) {
|
|
135
|
+
const radius = (kernel.length - 1) >> 1;
|
|
136
|
+
for (let y = 0; y < height; y++) {
|
|
137
|
+
for (let x = 0; x < width; x++) {
|
|
138
|
+
let r = 0;
|
|
139
|
+
let g = 0;
|
|
140
|
+
let b = 0;
|
|
141
|
+
let a = 0;
|
|
142
|
+
for (let k = 0; k < kernel.length; k++) {
|
|
143
|
+
const py = Math.max(0, Math.min(height - 1, y + k - radius));
|
|
144
|
+
const i = (py * width + x) * 4;
|
|
145
|
+
const w = kernel[k];
|
|
146
|
+
r += source[i] * w;
|
|
147
|
+
g += source[i + 1] * w;
|
|
148
|
+
b += source[i + 2] * w;
|
|
149
|
+
a += source[i + 3] * w;
|
|
150
|
+
}
|
|
151
|
+
const di = (y * width + x) * 4;
|
|
152
|
+
out[di] = Math.round(r);
|
|
153
|
+
out[di + 1] = Math.round(g);
|
|
154
|
+
out[di + 2] = Math.round(b);
|
|
155
|
+
out[di + 3] = Math.round(a);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Applies a box blur to `source` and writes the result into `out`.
|
|
161
|
+
* `scratch` is a ping-pong buffer; its contents are undefined after the
|
|
162
|
+
* call. Both must be at least `source.width * source.height * 4` bytes.
|
|
163
|
+
*
|
|
164
|
+
* `radiusX` and `radiusY` are the blur radius in pixels (default 2). `passes`
|
|
165
|
+
* repeats the H+V pass pair (default 1); multiple passes approximate a Gaussian.
|
|
166
|
+
*
|
|
167
|
+
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
168
|
+
* full surface.
|
|
169
|
+
*/
|
|
170
|
+
export function boxBlurSurface(out, scratch, source, options = {}) {
|
|
171
|
+
const radiusX = Math.max(0, Math.round(options.radiusX ?? 2));
|
|
172
|
+
const radiusY = Math.max(0, Math.round(options.radiusY ?? 2));
|
|
173
|
+
const passes = Math.max(1, Math.round(options.passes ?? 1));
|
|
174
|
+
extractSurfacePixels(out, source);
|
|
175
|
+
let a = out;
|
|
176
|
+
let b = scratch;
|
|
177
|
+
for (let pass = 0; pass < passes; pass++) {
|
|
178
|
+
if (radiusX > 0) {
|
|
179
|
+
blurSurfacePixelsHorizontal(b, a, source.width, source.height, radiusX);
|
|
180
|
+
const t = a;
|
|
181
|
+
a = b;
|
|
182
|
+
b = t;
|
|
183
|
+
}
|
|
184
|
+
if (radiusY > 0) {
|
|
185
|
+
blurSurfacePixelsVertical(b, a, source.width, source.height, radiusY);
|
|
186
|
+
const t = a;
|
|
187
|
+
a = b;
|
|
188
|
+
b = t;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (a !== out) {
|
|
192
|
+
out.set(a.subarray(0, source.width * source.height * 4));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Fills `out` with a normalized 1-D Gaussian kernel of length `2 * radius + 1`.
|
|
197
|
+
* `out` must be a `Float32Array` of exactly that length. Caller allocates once
|
|
198
|
+
* and reuses across frames.
|
|
199
|
+
*/
|
|
200
|
+
export function computeGaussianKernel(out, radius, sigma) {
|
|
201
|
+
const len = 2 * radius + 1;
|
|
202
|
+
// sigma <= 0 has no spread: a unit impulse at the center (an identity blur).
|
|
203
|
+
// Computing exp(-x² / 0) would otherwise fill the kernel with NaN.
|
|
204
|
+
if (sigma <= 0) {
|
|
205
|
+
out.fill(0, 0, len);
|
|
206
|
+
out[radius] = 1;
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
let sum = 0;
|
|
210
|
+
const twoSigmaSq = 2 * sigma * sigma;
|
|
211
|
+
for (let i = 0; i < len; i++) {
|
|
212
|
+
const x = i - radius;
|
|
213
|
+
out[i] = Math.exp(-(x * x) / twoSigmaSq);
|
|
214
|
+
sum += out[i];
|
|
215
|
+
}
|
|
216
|
+
for (let i = 0; i < len; i++) {
|
|
217
|
+
out[i] /= sum;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Applies a Gaussian blur to `source` and writes the result into `out`.
|
|
222
|
+
* `scratch` is a ping-pong buffer; its contents are undefined after the
|
|
223
|
+
* call. Both must be at least `source.width * source.height * 4` bytes.
|
|
224
|
+
*
|
|
225
|
+
* `sigmaX` and `sigmaY` are the standard deviation of the Gaussian (CSS
|
|
226
|
+
* `blur(Xpx)` uses sigma = X). `sigmaY` defaults to `sigmaX`. `passes`
|
|
227
|
+
* repeats the H+V pass pair (default 1).
|
|
228
|
+
*
|
|
229
|
+
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
230
|
+
* full surface.
|
|
231
|
+
*/
|
|
232
|
+
export function gaussianBlurSurface(out, scratch, source, sigmaX, sigmaY = sigmaX, passes = 1) {
|
|
233
|
+
const passCount = Math.max(1, Math.round(passes));
|
|
234
|
+
const radiusX = Math.max(0, Math.ceil(sigmaX * 3));
|
|
235
|
+
const radiusY = Math.max(0, Math.ceil(sigmaY * 3));
|
|
236
|
+
const kernelX = radiusX > 0 ? new Float32Array(2 * radiusX + 1) : null;
|
|
237
|
+
const kernelY = radiusY > 0 ? new Float32Array(2 * radiusY + 1) : null;
|
|
238
|
+
if (kernelX)
|
|
239
|
+
computeGaussianKernel(kernelX, radiusX, sigmaX);
|
|
240
|
+
if (kernelY)
|
|
241
|
+
computeGaussianKernel(kernelY, radiusY, sigmaY);
|
|
242
|
+
extractSurfacePixels(out, source);
|
|
243
|
+
let a = out;
|
|
244
|
+
let b = scratch;
|
|
245
|
+
for (let pass = 0; pass < passCount; pass++) {
|
|
246
|
+
if (kernelX) {
|
|
247
|
+
blurSurfacePixelsHorizontalWeighted(b, a, source.width, source.height, kernelX);
|
|
248
|
+
const t = a;
|
|
249
|
+
a = b;
|
|
250
|
+
b = t;
|
|
251
|
+
}
|
|
252
|
+
if (kernelY) {
|
|
253
|
+
blurSurfacePixelsVerticalWeighted(b, a, source.width, source.height, kernelY);
|
|
254
|
+
const t = a;
|
|
255
|
+
a = b;
|
|
256
|
+
b = t;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (a !== out) {
|
|
260
|
+
out.set(a.subarray(0, source.width * source.height * 4));
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=surfaceBlur.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfaceBlur.js","sourceRoot":"","sources":["../src/surfaceBlur.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Surface, SurfaceRegion } from '@flighthq/types';
|
|
2
|
+
/**
|
|
3
|
+
* Merges four single-channel surfaces (or any full-RGBA surfaces) into `out`
|
|
4
|
+
* by taking one channel from each input surface:
|
|
5
|
+
* - `out.R` ← `r.R` (red channel of the red-source surface)
|
|
6
|
+
* - `out.G` ← `g.G`
|
|
7
|
+
* - `out.B` ← `b.B`
|
|
8
|
+
* - `out.A` ← `a.A`
|
|
9
|
+
*
|
|
10
|
+
* All inputs and `out` must have the same dimensions. The copied size is the
|
|
11
|
+
* minimum overlap of all five surfaces. Pixels outside any surface are skipped.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mergeSurfaceChannels(out: Readonly<SurfaceRegion>, r: Readonly<SurfaceRegion>, g: Readonly<SurfaceRegion>, b: Readonly<SurfaceRegion>, a: Readonly<SurfaceRegion>): void;
|
|
14
|
+
/**
|
|
15
|
+
* Splits `source` into four single-channel grayscale surfaces (R, G, B, A).
|
|
16
|
+
* Each output surface is the same dimensions as `source`; each pixel's value
|
|
17
|
+
* is taken from the corresponding channel of the source pixel and written to
|
|
18
|
+
* the R, G, B, and A channels of the output (i.e. a red value of 0xAA produces
|
|
19
|
+
* 0xAAAAAAAA in the R surface).
|
|
20
|
+
*
|
|
21
|
+
* Returns an array of four surfaces in RGBA order: `[r, g, b, a]`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function splitSurfaceChannels(source: Readonly<Surface>): [Surface, Surface, Surface, Surface];
|
|
24
|
+
//# sourceMappingURL=surfaceChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfaceChannel.d.ts","sourceRoot":"","sources":["../src/surfaceChannel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC5B,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC1B,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC1B,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC1B,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,GACzB,IAAI,CAsDN;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAuCpG"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { invalidateImageResource } from '@flighthq/image';
|
|
3
|
+
/**
|
|
4
|
+
* Merges four single-channel surfaces (or any full-RGBA surfaces) into `out`
|
|
5
|
+
* by taking one channel from each input surface:
|
|
6
|
+
* - `out.R` ← `r.R` (red channel of the red-source surface)
|
|
7
|
+
* - `out.G` ← `g.G`
|
|
8
|
+
* - `out.B` ← `b.B`
|
|
9
|
+
* - `out.A` ← `a.A`
|
|
10
|
+
*
|
|
11
|
+
* All inputs and `out` must have the same dimensions. The copied size is the
|
|
12
|
+
* minimum overlap of all five surfaces. Pixels outside any surface are skipped.
|
|
13
|
+
*/
|
|
14
|
+
export function mergeSurfaceChannels(out, r, g, b, a) {
|
|
15
|
+
const w = Math.min(out.width, r.width, g.width, b.width, a.width);
|
|
16
|
+
const h = Math.min(out.height, r.height, g.height, b.height, a.height);
|
|
17
|
+
const od = out.surface.data;
|
|
18
|
+
const rd = r.surface.data;
|
|
19
|
+
const gd = g.surface.data;
|
|
20
|
+
const bd = b.surface.data;
|
|
21
|
+
const ad = a.surface.data;
|
|
22
|
+
for (let py = 0; py < h; py++) {
|
|
23
|
+
const oy = out.y + py;
|
|
24
|
+
const ry = r.y + py;
|
|
25
|
+
const gy = g.y + py;
|
|
26
|
+
const by = b.y + py;
|
|
27
|
+
const ay = a.y + py;
|
|
28
|
+
if (oy < 0 ||
|
|
29
|
+
oy >= out.surface.height ||
|
|
30
|
+
ry < 0 ||
|
|
31
|
+
ry >= r.surface.height ||
|
|
32
|
+
gy < 0 ||
|
|
33
|
+
gy >= g.surface.height ||
|
|
34
|
+
by < 0 ||
|
|
35
|
+
by >= b.surface.height ||
|
|
36
|
+
ay < 0 ||
|
|
37
|
+
ay >= a.surface.height)
|
|
38
|
+
continue;
|
|
39
|
+
for (let px = 0; px < w; px++) {
|
|
40
|
+
const ox = out.x + px;
|
|
41
|
+
const rx = r.x + px;
|
|
42
|
+
const gx = g.x + px;
|
|
43
|
+
const bx = b.x + px;
|
|
44
|
+
const ax = a.x + px;
|
|
45
|
+
if (ox < 0 ||
|
|
46
|
+
ox >= out.surface.width ||
|
|
47
|
+
rx < 0 ||
|
|
48
|
+
rx >= r.surface.width ||
|
|
49
|
+
gx < 0 ||
|
|
50
|
+
gx >= g.surface.width ||
|
|
51
|
+
bx < 0 ||
|
|
52
|
+
bx >= b.surface.width ||
|
|
53
|
+
ax < 0 ||
|
|
54
|
+
ax >= a.surface.width)
|
|
55
|
+
continue;
|
|
56
|
+
const di = (oy * out.surface.width + ox) * 4;
|
|
57
|
+
od[di] = rd[(ry * r.surface.width + rx) * 4];
|
|
58
|
+
od[di + 1] = gd[(gy * g.surface.width + gx) * 4 + 1];
|
|
59
|
+
od[di + 2] = bd[(by * b.surface.width + bx) * 4 + 2];
|
|
60
|
+
od[di + 3] = ad[(ay * a.surface.width + ax) * 4 + 3];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
invalidateImageResource(out.surface);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Splits `source` into four single-channel grayscale surfaces (R, G, B, A).
|
|
67
|
+
* Each output surface is the same dimensions as `source`; each pixel's value
|
|
68
|
+
* is taken from the corresponding channel of the source pixel and written to
|
|
69
|
+
* the R, G, B, and A channels of the output (i.e. a red value of 0xAA produces
|
|
70
|
+
* 0xAAAAAAAA in the R surface).
|
|
71
|
+
*
|
|
72
|
+
* Returns an array of four surfaces in RGBA order: `[r, g, b, a]`.
|
|
73
|
+
*/
|
|
74
|
+
export function splitSurfaceChannels(source) {
|
|
75
|
+
const w = source.width;
|
|
76
|
+
const h = source.height;
|
|
77
|
+
const sd = source.data;
|
|
78
|
+
const rData = new Uint8ClampedArray(w * h * 4);
|
|
79
|
+
const gData = new Uint8ClampedArray(w * h * 4);
|
|
80
|
+
const bData = new Uint8ClampedArray(w * h * 4);
|
|
81
|
+
const aData = new Uint8ClampedArray(w * h * 4);
|
|
82
|
+
for (let i = 0; i < w * h; i++) {
|
|
83
|
+
const si = i * 4;
|
|
84
|
+
const r = sd[si];
|
|
85
|
+
const g = sd[si + 1];
|
|
86
|
+
const b = sd[si + 2];
|
|
87
|
+
const a = sd[si + 3];
|
|
88
|
+
rData[si] = r;
|
|
89
|
+
rData[si + 1] = r;
|
|
90
|
+
rData[si + 2] = r;
|
|
91
|
+
rData[si + 3] = 0xff;
|
|
92
|
+
gData[si] = g;
|
|
93
|
+
gData[si + 1] = g;
|
|
94
|
+
gData[si + 2] = g;
|
|
95
|
+
gData[si + 3] = 0xff;
|
|
96
|
+
bData[si] = b;
|
|
97
|
+
bData[si + 1] = b;
|
|
98
|
+
bData[si + 2] = b;
|
|
99
|
+
bData[si + 3] = 0xff;
|
|
100
|
+
aData[si] = a;
|
|
101
|
+
aData[si + 1] = a;
|
|
102
|
+
aData[si + 2] = a;
|
|
103
|
+
// Store the alpha value in the A channel position so round-trip
|
|
104
|
+
// split → merge restores the original alpha.
|
|
105
|
+
aData[si + 3] = a;
|
|
106
|
+
}
|
|
107
|
+
return [
|
|
108
|
+
makeSurface(rData, w, h, source),
|
|
109
|
+
makeSurface(gData, w, h, source),
|
|
110
|
+
makeSurface(bData, w, h, source),
|
|
111
|
+
makeSurface(aData, w, h, source),
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
function makeSurface(data, width, height, source) {
|
|
115
|
+
return createEntity({
|
|
116
|
+
alphaType: source.alphaType,
|
|
117
|
+
colorSpace: source.colorSpace,
|
|
118
|
+
data,
|
|
119
|
+
format: source.format,
|
|
120
|
+
height,
|
|
121
|
+
source: null,
|
|
122
|
+
version: 0,
|
|
123
|
+
width,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=surfaceChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surfaceChannel.js","sourceRoot":"","sources":["../src/surfaceChannel.ts"],"names":[],"mappings":"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"}
|