imagescript 1.2.9 → 1.2.16

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.
Files changed (100) hide show
  1. package/ImageScript.d.ts +223 -0
  2. package/ImageScript.js +1646 -1682
  3. package/LICENSE +619 -0
  4. package/README.md +46 -45
  5. package/bench/_.mjs +166 -0
  6. package/bench/all.mjs +4 -0
  7. package/bench/blur.mjs +59 -0
  8. package/bench/flip.mjs +63 -0
  9. package/bench/overlay.mjs +35 -0
  10. package/bench/package.json +7 -0
  11. package/bench/readme.md +64 -0
  12. package/bench/resize.mjs +52 -0
  13. package/codecs/LICENSE +21 -0
  14. package/codecs/lib.d.ts +50 -0
  15. package/codecs/lib.js +6 -0
  16. package/codecs/lib.mjs +1 -0
  17. package/codecs/node/bin/arm64-darwin.node +0 -0
  18. package/{node → codecs/node/bin}/arm64-linux.node +0 -0
  19. package/codecs/node/bin/x64-darwin.node +0 -0
  20. package/{node → codecs/node/bin}/x64-linux.node +0 -0
  21. package/{node → codecs/node/bin}/x64-win32.node +0 -0
  22. package/codecs/node/index.js +3 -0
  23. package/codecs/node/index.mjs +6 -0
  24. package/codecs/package.json +14 -0
  25. package/codecs/readme.md +38 -0
  26. package/{wasm/simd.wasm → codecs/tests/gif.js} +0 -0
  27. package/{wasm/unknown.wasm → codecs/tests/jpeg.js} +0 -0
  28. package/codecs/tests/png.js +0 -0
  29. package/codecs/tests/results/gif/1024.nis.gif +0 -0
  30. package/codecs/tests/results/gif/1024.skyra.gif +0 -0
  31. package/codecs/tests/results/gif/256.nis.gif +0 -0
  32. package/codecs/tests/results/gif/256.skyra.gif +0 -0
  33. package/codecs/tests/results/jpeg/256.jpegjs.jpeg +0 -0
  34. package/codecs/tests/results/jpeg/256.nis.jpeg +0 -0
  35. package/codecs/tests/results/jpeg/256.sharp.jpeg +0 -0
  36. package/codecs/tests/results/jpeg/512.jpegjs.jpeg +0 -0
  37. package/codecs/tests/results/jpeg/512.nis.jpeg +0 -0
  38. package/codecs/tests/results/jpeg/512.sharp.jpeg +0 -0
  39. package/codecs/tests/results/jpeg/64.jpegjs.jpeg +0 -0
  40. package/codecs/tests/results/jpeg/64.nis.jpeg +0 -0
  41. package/codecs/tests/results/jpeg/64.sharp.jpeg +0 -0
  42. package/codecs/tests/results/png/256.jis.png +0 -0
  43. package/codecs/tests/results/png/256.nis.png +0 -0
  44. package/codecs/tests/results/png/256.sharp.png +0 -0
  45. package/codecs/tests/results/png/256.upng.png +0 -0
  46. package/codecs/tests/results/png/512.jis.png +0 -0
  47. package/codecs/tests/results/png/512.nis.png +0 -0
  48. package/codecs/tests/results/png/512.sharp.png +0 -0
  49. package/codecs/tests/results/png/512.upng.png +0 -0
  50. package/codecs/tests/results/png/64.jis.png +0 -0
  51. package/codecs/tests/results/png/64.nis.png +0 -0
  52. package/codecs/tests/results/png/64.sharp.png +0 -0
  53. package/codecs/tests/results/png/64.upng.png +0 -0
  54. package/codecs/tests/webp.js +0 -0
  55. package/codecs/wasm/bin/codecs.wasm +0 -0
  56. package/codecs/wasm/bin/simd.wasm +0 -0
  57. package/codecs/wasm/bundle/browser.js +1 -0
  58. package/codecs/wasm/index.js +1 -0
  59. package/codecs/wasm/index.mjs +1 -0
  60. package/package.json +41 -28
  61. package/png/node.js +1137 -1137
  62. package/png/src/{crc.js → crc.mjs} +48 -48
  63. package/png/src/{mem.js → mem.mjs} +23 -23
  64. package/png/src/{png.js → png.mjs} +254 -254
  65. package/png/src/{zlib.js → zlib.mjs} +617 -617
  66. package/tsconfig.json +21 -0
  67. package/utils/mem.js +25 -25
  68. package/v2/codecs/magic.js +24 -24
  69. package/v2/framebuffer.d.ts +66 -66
  70. package/v2/framebuffer.js +2352 -2371
  71. package/v2/framebuffer.mjs +125 -125
  72. package/v2/framebuffer.rs +1264 -0
  73. package/v2/index.d.ts +83 -83
  74. package/v2/index.js +260 -260
  75. package/v2/ops/{blur.js → blur.mjs} +302 -302
  76. package/v2/ops/{color.js → color.mjs} +276 -276
  77. package/v2/ops/{crop.js → crop.mjs} +63 -63
  78. package/v2/ops/{fill.js → fill.mjs} +32 -32
  79. package/v2/ops/{flip.js → flip.mjs} +32 -32
  80. package/v2/ops/index.mjs +9 -0
  81. package/v2/ops/{iterator.js → iterator.mjs} +33 -33
  82. package/v2/ops/overlay.mjs +63 -0
  83. package/v2/ops/{resize.js → resize.mjs} +165 -165
  84. package/v2/ops/{rotate.js → rotate.mjs} +116 -117
  85. package/v2/util/{mem.js → mem.mjs} +24 -26
  86. package/wasm/any/font.wasm +0 -0
  87. package/wasm/any/png.wasm +0 -0
  88. package/wasm/node/font.js +141 -141
  89. package/wasm/node/gif.js +76 -76
  90. package/wasm/node/jpeg.js +91 -91
  91. package/wasm/node/png.js +49 -0
  92. package/wasm/node/svg.js +55 -55
  93. package/wasm/node/tiff.js +46 -46
  94. package/node/arm64-darwin.node +0 -0
  95. package/node/index.js +0 -7
  96. package/node/x64-darwin.node +0 -0
  97. package/v2/ops/index.js +0 -9
  98. package/v2/ops/overlay.js +0 -56
  99. package/wasm/node.js +0 -23
  100. package/wasm/web.js +0 -10
package/tsconfig.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es6",
4
+ "module": "commonjs",
5
+ "strict": true,
6
+ "noImplicitAny": true,
7
+ "strictNullChecks": true,
8
+ "noImplicitThis": true,
9
+ "alwaysStrict": true,
10
+ "noUnusedLocals": true,
11
+ "noUnusedParameters": true,
12
+ "noImplicitReturns": true,
13
+ "noFallthroughCasesInSwitch": true,
14
+ "moduleResolution": "node",
15
+ "allowJs": true,
16
+ "allowSyntheticDefaultImports": true,
17
+ "skipLibCheck": true,
18
+ "lib": ["es6"]
19
+ },
20
+ "files": ["ImageScript.d.ts"]
21
+ }
package/utils/mem.js CHANGED
@@ -1,26 +1,26 @@
1
- function view(buffer, shared = false) {
2
- if (buffer instanceof ArrayBuffer) return new Uint8Array(buffer);
3
- if (shared && buffer instanceof SharedArrayBuffer) return new Uint8Array(buffer);
4
- if (ArrayBuffer.isView(buffer)) return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
5
-
6
- throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");
7
- }
8
-
9
- function from_parts(buffers, shared = false) {
10
- let length = 0;
11
- let offset = 0;
12
- buffers.forEach(buffer => length += (null == buffer.byteLength ? buffer.length : buffer.byteLength));
13
-
14
- const u8 = new Uint8Array(shared ? new SharedArrayBuffer(length) : length);
15
-
16
- buffers.forEach(buffer => {
17
- const ref = Array.isArray(buffer) ? buffer : view(buffer, true);
18
-
19
- u8.set(ref, offset);
20
- offset += ref.length;
21
- });
22
-
23
- return u8;
24
- }
25
-
1
+ function view(buffer, shared = false) {
2
+ if (buffer instanceof ArrayBuffer) return new Uint8Array(buffer);
3
+ if (shared && buffer instanceof SharedArrayBuffer) return new Uint8Array(buffer);
4
+ if (ArrayBuffer.isView(buffer)) return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
5
+
6
+ throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'");
7
+ }
8
+
9
+ function from_parts(buffers, shared = false) {
10
+ let length = 0;
11
+ let offset = 0;
12
+ buffers.forEach(buffer => length += (null == buffer.byteLength ? buffer.length : buffer.byteLength));
13
+
14
+ const u8 = new Uint8Array(shared ? new SharedArrayBuffer(length) : length);
15
+
16
+ buffers.forEach(buffer => {
17
+ const ref = Array.isArray(buffer) ? buffer : view(buffer, true);
18
+
19
+ u8.set(ref, offset);
20
+ offset += ref.length;
21
+ });
22
+
23
+ return u8;
24
+ }
25
+
26
26
  module.exports = { view, from_parts };
@@ -1,25 +1,25 @@
1
- const { view } = require('../util/mem.js');
2
-
3
- const formats = {
4
- ttf: { type: 'font', format: 'ttf' },
5
- otf: { type: 'font', format: 'otf' },
6
- svg: { type: 'image', format: 'svg' },
7
- png: { type: 'image', format: 'png' },
8
- gif: { type: 'image', format: 'gif' },
9
- jpeg: { type: 'image', format: 'jpeg' },
10
- tiff: { type: 'image', format: 'tiff' },
11
- };
12
-
13
- function buffer(init) {
14
- const u8 = view(init);
15
- if (0 === u8.length) return;
16
- if (0xff === u8[0] && 0xd8 === u8[1] && 0xff === u8[2]) return formats.jpeg;
17
- if (0x4d === u8[0] && 0x4d === u8[1] && 0x00 === u8[2] && 0x2a === u8[3]) return formats.tiff;
18
- if (0x49 === u8[0] && 0x49 === u8[1] && 0x2a === u8[2] && 0x00 === u8[3]) return formats.tiff;
19
- if (0x00 === u8[0] && 0x01 === u8[1] && 0x00 === u8[2] && 0x00 === u8[3] && 0x00 === u8[4]) return formats.ttf;
20
- if (0x4F === u8[0] && 0x54 === u8[1] && 0x54 === u8[2] && 0x4F === u8[3] && 0x00 === u8[4]) return formats.otf;
21
- if (0x47 === u8[0] && 0x49 === u8[1] && 0x46 === u8[2] && 0x38 === u8[3] && 0x61 === u8[5] && (0x37 === u8[4] || 0x39 === u8[4])) return formats.gif;
22
- if (0x89 === u8[0] && 0x50 === u8[1] && 0x4e === u8[2] && 0x47 === u8[3] && 0x0d === u8[4] && 0x0a === u8[5] && 0x1a === u8[6] && 0x0a === u8[7]) return formats.png;
23
- }
24
-
1
+ const { view } = require('../util/mem.js');
2
+
3
+ const formats = {
4
+ ttf: { type: 'font', format: 'ttf' },
5
+ otf: { type: 'font', format: 'otf' },
6
+ svg: { type: 'image', format: 'svg' },
7
+ png: { type: 'image', format: 'png' },
8
+ gif: { type: 'image', format: 'gif' },
9
+ jpeg: { type: 'image', format: 'jpeg' },
10
+ tiff: { type: 'image', format: 'tiff' },
11
+ };
12
+
13
+ function buffer(init) {
14
+ const u8 = view(init);
15
+ if (0 === u8.length) return;
16
+ if (0xff === u8[0] && 0xd8 === u8[1] && 0xff === u8[2]) return formats.jpeg;
17
+ if (0x4d === u8[0] && 0x4d === u8[1] && 0x00 === u8[2] && 0x2a === u8[3]) return formats.tiff;
18
+ if (0x49 === u8[0] && 0x49 === u8[1] && 0x2a === u8[2] && 0x00 === u8[3]) return formats.tiff;
19
+ if (0x00 === u8[0] && 0x01 === u8[1] && 0x00 === u8[2] && 0x00 === u8[3] && 0x00 === u8[4]) return formats.ttf;
20
+ if (0x4F === u8[0] && 0x54 === u8[1] && 0x54 === u8[2] && 0x4F === u8[3] && 0x00 === u8[4]) return formats.otf;
21
+ if (0x47 === u8[0] && 0x49 === u8[1] && 0x46 === u8[2] && 0x38 === u8[3] && 0x61 === u8[5] && (0x37 === u8[4] || 0x39 === u8[4])) return formats.gif;
22
+ if (0x89 === u8[0] && 0x50 === u8[1] && 0x4e === u8[2] && 0x47 === u8[3] && 0x0d === u8[4] && 0x0a === u8[5] && 0x1a === u8[6] && 0x0a === u8[7]) return formats.png;
23
+ }
24
+
25
25
  module.exports = { buffer };
@@ -1,67 +1,67 @@
1
- type rgb = [r: number, g: number, b: number];
2
- type rgba = [r: number, g: number, b: number, a: number];
3
-
4
- export class Color {
5
- private value: number;
6
-
7
- constructor(color: string);
8
- static rgb(r: number, g: number, b: number): number;
9
- static rgba(r: number, g: number, b: number, a: number): number;
10
- static hsla(h: number, s: number, l: number, a: number): number;
11
-
12
- get rgb(): rgb;
13
- toJSON(): number;
14
- get rgba(): rgba;
15
- valueOf(): number;
16
- get name(): null | string;
17
- toString(radix?: '16' | 'hex' | 'rgb' | 'rgba'): string;
18
- }
19
-
20
- export default class framebuffer {
21
- readonly width: number;
22
- readonly u8: Uint8Array;
23
- readonly height: number;
24
- readonly u32: Uint32Array;
25
- private readonly view: DataView;
26
-
27
- constructor(width: number, height: number, buffer?: BufferSource);
28
- static from(framebuffer: { width: number, height: number, u8?: BufferSource, buffer?: BufferSource }): framebuffer;
29
-
30
- toString(): string;
31
- clone(): framebuffer;
32
- get(x: number, y: number): number;
33
- at(x: number, y: number): Uint8Array;
34
- flip(type: 'vertical' | 'horizontal'): this;
35
- rotate(deg: number, resize?: boolean): this;
36
- set(x: number, y: number, color: number): void;
37
- overlay(frame: this, x?: number, y?: number): this;
38
- replace(frame: this, x?: number, y?: number): this;
39
- toJSON(): { width: number, height: number, buffer: number[] };
40
- static decode(format: 'png', buffer: BufferSource): framebuffer;
41
- scale(type: 'cubic' | 'linear' | 'nearest', factor: number): this;
42
- [Symbol.iterator](): Generator<[x: number, y: number], [x: number, y: number]>;
43
- resize(type: 'cubic' | 'linear' | 'nearest', width: number, height: number): this;
44
- encode(format: 'png', options?: { compression?: 'none' | 'fast' | 'best' | 'default' }): Uint8Array;
45
-
46
- cut(type: 'circle', feathering?: number): this;
47
- cut(type: 'box', x: number, y: number, width: number, height: number): this;
48
-
49
- crop(type: 'circle', feathering?: number): this;
50
- crop(type: 'box', x: number, y: number, width: number, height: number): this;
51
-
52
- blur(type: 'cubic'): this;
53
- blur(type: 'box', radius: number): this;
54
- blur(type: 'gaussian', radius: number): this;
55
-
56
- swap(old: rgba, color: rgba): this;
57
- swap(old: Color, color: Color): this;
58
- swap(old: number, color: number): this;
59
-
60
- fill(rgba: rgba): this;
61
- fill(color: Color): this;
62
- fill(color: number): this;
63
- fill(cb: (x: number, y: number) => number): this;
64
-
65
- pixels(type?: 'int'): Generator<[x: number, y: number, color: number], [x: number, y: number, color: number]>;
66
- pixels(type: 'rgba'): Generator<[x: number, y: number, rgba: Uint8Array], [x: number, y: number, rgba: Uint8Array]>;
1
+ type rgb = [r: number, g: number, b: number];
2
+ type rgba = [r: number, g: number, b: number, a: number];
3
+
4
+ export class Color {
5
+ private value: number;
6
+
7
+ constructor(color: string);
8
+ static rgb(r: number, g: number, b: number): number;
9
+ static rgba(r: number, g: number, b: number, a: number): number;
10
+ static hsla(h: number, s: number, l: number, a: number): number;
11
+
12
+ get rgb(): rgb;
13
+ toJSON(): number;
14
+ get rgba(): rgba;
15
+ valueOf(): number;
16
+ get name(): null | string;
17
+ toString(radix?: '16' | 'hex' | 'rgb' | 'rgba'): string;
18
+ }
19
+
20
+ export default class framebuffer {
21
+ readonly width: number;
22
+ readonly u8: Uint8Array;
23
+ readonly height: number;
24
+ readonly u32: Uint32Array;
25
+ private readonly view: DataView;
26
+
27
+ constructor(width: number, height: number, buffer?: BufferSource);
28
+ static from(framebuffer: { width: number, height: number, u8?: BufferSource, buffer?: BufferSource }): framebuffer;
29
+
30
+ toString(): string;
31
+ clone(): framebuffer;
32
+ get(x: number, y: number): number;
33
+ at(x: number, y: number): Uint8Array;
34
+ flip(type: 'vertical' | 'horizontal'): this;
35
+ rotate(deg: number, resize?: boolean): this;
36
+ set(x: number, y: number, color: number): void;
37
+ overlay(frame: this, x?: number, y?: number): this;
38
+ replace(frame: this, x?: number, y?: number): this;
39
+ toJSON(): { width: number, height: number, buffer: number[] };
40
+ static decode(format: 'png', buffer: BufferSource): framebuffer;
41
+ scale(type: 'cubic' | 'linear' | 'nearest', factor: number): this;
42
+ [Symbol.iterator](): Generator<[x: number, y: number], [x: number, y: number]>;
43
+ resize(type: 'cubic' | 'linear' | 'nearest', width: number, height: number): this;
44
+ encode(format: 'png', options?: { compression?: 'none' | 'fast' | 'best' | 'default' }): Uint8Array;
45
+
46
+ cut(type: 'circle', feathering?: number): this;
47
+ cut(type: 'box', x: number, y: number, width: number, height: number): this;
48
+
49
+ crop(type: 'circle', feathering?: number): this;
50
+ crop(type: 'box', x: number, y: number, width: number, height: number): this;
51
+
52
+ blur(type: 'cubic'): this;
53
+ blur(type: 'box', radius: number): this;
54
+ blur(type: 'gaussian', radius: number): this;
55
+
56
+ swap(old: rgba, color: rgba): this;
57
+ swap(old: Color, color: Color): this;
58
+ swap(old: number, color: number): this;
59
+
60
+ fill(rgba: rgba): this;
61
+ fill(color: Color): this;
62
+ fill(color: number): this;
63
+ fill(cb: (x: number, y: number) => number): this;
64
+
65
+ pixels(type?: 'int'): Generator<[x: number, y: number, color: number], [x: number, y: number, color: number]>;
66
+ pixels(type: 'rgba'): Generator<[x: number, y: number, rgba: Uint8Array], [x: number, y: number, rgba: Uint8Array]>;
67
67
  }