@levischuck/tiny-png 0.0.5 → 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/bytes.d.ts +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +71 -63
- package/package.json +3 -2
package/dist/bytes.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function concat(...bytes: Uint8Array[]): Uint8Array
|
|
1
|
+
export declare function concat(...bytes: Uint8Array[]): Uint8Array<ArrayBuffer>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate an indexed-color PNG image, up to
|
|
2
|
+
* Generate an indexed-color PNG image, up to 256 colors are supported
|
|
3
|
+
*
|
|
4
|
+
* Automatically selects the optimal bit depth based on the number of colors used:
|
|
5
|
+
* - 1-bit for 2 or fewer colors
|
|
6
|
+
* - 2-bit for 4 or fewer colors
|
|
7
|
+
* - 4-bit for 16 or fewer colors
|
|
8
|
+
* - 8-bit for up to 256 colors
|
|
3
9
|
*
|
|
4
10
|
* @param input - Pixel data as a Uint8Array where each byte is a palette index
|
|
5
11
|
* @param width - Image width in pixels
|
|
@@ -10,4 +16,4 @@
|
|
|
10
16
|
* @throws Error if the input does not match the dimensions.
|
|
11
17
|
* @throws Error if the input is empty.
|
|
12
18
|
*/
|
|
13
|
-
export declare function indexedPng(input: Uint8Array, width: number, height: number, colors: [number, number, number][]): Promise<Uint8Array
|
|
19
|
+
export declare function indexedPng(input: Uint8Array, width: number, height: number, colors: [number, number, number][]): Promise<Uint8Array<ArrayBuffer>>;
|
package/dist/index.js
CHANGED
|
@@ -1,79 +1,87 @@
|
|
|
1
|
-
function
|
|
2
|
-
const
|
|
3
|
-
|
|
1
|
+
function V(...n) {
|
|
2
|
+
const t = new Uint8Array(
|
|
3
|
+
n.reduceRight((r, o) => r + o.length, 0)
|
|
4
4
|
);
|
|
5
|
-
let
|
|
6
|
-
for (const
|
|
7
|
-
|
|
8
|
-
return
|
|
5
|
+
let e = 0;
|
|
6
|
+
for (const r of n)
|
|
7
|
+
t.set(r, e), e += r.length;
|
|
8
|
+
return t;
|
|
9
9
|
}
|
|
10
|
-
async function
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
let
|
|
10
|
+
async function k(n) {
|
|
11
|
+
const t = new CompressionStream("deflate"), e = t.writable.getWriter();
|
|
12
|
+
e.write(n), e.close();
|
|
13
|
+
const r = t.readable.getReader(), o = [];
|
|
14
|
+
let u = 0;
|
|
15
15
|
for (; ; ) {
|
|
16
|
-
const { done:
|
|
17
|
-
if (
|
|
18
|
-
|
|
16
|
+
const { done: l, value: a } = await r.read();
|
|
17
|
+
if (l) break;
|
|
18
|
+
o.push(a), u += a.length;
|
|
19
19
|
}
|
|
20
|
-
const
|
|
21
|
-
let
|
|
22
|
-
for (const
|
|
23
|
-
|
|
24
|
-
return
|
|
20
|
+
const i = new Uint8Array(u);
|
|
21
|
+
let f = 0;
|
|
22
|
+
for (const l of o)
|
|
23
|
+
i.set(l, f), f += l.length;
|
|
24
|
+
return i;
|
|
25
25
|
}
|
|
26
|
-
const
|
|
27
|
-
for (let
|
|
28
|
-
let
|
|
29
|
-
for (let
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
const d = new Uint32Array(256);
|
|
27
|
+
for (let n = 0; n < 256; n++) {
|
|
28
|
+
let t = n;
|
|
29
|
+
for (let e = 0; e < 8; e++)
|
|
30
|
+
t = t & 1 ? 3988292384 ^ t >>> 1 : t >>> 1;
|
|
31
|
+
d[n] = t;
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
let
|
|
35
|
-
for (let
|
|
36
|
-
|
|
37
|
-
return (
|
|
33
|
+
function x(n) {
|
|
34
|
+
let t = 4294967295;
|
|
35
|
+
for (let e = 0; e < n.length; e++)
|
|
36
|
+
t = d[(t ^ n[e]) & 255] ^ t >>> 8;
|
|
37
|
+
return (t ^ 4294967295) >>> 0;
|
|
38
38
|
}
|
|
39
|
-
const
|
|
40
|
-
function
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
return
|
|
39
|
+
const E = new TextEncoder();
|
|
40
|
+
function p(n, t) {
|
|
41
|
+
const e = new Uint8Array(8 + t.length + 4), r = new DataView(e.buffer);
|
|
42
|
+
r.setUint32(0, t.length), e.set(E.encode(n), 4), e.set(t, 8);
|
|
43
|
+
const o = x(e.subarray(4, e.length - 4));
|
|
44
|
+
return r.setUint32(e.length - 4, o), e;
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
function R(n) {
|
|
47
|
+
return n <= 1 ? 1 : n <= 3 ? 2 : n <= 15 ? 4 : 8;
|
|
48
|
+
}
|
|
49
|
+
function m(n, t, e, r) {
|
|
50
|
+
const o = 8 / r, i = Math.ceil(t / o) + 1, f = new Uint8Array(i * e), l = new DataView(f.buffer);
|
|
51
|
+
for (let a = 0; a < e; a++) {
|
|
52
|
+
l.setUint8(a * i, 0);
|
|
53
|
+
for (let s = 0; s < t; s++) {
|
|
54
|
+
const g = n.getUint8(a * t + s), w = a * i + 1 + Math.floor(s / o), U = (o - 1 - s % o) * r, y = l.getUint8(w);
|
|
55
|
+
l.setUint8(w, y | g << U);
|
|
56
|
+
}
|
|
52
57
|
}
|
|
53
|
-
|
|
58
|
+
return f;
|
|
59
|
+
}
|
|
60
|
+
async function P(n, t, e, r) {
|
|
61
|
+
const o = new DataView(n.buffer), u = o.byteLength;
|
|
62
|
+
if (u === 0)
|
|
63
|
+
throw new Error("Received empty input");
|
|
64
|
+
if (u !== t * e)
|
|
54
65
|
throw new Error(
|
|
55
|
-
`
|
|
66
|
+
`Input does not match dimensions ${t}x${e}. Only ${u} bytes were given when ${t * e} are expected!`
|
|
56
67
|
);
|
|
57
|
-
|
|
68
|
+
let i = 0;
|
|
69
|
+
for (let c = 0; c < u; c++) {
|
|
70
|
+
const h = o.getUint8(c);
|
|
71
|
+
h > i && (i = h);
|
|
72
|
+
}
|
|
73
|
+
if (r.length <= i)
|
|
58
74
|
throw new Error(
|
|
59
|
-
`
|
|
75
|
+
`Color palette does not have enough colors (${i + 1}). Only ${r.length} were given!`
|
|
60
76
|
);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const D = w("PLTE", p), d = e + 1, U = new Uint8Array(d * t), b = new DataView(U.buffer);
|
|
69
|
-
for (let n = 0; n < t; n++) {
|
|
70
|
-
U[n * d] = 0;
|
|
71
|
-
for (let f = 0; f < e; f++)
|
|
72
|
-
b.setUint8(n * d + 1 + f, i.getUint8(n * e + f));
|
|
73
|
-
}
|
|
74
|
-
const A = w("IDAT", await E(U)), m = w("IEND", new Uint8Array(0));
|
|
75
|
-
return x(u, y, D, A, m);
|
|
77
|
+
const f = R(i), l = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]), a = new Uint8Array(13), s = new DataView(a.buffer);
|
|
78
|
+
s.setUint32(0, t), s.setUint32(4, e), s.setUint8(8, f), s.setUint8(9, 3), s.setUint8(10, 0), s.setUint8(11, 0), s.setUint8(12, 0);
|
|
79
|
+
const g = p("IHDR", a), w = new Uint8Array(r.length * 3), U = new DataView(w.buffer);
|
|
80
|
+
for (let c = 0; c <= i; c++)
|
|
81
|
+
U.setUint8(c * 3, r[c][0]), U.setUint8(c * 3 + 1, r[c][1]), U.setUint8(c * 3 + 2, r[c][2]);
|
|
82
|
+
const y = p("PLTE", w), b = m(o, t, e, f), D = p("IDAT", await k(b)), A = p("IEND", new Uint8Array(0));
|
|
83
|
+
return V(l, g, y, D, A);
|
|
76
84
|
}
|
|
77
85
|
export {
|
|
78
|
-
|
|
86
|
+
P as indexedPng
|
|
79
87
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@levischuck/tiny-png",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "vite build",
|
|
34
34
|
"type-check": "bunx tsc --noEmit",
|
|
35
|
-
"build:jsr": "echo Nothing to build"
|
|
35
|
+
"build:jsr": "echo Nothing to build",
|
|
36
|
+
"lint": "oxlint -c ../../.oxlintrc.json"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
39
|
"@types/bun": "latest"
|