@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,124 @@
|
|
|
1
|
+
import type { Surface, SurfaceRegion } from '@flighthq/types';
|
|
2
|
+
|
|
3
|
+
import { createSurface } from './surface';
|
|
4
|
+
import { getSurfacePixel, setSurfacePixel } from './surfacePixel';
|
|
5
|
+
import { warpSurface, warpSurfaceQuad } from './surfaceWarp';
|
|
6
|
+
|
|
7
|
+
function region(
|
|
8
|
+
surface: Readonly<Surface>,
|
|
9
|
+
x = 0,
|
|
10
|
+
y = 0,
|
|
11
|
+
width = surface.width,
|
|
12
|
+
height = surface.height,
|
|
13
|
+
): SurfaceRegion {
|
|
14
|
+
return { surface, x, y, width, height };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe('warpSurface', () => {
|
|
18
|
+
it('identity matrix copies source to dest', () => {
|
|
19
|
+
const src = createSurface(4, 4, 0xff0000ff);
|
|
20
|
+
const dst = createSurface(4, 4);
|
|
21
|
+
// Identity homography: dest pixel (x,y) maps to source (x,y).
|
|
22
|
+
warpSurface(region(dst), region(src), [1, 0, 0, 0, 1, 0, 0, 0, 1]);
|
|
23
|
+
expect(getSurfacePixel(dst, 0, 0)).toBe(0xff0000ff);
|
|
24
|
+
expect(getSurfacePixel(dst, 3, 3)).toBe(0xff0000ff);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('translation matrix shifts source', () => {
|
|
28
|
+
const src = createSurface(4, 4);
|
|
29
|
+
setSurfacePixel(src, 0, 0, 0xff0000ff);
|
|
30
|
+
const dst = createSurface(4, 4);
|
|
31
|
+
// Translate source by (-1, -1): dest pixel (x,y) reads source (x-1, y-1).
|
|
32
|
+
warpSurface(region(dst), region(src), [1, 0, -1, 0, 1, -1, 0, 0, 1], 'transparent', 'nearest');
|
|
33
|
+
// dst(1,1) should map to src(0,0)
|
|
34
|
+
expect(getSurfacePixel(dst, 1, 1)).toBe(0xff0000ff);
|
|
35
|
+
// dst(0,0) maps to src(-1,-1) → transparent
|
|
36
|
+
expect(getSurfacePixel(dst, 0, 0)).toBe(0x00000000);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('clamp edgeMode extends border pixels', () => {
|
|
40
|
+
const src = createSurface(2, 2, 0x00ff00ff);
|
|
41
|
+
const dst = createSurface(4, 4);
|
|
42
|
+
// Translate source by (2,2): most dst pixels map outside src → clamp to border.
|
|
43
|
+
warpSurface(region(dst), region(src), [1, 0, 2, 0, 1, 2, 0, 0, 1], 'clamp', 'nearest');
|
|
44
|
+
// dst(0,0) maps to src(-2,-2) → clamped to src(0,0) = green
|
|
45
|
+
expect(getSurfacePixel(dst, 0, 0)).toBe(0x00ff00ff);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('transparent edgeMode gives transparent black outside bounds', () => {
|
|
49
|
+
const src = createSurface(2, 2, 0xffffffff);
|
|
50
|
+
const dst = createSurface(4, 4);
|
|
51
|
+
warpSurface(region(dst), region(src), [1, 0, 3, 0, 1, 3, 0, 0, 1], 'transparent', 'nearest');
|
|
52
|
+
// All dst pixels map to src outside bounds.
|
|
53
|
+
expect(getSurfacePixel(dst, 0, 0)).toBe(0x00000000);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('zero-size regions are a no-op', () => {
|
|
57
|
+
const src = createSurface(4, 4, 0xffffffff);
|
|
58
|
+
const dst = createSurface(4, 4);
|
|
59
|
+
warpSurface(region(dst, 0, 0, 0, 4), region(src), [1, 0, 0, 0, 1, 0, 0, 0, 1]);
|
|
60
|
+
expect(getSurfacePixel(dst, 0, 0)).toBe(0x00000000);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('near-zero w coefficient produces transparent pixel', () => {
|
|
64
|
+
const src = createSurface(2, 2, 0xffffffff);
|
|
65
|
+
const dst = createSurface(2, 2);
|
|
66
|
+
// Pathological matrix where w ≈ 0 at (0,0).
|
|
67
|
+
warpSurface(region(dst), region(src), [1, 0, 0, 0, 1, 0, 1e-15, 0, 0], 'clamp', 'nearest');
|
|
68
|
+
// Should not throw; pixel at (0,0) with w≈0 becomes transparent.
|
|
69
|
+
expect(dst.data[3]).toBe(0);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe('warpSurfaceQuad', () => {
|
|
74
|
+
it('identity quad (src corners → dst corners) copies source', () => {
|
|
75
|
+
const src = createSurface(4, 4, 0x0000ffff);
|
|
76
|
+
const dst = createSurface(4, 4);
|
|
77
|
+
// Map source [4x4] corners to dest [4x4] corners unchanged.
|
|
78
|
+
warpSurfaceQuad(region(dst), region(src), [0, 0, 4, 0, 4, 4, 0, 4], 'transparent', 'nearest');
|
|
79
|
+
// Interior pixels should be blue.
|
|
80
|
+
expect(getSurfacePixel(dst, 2, 2)).toBe(0x0000ffff);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('degenerate quad (zero-area) produces no output', () => {
|
|
84
|
+
const src = createSurface(4, 4, 0xffffffff);
|
|
85
|
+
const dst = createSurface(4, 4);
|
|
86
|
+
// All four corners at the same point → degenerate homography.
|
|
87
|
+
warpSurfaceQuad(region(dst), region(src), [2, 2, 2, 2, 2, 2, 2, 2], 'transparent', 'nearest');
|
|
88
|
+
// Should not throw; output can be transparent or unchanged.
|
|
89
|
+
expect(dst.data.every((v) => v === 0 || true)).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('zero-size source or dest is a no-op', () => {
|
|
93
|
+
const src = createSurface(4, 4, 0xffffffff);
|
|
94
|
+
const dst = createSurface(4, 4);
|
|
95
|
+
warpSurfaceQuad(region(dst, 0, 0, 0, 0), region(src), [0, 0, 4, 0, 4, 4, 0, 4]);
|
|
96
|
+
expect(getSurfacePixel(dst, 0, 0)).toBe(0x00000000);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('horizontal shear quad produces non-trivial sampling', () => {
|
|
100
|
+
const src = createSurface(8, 8);
|
|
101
|
+
// Fill left half red, right half green.
|
|
102
|
+
for (let py = 0; py < 8; py++) {
|
|
103
|
+
for (let px = 0; px < 8; px++) {
|
|
104
|
+
const i = (py * 8 + px) * 4;
|
|
105
|
+
src.data[i] = px < 4 ? 255 : 0;
|
|
106
|
+
src.data[i + 1] = px >= 4 ? 255 : 0;
|
|
107
|
+
src.data[i + 2] = 0;
|
|
108
|
+
src.data[i + 3] = 255;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const dst = createSurface(8, 8);
|
|
112
|
+
// Shear: right edge shifted up by 2 pixels.
|
|
113
|
+
warpSurfaceQuad(region(dst), region(src), [0, 0, 8, 2, 8, 8, 0, 8], 'transparent', 'nearest');
|
|
114
|
+
// Should not throw; output should be non-blank for inner pixels.
|
|
115
|
+
let hasNonZero = false;
|
|
116
|
+
for (let i = 0; i < dst.data.length; i++) {
|
|
117
|
+
if (dst.data[i] !== 0) {
|
|
118
|
+
hasNonZero = true;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
expect(hasNonZero).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
});
|