@flighthq/surface 0.3.0-next.906.07cea63 → 0.5.1-edge.1467.7e2fc7d
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/LICENSE.md +9 -0
- package/README.md +17 -0
- package/dist/canvasSurface.d.ts +5 -0
- package/dist/canvasSurface.d.ts.map +1 -0
- package/dist/canvasSurface.js +24 -0
- package/dist/canvasSurface.js.map +1 -0
- package/dist/contract.d.ts +4 -40
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +4 -40
- package/dist/contract.js.map +1 -1
- package/dist/glSurface.d.ts +5 -0
- package/dist/glSurface.d.ts.map +1 -0
- package/dist/glSurface.js +29 -0
- package/dist/glSurface.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/surface.d.ts +4 -15
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +18 -82
- package/dist/surface.js.map +1 -1
- package/dist/surfaceDisplay.d.ts +4 -0
- package/dist/surfaceDisplay.d.ts.map +1 -0
- package/dist/surfaceDisplay.js +11 -0
- package/dist/surfaceDisplay.js.map +1 -0
- package/dist/wgpuSurface.d.ts +5 -0
- package/dist/wgpuSurface.d.ts.map +1 -0
- package/dist/wgpuSurface.js +30 -0
- package/dist/wgpuSurface.js.map +1 -0
- package/package.json +6 -5
- package/src/canvasSurface.test.ts +68 -0
- package/src/glSurface.test.ts +99 -0
- package/src/surface.test.ts +32 -63
- package/src/surfaceDisplay.test.ts +45 -0
- package/src/wgpuSurface.test.ts +74 -0
- package/dist/surfaceAffine.d.ts +0 -27
- package/dist/surfaceAffine.d.ts.map +0 -1
- package/dist/surfaceAffine.js +0 -159
- package/dist/surfaceAffine.js.map +0 -1
- package/dist/surfaceAlpha.d.ts +0 -27
- package/dist/surfaceAlpha.d.ts.map +0 -1
- package/dist/surfaceAlpha.js +0 -83
- package/dist/surfaceAlpha.js.map +0 -1
- package/dist/surfaceBevel.d.ts +0 -24
- package/dist/surfaceBevel.d.ts.map +0 -1
- package/dist/surfaceBevel.js +0 -102
- package/dist/surfaceBevel.js.map +0 -1
- package/dist/surfaceBlur.d.ts +0 -57
- package/dist/surfaceBlur.d.ts.map +0 -1
- package/dist/surfaceBlur.js +0 -263
- package/dist/surfaceBlur.js.map +0 -1
- package/dist/surfaceChannel.d.ts +0 -24
- package/dist/surfaceChannel.d.ts.map +0 -1
- package/dist/surfaceChannel.js +0 -127
- package/dist/surfaceChannel.js.map +0 -1
- package/dist/surfaceColorMatrix.d.ts +0 -57
- package/dist/surfaceColorMatrix.d.ts.map +0 -1
- package/dist/surfaceColorMatrix.js +0 -127
- package/dist/surfaceColorMatrix.js.map +0 -1
- package/dist/surfaceCompare.d.ts +0 -18
- package/dist/surfaceCompare.d.ts.map +0 -1
- package/dist/surfaceCompare.js +0 -64
- package/dist/surfaceCompare.js.map +0 -1
- package/dist/surfaceComposite.d.ts +0 -54
- package/dist/surfaceComposite.d.ts.map +0 -1
- package/dist/surfaceComposite.js +0 -262
- package/dist/surfaceComposite.js.map +0 -1
- package/dist/surfaceConvolution.d.ts +0 -17
- package/dist/surfaceConvolution.d.ts.map +0 -1
- package/dist/surfaceConvolution.js +0 -103
- package/dist/surfaceConvolution.js.map +0 -1
- package/dist/surfaceCopy.d.ts +0 -23
- package/dist/surfaceCopy.d.ts.map +0 -1
- package/dist/surfaceCopy.js +0 -78
- package/dist/surfaceCopy.js.map +0 -1
- package/dist/surfaceCoverage.d.ts +0 -11
- package/dist/surfaceCoverage.d.ts.map +0 -1
- package/dist/surfaceCoverage.js +0 -29
- package/dist/surfaceCoverage.js.map +0 -1
- package/dist/surfaceCrop.d.ts +0 -33
- package/dist/surfaceCrop.d.ts.map +0 -1
- package/dist/surfaceCrop.js +0 -177
- package/dist/surfaceCrop.js.map +0 -1
- package/dist/surfaceDisplacement.d.ts +0 -22
- package/dist/surfaceDisplacement.d.ts.map +0 -1
- package/dist/surfaceDisplacement.js +0 -131
- package/dist/surfaceDisplacement.js.map +0 -1
- package/dist/surfaceDissolve.d.ts +0 -21
- package/dist/surfaceDissolve.d.ts.map +0 -1
- package/dist/surfaceDissolve.js +0 -97
- package/dist/surfaceDissolve.js.map +0 -1
- package/dist/surfaceDraw.d.ts +0 -8
- package/dist/surfaceDraw.d.ts.map +0 -1
- package/dist/surfaceDraw.js +0 -14
- package/dist/surfaceDraw.js.map +0 -1
- package/dist/surfaceEncode.d.ts +0 -3
- package/dist/surfaceEncode.d.ts.map +0 -1
- package/dist/surfaceEncode.js +0 -18
- package/dist/surfaceEncode.js.map +0 -1
- package/dist/surfaceFill.d.ts +0 -12
- package/dist/surfaceFill.d.ts.map +0 -1
- package/dist/surfaceFill.js +0 -85
- package/dist/surfaceFill.js.map +0 -1
- package/dist/surfaceFingerprint.d.ts +0 -26
- package/dist/surfaceFingerprint.d.ts.map +0 -1
- package/dist/surfaceFingerprint.js +0 -99
- package/dist/surfaceFingerprint.js.map +0 -1
- package/dist/surfaceFlip.d.ts +0 -16
- package/dist/surfaceFlip.d.ts.map +0 -1
- package/dist/surfaceFlip.js +0 -98
- package/dist/surfaceFlip.js.map +0 -1
- package/dist/surfaceFormat.d.ts +0 -26
- package/dist/surfaceFormat.d.ts.map +0 -1
- package/dist/surfaceFormat.js +0 -80
- package/dist/surfaceFormat.js.map +0 -1
- package/dist/surfaceFrom.d.ts +0 -14
- package/dist/surfaceFrom.d.ts.map +0 -1
- package/dist/surfaceFrom.js +0 -91
- package/dist/surfaceFrom.js.map +0 -1
- package/dist/surfaceGradient.d.ts +0 -36
- package/dist/surfaceGradient.d.ts.map +0 -1
- package/dist/surfaceGradient.js +0 -176
- package/dist/surfaceGradient.js.map +0 -1
- package/dist/surfaceGradientFill.d.ts +0 -32
- package/dist/surfaceGradientFill.d.ts.map +0 -1
- package/dist/surfaceGradientFill.js +0 -120
- package/dist/surfaceGradientFill.js.map +0 -1
- package/dist/surfaceHistogram.d.ts +0 -20
- package/dist/surfaceHistogram.d.ts.map +0 -1
- package/dist/surfaceHistogram.js +0 -61
- package/dist/surfaceHistogram.js.map +0 -1
- package/dist/surfaceImageChannel.d.ts +0 -2
- package/dist/surfaceImageChannel.d.ts.map +0 -1
- package/dist/surfaceImageChannel.js +0 -2
- package/dist/surfaceImageChannel.js.map +0 -1
- package/dist/surfaceMedian.d.ts +0 -14
- package/dist/surfaceMedian.d.ts.map +0 -1
- package/dist/surfaceMedian.js +0 -77
- package/dist/surfaceMedian.js.map +0 -1
- package/dist/surfaceMorphological.d.ts +0 -29
- package/dist/surfaceMorphological.d.ts.map +0 -1
- package/dist/surfaceMorphological.js +0 -81
- package/dist/surfaceMorphological.js.map +0 -1
- package/dist/surfaceNoise.d.ts +0 -48
- package/dist/surfaceNoise.d.ts.map +0 -1
- package/dist/surfaceNoise.js +0 -245
- package/dist/surfaceNoise.js.map +0 -1
- package/dist/surfacePaletteMap.d.ts +0 -17
- package/dist/surfacePaletteMap.d.ts.map +0 -1
- package/dist/surfacePaletteMap.js +0 -45
- package/dist/surfacePaletteMap.js.map +0 -1
- package/dist/surfacePixel.d.ts +0 -9
- package/dist/surfacePixel.d.ts.map +0 -1
- package/dist/surfacePixel.js +0 -36
- package/dist/surfacePixel.js.map +0 -1
- package/dist/surfacePixelate.d.ts +0 -13
- package/dist/surfacePixelate.d.ts.map +0 -1
- package/dist/surfacePixelate.js +0 -61
- package/dist/surfacePixelate.js.map +0 -1
- package/dist/surfaceQuery.d.ts +0 -13
- package/dist/surfaceQuery.d.ts.map +0 -1
- package/dist/surfaceQuery.js +0 -46
- package/dist/surfaceQuery.js.map +0 -1
- package/dist/surfaceRegion.d.ts +0 -20
- package/dist/surfaceRegion.d.ts.map +0 -1
- package/dist/surfaceRegion.js +0 -28
- package/dist/surfaceRegion.js.map +0 -1
- package/dist/surfaceResize.d.ts +0 -17
- package/dist/surfaceResize.d.ts.map +0 -1
- package/dist/surfaceResize.js +0 -191
- package/dist/surfaceResize.js.map +0 -1
- package/dist/surfaceRotate.d.ts +0 -32
- package/dist/surfaceRotate.d.ts.map +0 -1
- package/dist/surfaceRotate.js +0 -143
- package/dist/surfaceRotate.js.map +0 -1
- package/dist/surfaceShadow.d.ts +0 -72
- package/dist/surfaceShadow.d.ts.map +0 -1
- package/dist/surfaceShadow.js +0 -175
- package/dist/surfaceShadow.js.map +0 -1
- package/dist/surfaceSharpen.d.ts +0 -16
- package/dist/surfaceSharpen.d.ts.map +0 -1
- package/dist/surfaceSharpen.js +0 -47
- package/dist/surfaceSharpen.js.map +0 -1
- package/dist/surfaceTone.d.ts +0 -28
- package/dist/surfaceTone.d.ts.map +0 -1
- package/dist/surfaceTone.js +0 -69
- package/dist/surfaceTone.js.map +0 -1
- package/dist/surfaceTransform.d.ts +0 -40
- package/dist/surfaceTransform.d.ts.map +0 -1
- package/dist/surfaceTransform.js +0 -163
- package/dist/surfaceTransform.js.map +0 -1
- package/dist/surfaceWarp.d.ts +0 -48
- package/dist/surfaceWarp.d.ts.map +0 -1
- package/dist/surfaceWarp.js +0 -284
- package/dist/surfaceWarp.js.map +0 -1
- package/src/surfaceAffine.test.ts +0 -98
- package/src/surfaceAlpha.test.ts +0 -113
- package/src/surfaceBevel.test.ts +0 -67
- package/src/surfaceBlur.test.ts +0 -240
- package/src/surfaceChannel.test.ts +0 -97
- package/src/surfaceColorMatrix.test.ts +0 -220
- package/src/surfaceCompare.test.ts +0 -92
- package/src/surfaceComposite.test.ts +0 -265
- package/src/surfaceConvolution.test.ts +0 -136
- package/src/surfaceCopy.test.ts +0 -54
- package/src/surfaceCoverage.test.ts +0 -39
- package/src/surfaceCrop.test.ts +0 -116
- package/src/surfaceDisplacement.test.ts +0 -142
- package/src/surfaceDissolve.test.ts +0 -99
- package/src/surfaceDraw.test.ts +0 -74
- package/src/surfaceEncode.test.ts +0 -18
- package/src/surfaceFill.test.ts +0 -89
- package/src/surfaceFingerprint.test.ts +0 -103
- package/src/surfaceFlip.test.ts +0 -59
- package/src/surfaceFormat.test.ts +0 -124
- package/src/surfaceFrom.test.ts +0 -62
- package/src/surfaceGradient.test.ts +0 -91
- package/src/surfaceGradientFill.test.ts +0 -107
- package/src/surfaceHistogram.test.ts +0 -70
- package/src/surfaceImageChannel.test.ts +0 -19
- package/src/surfaceMedian.test.ts +0 -45
- package/src/surfaceMorphological.test.ts +0 -75
- package/src/surfaceNoise.test.ts +0 -169
- package/src/surfacePaletteMap.test.ts +0 -55
- package/src/surfacePixel.test.ts +0 -117
- package/src/surfacePixelate.test.ts +0 -46
- package/src/surfaceQuery.test.ts +0 -48
- package/src/surfaceRegion.test.ts +0 -34
- package/src/surfaceResize.test.ts +0 -112
- package/src/surfaceRotate.test.ts +0 -119
- package/src/surfaceShadow.test.ts +0 -165
- package/src/surfaceSharpen.test.ts +0 -50
- package/src/surfaceTone.test.ts +0 -104
- package/src/surfaceTransform.test.ts +0 -134
- package/src/surfaceWarp.test.ts +0 -124
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import type { SurfaceRegion } from '@flighthq/types/contract';
|
|
2
|
-
/**
|
|
3
|
-
* Writes a brightness color matrix into `out` (length 20). Multiplies RGB by
|
|
4
|
-
* `amount` (CSS `brightness()` semantics): 1 is identity, 0 is black, >1 brightens.
|
|
5
|
-
*/
|
|
6
|
-
export declare function buildSurfaceBrightnessColorMatrix(out: number[], amount: number): void;
|
|
7
|
-
/**
|
|
8
|
-
* Writes a contrast color matrix into `out` (length 20). Scales RGB around the
|
|
9
|
-
* midpoint (CSS `contrast()` semantics): 1 is identity, 0 is flat grey, >1 raises
|
|
10
|
-
* contrast.
|
|
11
|
-
*/
|
|
12
|
-
export declare function buildSurfaceContrastColorMatrix(out: number[], amount: number): void;
|
|
13
|
-
/**
|
|
14
|
-
* Writes a grayscale color matrix into `out` (length 20). Equivalent to
|
|
15
|
-
* `buildSurfaceSaturationColorMatrix(out, 0)`; uses the W3C luma coefficients.
|
|
16
|
-
*/
|
|
17
|
-
export declare function buildSurfaceGrayscaleColorMatrix(out: number[]): void;
|
|
18
|
-
/**
|
|
19
|
-
* Writes a hue-rotation color matrix into `out` (length 20). `degrees` rotates
|
|
20
|
-
* hue around the luma axis (CSS `hue-rotate()` semantics, W3C coefficients).
|
|
21
|
-
* 0° is identity; 180° inverts hue; values outside 0..360 wrap naturally.
|
|
22
|
-
*/
|
|
23
|
-
export declare function buildSurfaceHueRotationColorMatrix(out: number[], degrees: number): void;
|
|
24
|
-
/**
|
|
25
|
-
* Writes an invert color matrix into `out` (length 20). Inverts RGB
|
|
26
|
-
* (`255 - channel`); alpha is preserved.
|
|
27
|
-
*/
|
|
28
|
-
export declare function buildSurfaceInvertColorMatrix(out: number[]): void;
|
|
29
|
-
/**
|
|
30
|
-
* Writes a saturation color matrix into `out` (length 20). `amount` is 1 for
|
|
31
|
-
* identity, 0 for grayscale, >1 for oversaturated (CSS `saturate()` semantics,
|
|
32
|
-
* W3C luma coefficients).
|
|
33
|
-
*/
|
|
34
|
-
export declare function buildSurfaceSaturationColorMatrix(out: number[], amount: number): void;
|
|
35
|
-
/**
|
|
36
|
-
* Writes a sepia color matrix into `out` (length 20), matching CSS `sepia(1)`.
|
|
37
|
-
*/
|
|
38
|
-
export declare function buildSurfaceSepiaColorMatrix(out: number[]): void;
|
|
39
|
-
/**
|
|
40
|
-
* Applies a 4×5 color matrix to `source` and writes into `out`.
|
|
41
|
-
* `out` must be at least `source.width * source.height * 4` bytes.
|
|
42
|
-
*
|
|
43
|
-
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
44
|
-
* full surface — each pixel's input channels are read before any channel
|
|
45
|
-
* of that pixel is written.
|
|
46
|
-
*/
|
|
47
|
-
export declare function colorMatrixSurface(out: Uint8ClampedArray, source: Readonly<SurfaceRegion>, matrix: ReadonlyArray<number>): void;
|
|
48
|
-
/**
|
|
49
|
-
* Composes two 4×5 color matrices into `out` (length 20): the result applies
|
|
50
|
-
* `first`, then `second`. `out` must not alias `first` or `second`.
|
|
51
|
-
*/
|
|
52
|
-
export declare function concatSurfaceColorMatrix(out: number[], first: ReadonlyArray<number>, second: ReadonlyArray<number>): void;
|
|
53
|
-
/**
|
|
54
|
-
* Writes the identity color matrix into `out` (length 20).
|
|
55
|
-
*/
|
|
56
|
-
export declare function setSurfaceColorMatrixIdentity(out: number[]): void;
|
|
57
|
-
//# sourceMappingURL=surfaceColorMatrix.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceColorMatrix.d.ts","sourceRoot":"","sources":["../src/surfaceColorMatrix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAK9D;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAErF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGnF;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2BvF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMrF;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,IAAI,CAqBN;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EAAE,EACb,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAEjE"}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// 4×5 color matrices are row-major: 4 rows (R, G, B, A output), each with 5
|
|
2
|
-
// columns (R, G, B, A multipliers + a constant offset in 0..255 units).
|
|
3
|
-
/**
|
|
4
|
-
* Writes a brightness color matrix into `out` (length 20). Multiplies RGB by
|
|
5
|
-
* `amount` (CSS `brightness()` semantics): 1 is identity, 0 is black, >1 brightens.
|
|
6
|
-
*/
|
|
7
|
-
export function buildSurfaceBrightnessColorMatrix(out, amount) {
|
|
8
|
-
setColorMatrix(out, amount, 0, 0, 0, 0, 0, amount, 0, 0, 0, 0, 0, amount, 0, 0, 0, 0, 0, 1, 0);
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Writes a contrast color matrix into `out` (length 20). Scales RGB around the
|
|
12
|
-
* midpoint (CSS `contrast()` semantics): 1 is identity, 0 is flat grey, >1 raises
|
|
13
|
-
* contrast.
|
|
14
|
-
*/
|
|
15
|
-
export function buildSurfaceContrastColorMatrix(out, amount) {
|
|
16
|
-
const t = 127.5 * (1 - amount);
|
|
17
|
-
setColorMatrix(out, amount, 0, 0, 0, t, 0, amount, 0, 0, t, 0, 0, amount, 0, t, 0, 0, 0, 1, 0);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Writes a grayscale color matrix into `out` (length 20). Equivalent to
|
|
21
|
-
* `buildSurfaceSaturationColorMatrix(out, 0)`; uses the W3C luma coefficients.
|
|
22
|
-
*/
|
|
23
|
-
export function buildSurfaceGrayscaleColorMatrix(out) {
|
|
24
|
-
buildSurfaceSaturationColorMatrix(out, 0);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Writes a hue-rotation color matrix into `out` (length 20). `degrees` rotates
|
|
28
|
-
* hue around the luma axis (CSS `hue-rotate()` semantics, W3C coefficients).
|
|
29
|
-
* 0° is identity; 180° inverts hue; values outside 0..360 wrap naturally.
|
|
30
|
-
*/
|
|
31
|
-
export function buildSurfaceHueRotationColorMatrix(out, degrees) {
|
|
32
|
-
const radians = (degrees * Math.PI) / 180;
|
|
33
|
-
const c = Math.cos(radians);
|
|
34
|
-
const s = Math.sin(radians);
|
|
35
|
-
setColorMatrix(out, 0.213 + c * 0.787 - s * 0.213, 0.715 - c * 0.715 - s * 0.715, 0.072 - c * 0.072 + s * 0.928, 0, 0, 0.213 - c * 0.213 + s * 0.143, 0.715 + c * 0.285 + s * 0.14, 0.072 - c * 0.072 - s * 0.283, 0, 0, 0.213 - c * 0.213 - s * 0.787, 0.715 - c * 0.715 + s * 0.715, 0.072 + c * 0.928 + s * 0.072, 0, 0, 0, 0, 0, 1, 0);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Writes an invert color matrix into `out` (length 20). Inverts RGB
|
|
39
|
-
* (`255 - channel`); alpha is preserved.
|
|
40
|
-
*/
|
|
41
|
-
export function buildSurfaceInvertColorMatrix(out) {
|
|
42
|
-
setColorMatrix(out, -1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1, 0);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Writes a saturation color matrix into `out` (length 20). `amount` is 1 for
|
|
46
|
-
* identity, 0 for grayscale, >1 for oversaturated (CSS `saturate()` semantics,
|
|
47
|
-
* W3C luma coefficients).
|
|
48
|
-
*/
|
|
49
|
-
export function buildSurfaceSaturationColorMatrix(out, amount) {
|
|
50
|
-
const inv = 1 - amount;
|
|
51
|
-
const r = LUMA_R * inv;
|
|
52
|
-
const g = LUMA_G * inv;
|
|
53
|
-
const b = LUMA_B * inv;
|
|
54
|
-
setColorMatrix(out, r + amount, g, b, 0, 0, r, g + amount, b, 0, 0, r, g, b + amount, 0, 0, 0, 0, 0, 1, 0);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Writes a sepia color matrix into `out` (length 20), matching CSS `sepia(1)`.
|
|
58
|
-
*/
|
|
59
|
-
export function buildSurfaceSepiaColorMatrix(out) {
|
|
60
|
-
setColorMatrix(out, 0.393, 0.769, 0.189, 0, 0, 0.349, 0.686, 0.168, 0, 0, 0.272, 0.534, 0.131, 0, 0, 0, 0, 0, 1, 0);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Applies a 4×5 color matrix to `source` and writes into `out`.
|
|
64
|
-
* `out` must be at least `source.width * source.height * 4` bytes.
|
|
65
|
-
*
|
|
66
|
-
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
67
|
-
* full surface — each pixel's input channels are read before any channel
|
|
68
|
-
* of that pixel is written.
|
|
69
|
-
*/
|
|
70
|
-
export function colorMatrixSurface(out, source, matrix) {
|
|
71
|
-
if (matrix.length < 20)
|
|
72
|
-
throw new Error('Color matrix filter requires 20 values');
|
|
73
|
-
for (let py = 0; py < source.height; py++) {
|
|
74
|
-
const sourceY = source.y + py;
|
|
75
|
-
if (sourceY < 0 || sourceY >= source.surface.height)
|
|
76
|
-
continue;
|
|
77
|
-
for (let px = 0; px < source.width; px++) {
|
|
78
|
-
const sourceX = source.x + px;
|
|
79
|
-
if (sourceX < 0 || sourceX >= source.surface.width)
|
|
80
|
-
continue;
|
|
81
|
-
const si = (sourceY * source.surface.width + sourceX) * 4;
|
|
82
|
-
const di = (py * source.width + px) * 4;
|
|
83
|
-
const r = source.surface.data[si];
|
|
84
|
-
const g = source.surface.data[si + 1];
|
|
85
|
-
const b = source.surface.data[si + 2];
|
|
86
|
-
const a = source.surface.data[si + 3];
|
|
87
|
-
out[di] = clampByte(r * matrix[0] + g * matrix[1] + b * matrix[2] + a * matrix[3] + matrix[4]);
|
|
88
|
-
out[di + 1] = clampByte(r * matrix[5] + g * matrix[6] + b * matrix[7] + a * matrix[8] + matrix[9]);
|
|
89
|
-
out[di + 2] = clampByte(r * matrix[10] + g * matrix[11] + b * matrix[12] + a * matrix[13] + matrix[14]);
|
|
90
|
-
out[di + 3] = clampByte(r * matrix[15] + g * matrix[16] + b * matrix[17] + a * matrix[18] + matrix[19]);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Composes two 4×5 color matrices into `out` (length 20): the result applies
|
|
96
|
-
* `first`, then `second`. `out` must not alias `first` or `second`.
|
|
97
|
-
*/
|
|
98
|
-
export function concatSurfaceColorMatrix(out, first, second) {
|
|
99
|
-
for (let row = 0; row < 4; row++) {
|
|
100
|
-
for (let col = 0; col < 5; col++) {
|
|
101
|
-
let sum = col === 4 ? second[row * 5 + 4] : 0;
|
|
102
|
-
for (let k = 0; k < 4; k++) {
|
|
103
|
-
sum += second[row * 5 + k] * (col === 4 ? first[k * 5 + 4] : first[k * 5 + col]);
|
|
104
|
-
}
|
|
105
|
-
out[row * 5 + col] = sum;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Writes the identity color matrix into `out` (length 20).
|
|
111
|
-
*/
|
|
112
|
-
export function setSurfaceColorMatrixIdentity(out) {
|
|
113
|
-
setColorMatrix(out, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
|
|
114
|
-
}
|
|
115
|
-
// W3C luma coefficients (matching CSS saturate/grayscale), so the CPU result
|
|
116
|
-
// agrees with the eventual CSS filter backend.
|
|
117
|
-
const LUMA_R = 0.213;
|
|
118
|
-
const LUMA_G = 0.715;
|
|
119
|
-
const LUMA_B = 0.072;
|
|
120
|
-
function clampByte(value) {
|
|
121
|
-
return Math.max(0, Math.min(255, Math.round(value)));
|
|
122
|
-
}
|
|
123
|
-
function setColorMatrix(out, ...values) {
|
|
124
|
-
for (let i = 0; i < 20; i++)
|
|
125
|
-
out[i] = values[i];
|
|
126
|
-
}
|
|
127
|
-
//# sourceMappingURL=surfaceColorMatrix.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceColorMatrix.js","sourceRoot":"","sources":["../src/surfaceColorMatrix.ts"],"names":[],"mappings":"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"}
|
package/dist/surfaceCompare.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Surface, SurfaceMismatch } from '@flighthq/types/contract';
|
|
2
|
-
/**
|
|
3
|
-
* Compares two surfaces pixel by pixel. Returns `null` if they are identical,
|
|
4
|
-
* or a new Surface showing per-channel absolute differences (with alpha set to
|
|
5
|
-
* 255 wherever any channel differs). Throws if the surfaces have different
|
|
6
|
-
* dimensions — comparing incompatible surfaces is a programmer error.
|
|
7
|
-
*/
|
|
8
|
-
export declare function compareSurface(source: Readonly<Surface>, other: Readonly<Surface>): Surface | null;
|
|
9
|
-
/**
|
|
10
|
-
* Compares two equally sized surfaces with a per-channel tolerance and returns summary metrics rather
|
|
11
|
-
* than a diff image. A pixel is "mismatched" when its largest RGBA channel difference exceeds
|
|
12
|
-
* `channelTolerance` (0..255). Use a small tolerance plus a `fraction` threshold to assert that two
|
|
13
|
-
* backends rendered the same scene (cross-backend differential) or that a render still matches a prior
|
|
14
|
-
* one, while ignoring antialiasing noise. Throws if the surfaces differ in size — comparing
|
|
15
|
-
* incompatible surfaces is a programmer error (mirrors compareSurface).
|
|
16
|
-
*/
|
|
17
|
-
export declare function getSurfaceMismatch(source: Readonly<Surface>, other: Readonly<Surface>, channelTolerance?: number): SurfaceMismatch;
|
|
18
|
-
//# sourceMappingURL=surfaceCompare.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceCompare.d.ts","sourceRoot":"","sources":["../src/surfaceCompare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAIzE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,CAyBlG;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EACzB,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,gBAAgB,GAAE,MAAU,GAC3B,eAAe,CA6BjB"}
|
package/dist/surfaceCompare.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { createSurface } from './surface';
|
|
2
|
-
/**
|
|
3
|
-
* Compares two surfaces pixel by pixel. Returns `null` if they are identical,
|
|
4
|
-
* or a new Surface showing per-channel absolute differences (with alpha set to
|
|
5
|
-
* 255 wherever any channel differs). Throws if the surfaces have different
|
|
6
|
-
* dimensions — comparing incompatible surfaces is a programmer error.
|
|
7
|
-
*/
|
|
8
|
-
export function compareSurface(source, other) {
|
|
9
|
-
if (source.width !== other.width || source.height !== other.height) {
|
|
10
|
-
throw new Error(`compareSurface: surface dimensions do not match (${source.width}×${source.height} vs ${other.width}×${other.height})`);
|
|
11
|
-
}
|
|
12
|
-
const result = createSurface(source.width, source.height);
|
|
13
|
-
let hasDiff = false;
|
|
14
|
-
for (let i = 0; i < source.data.length; i += 4) {
|
|
15
|
-
const dr = Math.abs(source.data[i] - other.data[i]);
|
|
16
|
-
const dg = Math.abs(source.data[i + 1] - other.data[i + 1]);
|
|
17
|
-
const db = Math.abs(source.data[i + 2] - other.data[i + 2]);
|
|
18
|
-
const da = Math.abs(source.data[i + 3] - other.data[i + 3]);
|
|
19
|
-
if (dr !== 0 || dg !== 0 || db !== 0 || da !== 0) {
|
|
20
|
-
result.data[i] = dr;
|
|
21
|
-
result.data[i + 1] = dg;
|
|
22
|
-
result.data[i + 2] = db;
|
|
23
|
-
result.data[i + 3] = 255;
|
|
24
|
-
hasDiff = true;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return hasDiff ? result : null;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Compares two equally sized surfaces with a per-channel tolerance and returns summary metrics rather
|
|
31
|
-
* than a diff image. A pixel is "mismatched" when its largest RGBA channel difference exceeds
|
|
32
|
-
* `channelTolerance` (0..255). Use a small tolerance plus a `fraction` threshold to assert that two
|
|
33
|
-
* backends rendered the same scene (cross-backend differential) or that a render still matches a prior
|
|
34
|
-
* one, while ignoring antialiasing noise. Throws if the surfaces differ in size — comparing
|
|
35
|
-
* incompatible surfaces is a programmer error (mirrors compareSurface).
|
|
36
|
-
*/
|
|
37
|
-
export function getSurfaceMismatch(source, other, channelTolerance = 0) {
|
|
38
|
-
if (source.width !== other.width || source.height !== other.height) {
|
|
39
|
-
throw new Error(`getSurfaceMismatch: surface dimensions do not match (${source.width}×${source.height} vs ${other.width}×${other.height})`);
|
|
40
|
-
}
|
|
41
|
-
const a = source.data;
|
|
42
|
-
const b = other.data;
|
|
43
|
-
const totalPixels = source.width * source.height;
|
|
44
|
-
let mismatchedPixels = 0;
|
|
45
|
-
let maxChannelDelta = 0;
|
|
46
|
-
for (let i = 0; i < a.length; i += 4) {
|
|
47
|
-
const dr = Math.abs(a[i] - b[i]);
|
|
48
|
-
const dg = Math.abs(a[i + 1] - b[i + 1]);
|
|
49
|
-
const db = Math.abs(a[i + 2] - b[i + 2]);
|
|
50
|
-
const da = Math.abs(a[i + 3] - b[i + 3]);
|
|
51
|
-
const pixelDelta = Math.max(dr, dg, db, da);
|
|
52
|
-
if (pixelDelta > maxChannelDelta)
|
|
53
|
-
maxChannelDelta = pixelDelta;
|
|
54
|
-
if (pixelDelta > channelTolerance)
|
|
55
|
-
mismatchedPixels++;
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
mismatchedPixels,
|
|
59
|
-
totalPixels,
|
|
60
|
-
fraction: totalPixels === 0 ? 0 : mismatchedPixels / totalPixels,
|
|
61
|
-
maxChannelDelta,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=surfaceCompare.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceCompare.js","sourceRoot":"","sources":["../src/surfaceCompare.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { SurfaceRegion } from '@flighthq/types/contract';
|
|
2
|
-
import { SurfaceCompositeMode } from '@flighthq/types/contract';
|
|
3
|
-
/**
|
|
4
|
-
* Alpha-composites `pixels` over `dest`. `pixels` must be at least
|
|
5
|
-
* `dest.width * dest.height * 4` bytes in row-major RGBA order.
|
|
6
|
-
*
|
|
7
|
-
* `mode` is a SurfaceCompositeMode — surface's single vocabulary spanning both the color-blend functions
|
|
8
|
-
* (Normal (default), Multiply, Screen, Add, Subtract, Darken, Lighten, Difference, Exclusion, Overlay,
|
|
9
|
-
* HardLight, SoftLight, ColorDodge, ColorBurn, Invert) and the Porter-Duff coverage operators (SourceOver,
|
|
10
|
-
* DestinationOut = erase, DestinationIn = alpha mask, Copy, Clear, Xor, and the atop/in/out set). A
|
|
11
|
-
* color-blend mode composites source-over; a coverage operator applies its factors with a Normal blend. An
|
|
12
|
-
* unknown mode composites source-over.
|
|
13
|
-
*/
|
|
14
|
-
export declare function compositeSurfacePixels(dest: Readonly<SurfaceRegion>, pixels: Readonly<Uint8ClampedArray>, mode?: SurfaceCompositeMode): void;
|
|
15
|
-
/**
|
|
16
|
-
* Alpha-composites `source` over `dest`. See `compositeSurfacePixels` for the
|
|
17
|
-
* `mode` semantics.
|
|
18
|
-
*/
|
|
19
|
-
export declare function compositeSurfaceRegion(dest: Readonly<SurfaceRegion>, source: Readonly<SurfaceRegion>, mode?: SurfaceCompositeMode): void;
|
|
20
|
-
/**
|
|
21
|
-
* Copies `source` into `out` in row-major, tightly-packed RGBA order
|
|
22
|
-
* (stride = source.width). `out` must be at least
|
|
23
|
-
* `source.width * source.height * 4` bytes.
|
|
24
|
-
*
|
|
25
|
-
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
26
|
-
* full surface (x=0, y=0, width=source.surface.width,
|
|
27
|
-
* height=source.surface.height).
|
|
28
|
-
*/
|
|
29
|
-
export declare function extractSurfacePixels(out: Uint8ClampedArray, source: Readonly<SurfaceRegion>): void;
|
|
30
|
-
/**
|
|
31
|
-
* Copies `source` into `out` as one packed `0xRRGGBBAA` color per pixel
|
|
32
|
-
* (`0xRRGGBBAA` packed colors, the same packing `getSurfacePixel` returns), in row-major order with
|
|
33
|
-
* stride = source.width. `out` must hold at least
|
|
34
|
-
* `source.width * source.height` entries.
|
|
35
|
-
*
|
|
36
|
-
* This is the bulk, color-per-element counterpart to the byte-per-channel
|
|
37
|
-
* `extractSurfacePixels`: use it when you want to read or compare whole
|
|
38
|
-
* regions of colors without reassembling channel bytes.
|
|
39
|
-
*/
|
|
40
|
-
export declare function extractSurfacePixels32(out: Uint32Array, source: Readonly<SurfaceRegion>): void;
|
|
41
|
-
/**
|
|
42
|
-
* Writes `pixels` into `dest`, overwriting existing content.
|
|
43
|
-
* `pixels` must be at least `dest.width * dest.height * 4` bytes in
|
|
44
|
-
* row-major RGBA order.
|
|
45
|
-
*/
|
|
46
|
-
export declare function writeSurfacePixels(dest: Readonly<SurfaceRegion>, pixels: Readonly<Uint8ClampedArray>): void;
|
|
47
|
-
/**
|
|
48
|
-
* Writes `pixels` into `dest`, overwriting existing content. Each entry is a
|
|
49
|
-
* packed `0xRRGGBBAA` color (the form `setSurfacePixel` takes), read in
|
|
50
|
-
* row-major order. `pixels` must hold at least `dest.width * dest.height`
|
|
51
|
-
* entries. This is the color-per-element counterpart to `writeSurfacePixels`.
|
|
52
|
-
*/
|
|
53
|
-
export declare function writeSurfacePixels32(dest: Readonly<SurfaceRegion>, pixels: Readonly<Uint32Array>): void;
|
|
54
|
-
//# sourceMappingURL=surfaceComposite.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceComposite.d.ts","sourceRoot":"","sources":["../src/surfaceComposite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,IAAI,GAAE,oBAAkD,GACvD,IAAI,CAoBN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,IAAI,GAAE,oBAAkD,GACvD,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,CAelG;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,CAgB9F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAgB3G;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAgBvG"}
|
package/dist/surfaceComposite.js
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
import { invalidateImageResource } from '@flighthq/image/contract';
|
|
2
|
-
import { SurfaceCompositeMode } from '@flighthq/types/contract';
|
|
3
|
-
/**
|
|
4
|
-
* Alpha-composites `pixels` over `dest`. `pixels` must be at least
|
|
5
|
-
* `dest.width * dest.height * 4` bytes in row-major RGBA order.
|
|
6
|
-
*
|
|
7
|
-
* `mode` is a SurfaceCompositeMode — surface's single vocabulary spanning both the color-blend functions
|
|
8
|
-
* (Normal (default), Multiply, Screen, Add, Subtract, Darken, Lighten, Difference, Exclusion, Overlay,
|
|
9
|
-
* HardLight, SoftLight, ColorDodge, ColorBurn, Invert) and the Porter-Duff coverage operators (SourceOver,
|
|
10
|
-
* DestinationOut = erase, DestinationIn = alpha mask, Copy, Clear, Xor, and the atop/in/out set). A
|
|
11
|
-
* color-blend mode composites source-over; a coverage operator applies its factors with a Normal blend. An
|
|
12
|
-
* unknown mode composites source-over.
|
|
13
|
-
*/
|
|
14
|
-
export function compositeSurfacePixels(dest, pixels, mode = SurfaceCompositeMode.Normal) {
|
|
15
|
-
for (let py = 0; py < dest.height; py++) {
|
|
16
|
-
const y = dest.y + py;
|
|
17
|
-
if (y < 0 || y >= dest.surface.height)
|
|
18
|
-
continue;
|
|
19
|
-
for (let px = 0; px < dest.width; px++) {
|
|
20
|
-
const x = dest.x + px;
|
|
21
|
-
if (x < 0 || x >= dest.surface.width)
|
|
22
|
-
continue;
|
|
23
|
-
const si = (py * dest.width + px) * 4;
|
|
24
|
-
compositePixelInto(dest.surface.data, (y * dest.surface.width + x) * 4, pixels[si], pixels[si + 1], pixels[si + 2], pixels[si + 3], mode);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
invalidateImageResource(dest.surface);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Alpha-composites `source` over `dest`. See `compositeSurfacePixels` for the
|
|
31
|
-
* `mode` semantics.
|
|
32
|
-
*/
|
|
33
|
-
export function compositeSurfaceRegion(dest, source, mode = SurfaceCompositeMode.Normal) {
|
|
34
|
-
const sw = Math.min(dest.width, source.width);
|
|
35
|
-
const sh = Math.min(dest.height, source.height);
|
|
36
|
-
for (let py = 0; py < sh; py++) {
|
|
37
|
-
const sourceY = source.y + py;
|
|
38
|
-
const y = dest.y + py;
|
|
39
|
-
if (sourceY < 0 || sourceY >= source.surface.height || y < 0 || y >= dest.surface.height)
|
|
40
|
-
continue;
|
|
41
|
-
for (let px = 0; px < sw; px++) {
|
|
42
|
-
const sourceX = source.x + px;
|
|
43
|
-
const x = dest.x + px;
|
|
44
|
-
if (sourceX < 0 || sourceX >= source.surface.width || x < 0 || x >= dest.surface.width)
|
|
45
|
-
continue;
|
|
46
|
-
const si = (sourceY * source.surface.width + sourceX) * 4;
|
|
47
|
-
compositePixelInto(dest.surface.data, (y * dest.surface.width + x) * 4, source.surface.data[si], source.surface.data[si + 1], source.surface.data[si + 2], source.surface.data[si + 3], mode);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
invalidateImageResource(dest.surface);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Copies `source` into `out` in row-major, tightly-packed RGBA order
|
|
54
|
-
* (stride = source.width). `out` must be at least
|
|
55
|
-
* `source.width * source.height * 4` bytes.
|
|
56
|
-
*
|
|
57
|
-
* Safe to pass `source.surface.data` as `out` when the region covers the
|
|
58
|
-
* full surface (x=0, y=0, width=source.surface.width,
|
|
59
|
-
* height=source.surface.height).
|
|
60
|
-
*/
|
|
61
|
-
export function extractSurfacePixels(out, source) {
|
|
62
|
-
for (let py = 0; py < source.height; py++) {
|
|
63
|
-
const sourceY = source.y + py;
|
|
64
|
-
if (sourceY < 0 || sourceY >= source.surface.height)
|
|
65
|
-
continue;
|
|
66
|
-
for (let px = 0; px < source.width; px++) {
|
|
67
|
-
const sourceX = source.x + px;
|
|
68
|
-
if (sourceX < 0 || sourceX >= source.surface.width)
|
|
69
|
-
continue;
|
|
70
|
-
const si = (sourceY * source.surface.width + sourceX) * 4;
|
|
71
|
-
const di = (py * source.width + px) * 4;
|
|
72
|
-
out[di] = source.surface.data[si];
|
|
73
|
-
out[di + 1] = source.surface.data[si + 1];
|
|
74
|
-
out[di + 2] = source.surface.data[si + 2];
|
|
75
|
-
out[di + 3] = source.surface.data[si + 3];
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Copies `source` into `out` as one packed `0xRRGGBBAA` color per pixel
|
|
81
|
-
* (`0xRRGGBBAA` packed colors, the same packing `getSurfacePixel` returns), in row-major order with
|
|
82
|
-
* stride = source.width. `out` must hold at least
|
|
83
|
-
* `source.width * source.height` entries.
|
|
84
|
-
*
|
|
85
|
-
* This is the bulk, color-per-element counterpart to the byte-per-channel
|
|
86
|
-
* `extractSurfacePixels`: use it when you want to read or compare whole
|
|
87
|
-
* regions of colors without reassembling channel bytes.
|
|
88
|
-
*/
|
|
89
|
-
export function extractSurfacePixels32(out, source) {
|
|
90
|
-
for (let py = 0; py < source.height; py++) {
|
|
91
|
-
const sourceY = source.y + py;
|
|
92
|
-
if (sourceY < 0 || sourceY >= source.surface.height)
|
|
93
|
-
continue;
|
|
94
|
-
for (let px = 0; px < source.width; px++) {
|
|
95
|
-
const sourceX = source.x + px;
|
|
96
|
-
if (sourceX < 0 || sourceX >= source.surface.width)
|
|
97
|
-
continue;
|
|
98
|
-
const si = (sourceY * source.surface.width + sourceX) * 4;
|
|
99
|
-
out[py * source.width + px] =
|
|
100
|
-
((source.surface.data[si] << 24) |
|
|
101
|
-
(source.surface.data[si + 1] << 16) |
|
|
102
|
-
(source.surface.data[si + 2] << 8) |
|
|
103
|
-
source.surface.data[si + 3]) >>>
|
|
104
|
-
0;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Writes `pixels` into `dest`, overwriting existing content.
|
|
110
|
-
* `pixels` must be at least `dest.width * dest.height * 4` bytes in
|
|
111
|
-
* row-major RGBA order.
|
|
112
|
-
*/
|
|
113
|
-
export function writeSurfacePixels(dest, pixels) {
|
|
114
|
-
for (let py = 0; py < dest.height; py++) {
|
|
115
|
-
const y = dest.y + py;
|
|
116
|
-
if (y < 0 || y >= dest.surface.height)
|
|
117
|
-
continue;
|
|
118
|
-
for (let px = 0; px < dest.width; px++) {
|
|
119
|
-
const x = dest.x + px;
|
|
120
|
-
if (x < 0 || x >= dest.surface.width)
|
|
121
|
-
continue;
|
|
122
|
-
const si = (py * dest.width + px) * 4;
|
|
123
|
-
const di = (y * dest.surface.width + x) * 4;
|
|
124
|
-
dest.surface.data[di] = pixels[si];
|
|
125
|
-
dest.surface.data[di + 1] = pixels[si + 1];
|
|
126
|
-
dest.surface.data[di + 2] = pixels[si + 2];
|
|
127
|
-
dest.surface.data[di + 3] = pixels[si + 3];
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
invalidateImageResource(dest.surface);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Writes `pixels` into `dest`, overwriting existing content. Each entry is a
|
|
134
|
-
* packed `0xRRGGBBAA` color (the form `setSurfacePixel` takes), read in
|
|
135
|
-
* row-major order. `pixels` must hold at least `dest.width * dest.height`
|
|
136
|
-
* entries. This is the color-per-element counterpart to `writeSurfacePixels`.
|
|
137
|
-
*/
|
|
138
|
-
export function writeSurfacePixels32(dest, pixels) {
|
|
139
|
-
for (let py = 0; py < dest.height; py++) {
|
|
140
|
-
const y = dest.y + py;
|
|
141
|
-
if (y < 0 || y >= dest.surface.height)
|
|
142
|
-
continue;
|
|
143
|
-
for (let px = 0; px < dest.width; px++) {
|
|
144
|
-
const x = dest.x + px;
|
|
145
|
-
if (x < 0 || x >= dest.surface.width)
|
|
146
|
-
continue;
|
|
147
|
-
const color = pixels[py * dest.width + px];
|
|
148
|
-
const di = (y * dest.surface.width + x) * 4;
|
|
149
|
-
dest.surface.data[di] = (color >>> 24) & 0xff;
|
|
150
|
-
dest.surface.data[di + 1] = (color >> 16) & 0xff;
|
|
151
|
-
dest.surface.data[di + 2] = (color >> 8) & 0xff;
|
|
152
|
-
dest.surface.data[di + 3] = color & 0xff;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
invalidateImageResource(dest.surface);
|
|
156
|
-
}
|
|
157
|
-
// Premultiplied-free Porter-Duff coverage factors [Fa, Fb] for a SurfaceCompositeMode, applied to the
|
|
158
|
-
// source and backdrop contributions respectively (out = Fa·αs·Cs' + Fb·αb·Cb over αo = Fa·αs + Fb·αb). The
|
|
159
|
-
// color-blend modes and any unknown mode composite source-over ([1, 1−αs]); the coverage operators pick
|
|
160
|
-
// their own factor pair. surface owns this Porter-Duff kernel (it does not depend on @flighthq/effects) so
|
|
161
|
-
// it stays self-contained for the WASM port.
|
|
162
|
-
function porterDuffFactors(mode, srcA, dstA) {
|
|
163
|
-
switch (mode) {
|
|
164
|
-
case SurfaceCompositeMode.DestinationOver:
|
|
165
|
-
return [1 - dstA, 1];
|
|
166
|
-
case SurfaceCompositeMode.SourceIn:
|
|
167
|
-
return [dstA, 0];
|
|
168
|
-
case SurfaceCompositeMode.DestinationIn:
|
|
169
|
-
return [0, srcA];
|
|
170
|
-
case SurfaceCompositeMode.SourceOut:
|
|
171
|
-
return [1 - dstA, 0];
|
|
172
|
-
case SurfaceCompositeMode.DestinationOut:
|
|
173
|
-
return [0, 1 - srcA];
|
|
174
|
-
case SurfaceCompositeMode.SourceAtop:
|
|
175
|
-
return [dstA, 1 - srcA];
|
|
176
|
-
case SurfaceCompositeMode.DestinationAtop:
|
|
177
|
-
return [1 - dstA, srcA];
|
|
178
|
-
case SurfaceCompositeMode.Xor:
|
|
179
|
-
return [1 - dstA, 1 - srcA];
|
|
180
|
-
case SurfaceCompositeMode.Copy:
|
|
181
|
-
return [1, 0];
|
|
182
|
-
case SurfaceCompositeMode.Clear:
|
|
183
|
-
return [0, 0];
|
|
184
|
-
default:
|
|
185
|
-
return [1, 1 - srcA];
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// Separable per-channel color blend on 0..255 values. The coverage operators, Normal, and any unlisted
|
|
189
|
-
// mode return the source channel unchanged, so the composite reduces to the operator's Porter-Duff combine
|
|
190
|
-
// with no color mixing.
|
|
191
|
-
function blendChannel(mode, cb, cs) {
|
|
192
|
-
switch (mode) {
|
|
193
|
-
case SurfaceCompositeMode.Multiply:
|
|
194
|
-
return (cb * cs) / 255;
|
|
195
|
-
case SurfaceCompositeMode.Screen:
|
|
196
|
-
return cb + cs - (cb * cs) / 255;
|
|
197
|
-
case SurfaceCompositeMode.Add:
|
|
198
|
-
return Math.min(255, cb + cs);
|
|
199
|
-
case SurfaceCompositeMode.Subtract:
|
|
200
|
-
return Math.max(0, cb - cs);
|
|
201
|
-
case SurfaceCompositeMode.Darken:
|
|
202
|
-
return Math.min(cb, cs);
|
|
203
|
-
case SurfaceCompositeMode.Lighten:
|
|
204
|
-
return Math.max(cb, cs);
|
|
205
|
-
case SurfaceCompositeMode.Difference:
|
|
206
|
-
return Math.abs(cb - cs);
|
|
207
|
-
case SurfaceCompositeMode.Exclusion:
|
|
208
|
-
return cb + cs - (2 * cb * cs) / 255;
|
|
209
|
-
case SurfaceCompositeMode.Overlay:
|
|
210
|
-
return cb < 128 ? (2 * cb * cs) / 255 : 255 - (2 * (255 - cb) * (255 - cs)) / 255;
|
|
211
|
-
case SurfaceCompositeMode.HardLight:
|
|
212
|
-
return cs < 128 ? (2 * cb * cs) / 255 : 255 - (2 * (255 - cb) * (255 - cs)) / 255;
|
|
213
|
-
case SurfaceCompositeMode.SoftLight:
|
|
214
|
-
return softLightChannel(cb, cs);
|
|
215
|
-
case SurfaceCompositeMode.ColorDodge:
|
|
216
|
-
return cs >= 255 ? 255 : Math.min(255, (cb * 255) / (255 - cs));
|
|
217
|
-
case SurfaceCompositeMode.ColorBurn:
|
|
218
|
-
return cs <= 0 ? 0 : 255 - Math.min(255, ((255 - cb) * 255) / cs);
|
|
219
|
-
case SurfaceCompositeMode.Invert:
|
|
220
|
-
return 255 - cb;
|
|
221
|
-
default:
|
|
222
|
-
return cs;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
// W3C soft-light per channel on 0..255 (the Photoshop/CSS pegtop-free formula). `cb` = backdrop,
|
|
226
|
-
// `cs` = source; both 0..255. The two-branch D(cb) form used by the spec, evaluated in normalized
|
|
227
|
-
// 0..1 space then scaled back.
|
|
228
|
-
function softLightChannel(cb, cs) {
|
|
229
|
-
const b = cb / 255;
|
|
230
|
-
const s = cs / 255;
|
|
231
|
-
const d = b <= 0.25 ? ((16 * b - 12) * b + 4) * b : Math.sqrt(b);
|
|
232
|
-
const out = s <= 0.5 ? b - (1 - 2 * s) * b * (1 - b) : b + (2 * s - 1) * (d - b);
|
|
233
|
-
return out * 255;
|
|
234
|
-
}
|
|
235
|
-
function compositePixelInto(dest, di, r, g, b, a, mode) {
|
|
236
|
-
const srcA = a / 255;
|
|
237
|
-
const dstA = dest[di + 3] / 255;
|
|
238
|
-
// W3C compositing: αo = Fa·αs + Fb·αb, Co = (Fa·αs·Cs' + Fb·αb·Cb) / αo, where Cs' is the blended source
|
|
239
|
-
// color and (Fa, Fb) are the mode's Porter-Duff factors. Source-over + a blend function covers the color
|
|
240
|
-
// modes; the coverage operators (Erase = DestinationOut, Alpha = DestinationIn, …) fall out of the same
|
|
241
|
-
// formula with a Normal blend. Read backdrop channels before writing any of them.
|
|
242
|
-
const [fa, fb] = porterDuffFactors(mode, srcA, dstA);
|
|
243
|
-
const outA = fa * srcA + fb * dstA;
|
|
244
|
-
if (outA <= 0) {
|
|
245
|
-
dest[di] = 0;
|
|
246
|
-
dest[di + 1] = 0;
|
|
247
|
-
dest[di + 2] = 0;
|
|
248
|
-
dest[di + 3] = 0;
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
const cbR = dest[di];
|
|
252
|
-
const cbG = dest[di + 1];
|
|
253
|
-
const cbB = dest[di + 2];
|
|
254
|
-
const csR = (1 - dstA) * r + dstA * blendChannel(mode, cbR, r);
|
|
255
|
-
const csG = (1 - dstA) * g + dstA * blendChannel(mode, cbG, g);
|
|
256
|
-
const csB = (1 - dstA) * b + dstA * blendChannel(mode, cbB, b);
|
|
257
|
-
dest[di] = Math.round((fa * srcA * csR + fb * dstA * cbR) / outA);
|
|
258
|
-
dest[di + 1] = Math.round((fa * srcA * csG + fb * dstA * cbG) / outA);
|
|
259
|
-
dest[di + 2] = Math.round((fa * srcA * csB + fb * dstA * cbB) / outA);
|
|
260
|
-
dest[di + 3] = Math.round(outA * 255);
|
|
261
|
-
}
|
|
262
|
-
//# sourceMappingURL=surfaceComposite.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceComposite.js","sourceRoot":"","sources":["../src/surfaceComposite.ts"],"names":[],"mappings":"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"}
|