@pixerate/editor 0.120.0 → 0.122.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/THIRD_PARTY_NOTICES.md +1 -1
- package/dist/{chunk-HTAFDTNR.cjs → chunk-4PUPGALM.cjs} +251 -156
- package/dist/chunk-4PUPGALM.cjs.map +1 -0
- package/dist/{chunk-N3467VD6.js → chunk-7QN76ESJ.js} +1 -179
- package/dist/chunk-7QN76ESJ.js.map +1 -0
- package/dist/{chunk-UMVW2Q66.js → chunk-CLTTLLWA.js} +1090 -982
- package/dist/chunk-CLTTLLWA.js.map +1 -0
- package/dist/{chunk-EJVDBITD.cjs → chunk-DCLJNVZS.cjs} +2 -180
- package/dist/chunk-DCLJNVZS.cjs.map +1 -0
- package/dist/{chunk-WMRIG4XQ.cjs → chunk-DFFBJV3U.cjs} +1855 -1747
- package/dist/chunk-DFFBJV3U.cjs.map +1 -0
- package/dist/chunk-GX332W2C.js +181 -0
- package/dist/chunk-GX332W2C.js.map +1 -0
- package/dist/{chunk-BOWUU4LJ.js → chunk-IX3YKUVK.js} +105 -10
- package/dist/chunk-IX3YKUVK.js.map +1 -0
- package/dist/{chunk-TS5IEUW6.cjs → chunk-K7V27T72.cjs} +178 -3
- package/dist/chunk-K7V27T72.cjs.map +1 -0
- package/dist/chunk-MUUXNRU4.cjs +181 -0
- package/dist/chunk-MUUXNRU4.cjs.map +1 -0
- package/dist/{chunk-YHW26LS2.js → chunk-ZZPGTNXJ.js} +177 -2
- package/dist/chunk-ZZPGTNXJ.js.map +1 -0
- package/dist/{render-B05K68_h.d.ts → deep-DLwKZDFr.d.ts} +143 -134
- package/dist/{render-DnAbIKcs.d.cts → deep-QS3ppbMX.d.cts} +143 -134
- package/dist/{export-D2D8hb_u.d.ts → export-VmTofKIk.d.ts} +11 -4
- package/dist/{export-fP2hZYjm.d.cts → export-jKKj8Fg8.d.cts} +11 -4
- package/dist/image-editor/index.cjs +760 -734
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +18 -6
- package/dist/image-editor/index.d.ts +18 -6
- package/dist/image-editor/index.js +37 -11
- package/dist/image-editor/index.js.map +1 -1
- package/dist/paint/index.cjs +22 -2
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +159 -1
- package/dist/paint/index.d.ts +159 -1
- package/dist/paint/index.js +21 -1
- package/dist/paint-editor/index.cjs +95 -94
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +2 -2
- package/dist/paint-editor/index.d.ts +2 -2
- package/dist/paint-editor/index.js +12 -11
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/raster/index.cjs +5 -4
- package/dist/raster/index.cjs.map +1 -1
- package/dist/raster/index.d.cts +29 -7
- package/dist/raster/index.d.ts +29 -7
- package/dist/raster/index.js +11 -10
- package/dist/vector/index.cjs +14 -12
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.js +7 -5
- package/dist/vector/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/pixerate-canvas/SKILL.md +23 -1
- package/skills/pixerate-image-editor/SKILL.md +7 -1
- package/skills/pixerate-image-editor/references/photoshop-files.md +4 -3
- package/skills/pixerate-paint-editor/SKILL.md +32 -7
- package/dist/chunk-BOWUU4LJ.js.map +0 -1
- package/dist/chunk-EJVDBITD.cjs.map +0 -1
- package/dist/chunk-HTAFDTNR.cjs.map +0 -1
- package/dist/chunk-N3467VD6.js.map +0 -1
- package/dist/chunk-TS5IEUW6.cjs.map +0 -1
- package/dist/chunk-UMVW2Q66.js.map +0 -1
- package/dist/chunk-WMRIG4XQ.cjs.map +0 -1
- package/dist/chunk-YHW26LS2.js.map +0 -1
|
@@ -3,169 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
var _chunk643B2HKCcjs = require('./chunk-643B2HKC.cjs');
|
|
5
5
|
|
|
6
|
-
// src/geom/homography.ts
|
|
7
|
-
var IDENTITY_HOMOGRAPHY = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
8
|
-
function solve8(rows) {
|
|
9
|
-
const m = rows.map((r) => r.slice());
|
|
10
|
-
for (let col = 0; col < 8; col++) {
|
|
11
|
-
let pivot = col;
|
|
12
|
-
for (let r = col + 1; r < 8; r++) if (Math.abs(m[r][col]) > Math.abs(m[pivot][col])) pivot = r;
|
|
13
|
-
if (!(Math.abs(m[pivot][col]) >= 1e-12)) return null;
|
|
14
|
-
[m[col], m[pivot]] = [m[pivot], m[col]];
|
|
15
|
-
const p = m[col];
|
|
16
|
-
for (let r = 0; r < 8; r++) {
|
|
17
|
-
if (r === col) continue;
|
|
18
|
-
const f = m[r][col] / p[col];
|
|
19
|
-
if (f !== 0) for (let k = 0; k < 9; k++) m[r][k] -= f * p[k];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const out = [];
|
|
23
|
-
for (let i = 0; i < 8; i++) {
|
|
24
|
-
const v = m[i][8] / m[i][i];
|
|
25
|
-
if (!Number.isFinite(v)) return null;
|
|
26
|
-
out.push(v);
|
|
27
|
-
}
|
|
28
|
-
return out;
|
|
29
|
-
}
|
|
30
|
-
function applyHomography(h, p) {
|
|
31
|
-
const w = h[6] * p.x + h[7] * p.y + h[8];
|
|
32
|
-
if (!Number.isFinite(w) || Math.abs(w) < 1e-12) return null;
|
|
33
|
-
const x = (h[0] * p.x + h[1] * p.y + h[2]) / w;
|
|
34
|
-
const y = (h[3] * p.x + h[4] * p.y + h[5]) / w;
|
|
35
|
-
return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;
|
|
36
|
-
}
|
|
37
|
-
function homographyW(h, p) {
|
|
38
|
-
return h[6] * p.x + h[7] * p.y + h[8];
|
|
39
|
-
}
|
|
40
|
-
var finite = (p) => Number.isFinite(p.x) && Number.isFinite(p.y);
|
|
41
|
-
function homographyFromPoints(from, to) {
|
|
42
|
-
if (from.length !== 4 || to.length !== 4 || ![...from, ...to].every(finite)) return null;
|
|
43
|
-
const rows = [];
|
|
44
|
-
for (let i = 0; i < 4; i++) {
|
|
45
|
-
const { x, y } = from[i];
|
|
46
|
-
const { x: u, y: v } = to[i];
|
|
47
|
-
rows.push([x, y, 1, 0, 0, 0, -u * x, -u * y, u]);
|
|
48
|
-
rows.push([0, 0, 0, x, y, 1, -v * x, -v * y, v]);
|
|
49
|
-
}
|
|
50
|
-
const h = solve8(rows);
|
|
51
|
-
if (!h) return null;
|
|
52
|
-
const out = [h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7], 1];
|
|
53
|
-
for (let i = 0; i < 4; i++) {
|
|
54
|
-
const r = applyHomography(out, from[i]);
|
|
55
|
-
const q = to[i];
|
|
56
|
-
const scale = 1 + Math.max(Math.abs(q.x), Math.abs(q.y));
|
|
57
|
-
if (!r || Math.abs(r.x - q.x) > 1e-6 * scale || Math.abs(r.y - q.y) > 1e-6 * scale) return null;
|
|
58
|
-
}
|
|
59
|
-
return out;
|
|
60
|
-
}
|
|
61
|
-
function homographyKeepsQuad(h, quad) {
|
|
62
|
-
const ws = quad.map((p) => h[6] * p.x + h[7] * p.y + h[8]);
|
|
63
|
-
return ws.every((w) => w > 1e-9) || ws.every((w) => w < -1e-9);
|
|
64
|
-
}
|
|
65
|
-
function orderQuad(points) {
|
|
66
|
-
if (points.length !== 4 || !points.every(finite)) return null;
|
|
67
|
-
const cx = points.reduce((s, p) => s + p.x, 0) / 4;
|
|
68
|
-
const cy = points.reduce((s, p) => s + p.y, 0) / 4;
|
|
69
|
-
const q = points.slice().sort((a, b) => Math.atan2(a.y - cy, a.x - cx) - Math.atan2(b.y - cy, b.x - cx));
|
|
70
|
-
let first = 0;
|
|
71
|
-
for (let i = 1; i < 4; i++) if (q[i].x + q[i].y < q[first].x + q[first].y) first = i;
|
|
72
|
-
const ordered = [...q.slice(first), ...q.slice(0, first)];
|
|
73
|
-
const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
|
|
74
|
-
const turns = ordered.map((_, i) => cross(ordered[i], ordered[(i + 1) % 4], ordered[(i + 2) % 4]));
|
|
75
|
-
const area = turns.reduce((s, t) => s + t, 0) / 2;
|
|
76
|
-
const xs = ordered.map((p) => p.x);
|
|
77
|
-
const ys = ordered.map((p) => p.y);
|
|
78
|
-
const size = Math.max(Math.max(...xs) - Math.min(...xs), Math.max(...ys) - Math.min(...ys));
|
|
79
|
-
const convex = turns.every((t) => t > 1e-9 * size * size);
|
|
80
|
-
return convex && area > 1e-6 * size * size ? ordered : null;
|
|
81
|
-
}
|
|
82
|
-
function multiplyHomographies(a, b) {
|
|
83
|
-
const r = new Array(9);
|
|
84
|
-
for (let i = 0; i < 3; i++) for (let j = 0; j < 3; j++) r[i * 3 + j] = b[i * 3] * a[j] + b[i * 3 + 1] * a[3 + j] + b[i * 3 + 2] * a[6 + j];
|
|
85
|
-
return r;
|
|
86
|
-
}
|
|
87
|
-
function invertHomography(m) {
|
|
88
|
-
const c = [
|
|
89
|
-
m[4] * m[8] - m[5] * m[7],
|
|
90
|
-
m[2] * m[7] - m[1] * m[8],
|
|
91
|
-
m[1] * m[5] - m[2] * m[4],
|
|
92
|
-
m[5] * m[6] - m[3] * m[8],
|
|
93
|
-
m[0] * m[8] - m[2] * m[6],
|
|
94
|
-
m[2] * m[3] - m[0] * m[5],
|
|
95
|
-
m[3] * m[7] - m[4] * m[6],
|
|
96
|
-
m[1] * m[6] - m[0] * m[7],
|
|
97
|
-
m[0] * m[4] - m[1] * m[3]
|
|
98
|
-
];
|
|
99
|
-
const det = m[0] * c[0] + m[1] * c[3] + m[2] * c[6];
|
|
100
|
-
if (!(Math.abs(det) >= 1e-12) || !Number.isFinite(det)) return null;
|
|
101
|
-
return c.map((v) => v / det);
|
|
102
|
-
}
|
|
103
|
-
function homographyFromAffine(m) {
|
|
104
|
-
return [m[0], m[2], m[4], m[1], m[3], m[5], 0, 0, 1];
|
|
105
|
-
}
|
|
106
|
-
function affineFromHomography(h, eps = 1e-12) {
|
|
107
|
-
if (Math.abs(h[6]) > eps * Math.abs(h[8]) || Math.abs(h[7]) > eps * Math.abs(h[8]) || !h[8]) return null;
|
|
108
|
-
const w = h[8];
|
|
109
|
-
return [h[0] / w, h[3] / w, h[1] / w, h[4] / w, h[2] / w, h[5] / w];
|
|
110
|
-
}
|
|
111
|
-
function isIdentityHomography(h, eps = 1e-9) {
|
|
112
|
-
const w = h[8];
|
|
113
|
-
if (Math.abs(w) < 1e-12) return false;
|
|
114
|
-
const id = IDENTITY_HOMOGRAPHY;
|
|
115
|
-
for (let i = 0; i < 8; i++) if (Math.abs(h[i] / w - id[i]) > eps) return false;
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
function squareToQuad(q) {
|
|
119
|
-
const [p0, p1, p2, p3] = q;
|
|
120
|
-
const sx = p0.x - p1.x + p2.x - p3.x;
|
|
121
|
-
const sy = p0.y - p1.y + p2.y - p3.y;
|
|
122
|
-
if (Math.abs(sx) < 1e-12 && Math.abs(sy) < 1e-12) {
|
|
123
|
-
return [p1.x - p0.x, p3.x - p0.x, p0.x, p1.y - p0.y, p3.y - p0.y, p0.y, 0, 0, 1];
|
|
124
|
-
}
|
|
125
|
-
const dx1 = p1.x - p2.x;
|
|
126
|
-
const dx2 = p3.x - p2.x;
|
|
127
|
-
const dy1 = p1.y - p2.y;
|
|
128
|
-
const dy2 = p3.y - p2.y;
|
|
129
|
-
const den = dx1 * dy2 - dx2 * dy1;
|
|
130
|
-
if (Math.abs(den) < 1e-12) return null;
|
|
131
|
-
const g = (sx * dy2 - dx2 * sy) / den;
|
|
132
|
-
const h = (dx1 * sy - sx * dy1) / den;
|
|
133
|
-
return [p1.x - p0.x + g * p1.x, p3.x - p0.x + h * p3.x, p0.x, p1.y - p0.y + g * p1.y, p3.y - p0.y + h * p3.y, p0.y, g, h, 1];
|
|
134
|
-
}
|
|
135
|
-
function rectToQuad(r, quad) {
|
|
136
|
-
if (!(r.width > 0 && r.height > 0) || quad.length !== 4 || !quad.every(finite)) return null;
|
|
137
|
-
const toUnit = [1 / r.width, 0, -r.x / r.width, 0, 1 / r.height, -r.y / r.height, 0, 0, 1];
|
|
138
|
-
const sq = squareToQuad(quad);
|
|
139
|
-
if (!sq) return null;
|
|
140
|
-
const h = multiplyHomographies(toUnit, sq);
|
|
141
|
-
return invertHomography(h) ? h : null;
|
|
142
|
-
}
|
|
143
|
-
function boxQuad(r) {
|
|
144
|
-
return [
|
|
145
|
-
{ x: r.x, y: r.y },
|
|
146
|
-
{ x: r.x + r.width, y: r.y },
|
|
147
|
-
{ x: r.x + r.width, y: r.y + r.height },
|
|
148
|
-
{ x: r.x, y: r.y + r.height }
|
|
149
|
-
];
|
|
150
|
-
}
|
|
151
|
-
function homographyFrontSide(h, r) {
|
|
152
|
-
const ahead = boxQuad(r).filter((p) => homographyW(h, p) > 0).length;
|
|
153
|
-
if (ahead >= 3) return 1;
|
|
154
|
-
if (ahead <= 1) return -1;
|
|
155
|
-
return homographyW(h, { x: r.x + r.width / 2, y: r.y + r.height / 2 }) >= 0 ? 1 : -1;
|
|
156
|
-
}
|
|
157
|
-
var OUTPUT_LIMIT = 1 << 20;
|
|
158
|
-
function cornerBounds(corners) {
|
|
159
|
-
const lim = OUTPUT_LIMIT;
|
|
160
|
-
const xs = corners.map((c) => c.x);
|
|
161
|
-
const ys = corners.map((c) => c.y);
|
|
162
|
-
const x0 = Math.floor(Math.max(-lim, Math.min(...xs))) - 1;
|
|
163
|
-
const y0 = Math.floor(Math.max(-lim, Math.min(...ys))) - 1;
|
|
164
|
-
const x1 = Math.ceil(Math.min(lim, Math.max(...xs))) + 1;
|
|
165
|
-
const y1 = Math.ceil(Math.min(lim, Math.max(...ys))) + 1;
|
|
166
|
-
return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };
|
|
167
|
-
}
|
|
168
|
-
|
|
169
6
|
// src/raster/png.ts
|
|
170
7
|
var SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
171
8
|
var crcTable = null;
|
|
@@ -482,20 +319,5 @@ function pngDataUrl(width, height, data, channels = 4) {
|
|
|
482
319
|
|
|
483
320
|
|
|
484
321
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
exports.solve8 = solve8; exports.applyHomography = applyHomography; exports.homographyW = homographyW; exports.homographyFromPoints = homographyFromPoints; exports.homographyKeepsQuad = homographyKeepsQuad; exports.orderQuad = orderQuad; exports.multiplyHomographies = multiplyHomographies; exports.invertHomography = invertHomography; exports.homographyFromAffine = homographyFromAffine; exports.affineFromHomography = affineFromHomography; exports.isIdentityHomography = isIdentityHomography; exports.rectToQuad = rectToQuad; exports.boxQuad = boxQuad; exports.homographyFrontSide = homographyFrontSide; exports.cornerBounds = cornerBounds; exports.encodePng = encodePng; exports.isPng = isPng; exports.decodePng = decodePng; exports.bytesToBase64 = bytesToBase64; exports.base64ToBytes = base64ToBytes; exports.parseDataUrl = parseDataUrl; exports.pngDataUrl = pngDataUrl;
|
|
501
|
-
//# sourceMappingURL=chunk-EJVDBITD.cjs.map
|
|
322
|
+
exports.encodePng = encodePng; exports.isPng = isPng; exports.decodePng = decodePng; exports.bytesToBase64 = bytesToBase64; exports.base64ToBytes = base64ToBytes; exports.parseDataUrl = parseDataUrl; exports.pngDataUrl = pngDataUrl;
|
|
323
|
+
//# sourceMappingURL=chunk-DCLJNVZS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-DCLJNVZS.cjs","../src/raster/png.ts"],"names":["c","out"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-DCLJNVZS.cjs","sourcesContent":[null,"/**\n * Dependency-free, synchronous PNG encode / decode for layer pixels and masks, plus base64 and\n * data-URL helpers. Canvas `toDataURL` is lossy for partly transparent pixels (it goes through\n * premultiplied alpha), so layer assets use this codec and round-trip exactly.\n *\n * Encodes 8-bit greyscale (masks) or RGBA (layers). Decodes non-interlaced 1/2/4/8/16-bit\n * greyscale, RGB, palette, grey + alpha and RGBA, always to 8-bit RGBA or grey.\n */\n\nimport { deflate, inflate } from './zlib';\n\nconst SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10];\n\nlet crcTable: Uint32Array | null = null;\nfunction crc32(bytes: Uint8Array, start: number, end: number): number {\n if (!crcTable) {\n crcTable = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n crcTable[n] = c >>> 0;\n }\n }\n let c = 0xffffffff;\n for (let i = start; i < end; i++) c = crcTable[(c ^ bytes[i]) & 255] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\nexport interface DecodedPng {\n width: number;\n height: number;\n /** 4 for RGBA output, 1 for greyscale without alpha when `keepGray` was asked for. */\n channels: 1 | 4;\n data: Uint8ClampedArray;\n}\n\nfunction paeth(a: number, b: number, c: number): number {\n const p = a + b - c;\n const pa = Math.abs(p - a);\n const pb = Math.abs(p - b);\n const pc = Math.abs(p - c);\n return pa <= pb && pa <= pc ? a : pb <= pc ? b : c;\n}\n\n/** PNG bytes for `width × height` pixels of 1 (grey) or 4 (RGBA) bytes each. */\nexport function encodePng(width: number, height: number, data: ArrayLike<number>, channels: 1 | 4 = 4): Uint8Array {\n const stride = width * channels;\n const raw = new Uint8Array((stride + 1) * height);\n const bpp = channels;\n const cand = [new Uint8Array(stride), new Uint8Array(stride), new Uint8Array(stride), new Uint8Array(stride), new Uint8Array(stride)];\n for (let y = 0; y < height; y++) {\n const row = y * stride;\n const prevRow = (y - 1) * stride;\n // Try each filter and keep the one with the smallest sum of signed residues.\n let best = 0;\n let bestScore = Infinity;\n for (let f = 0; f < 5; f++) {\n const out = cand[f];\n let score = 0;\n for (let x = 0; x < stride; x++) {\n const v = data[row + x];\n const a = x >= bpp ? data[row + x - bpp] : 0;\n const b = y > 0 ? data[prevRow + x] : 0;\n const c = x >= bpp && y > 0 ? data[prevRow + x - bpp] : 0;\n let r: number;\n switch (f) {\n case 0: r = v; break;\n case 1: r = v - a; break;\n case 2: r = v - b; break;\n case 3: r = v - ((a + b) >> 1); break;\n default: r = v - paeth(a, b, c);\n }\n r &= 255;\n out[x] = r;\n score += r < 128 ? r : 256 - r;\n if (score >= bestScore) break;\n }\n if (score < bestScore) {\n bestScore = score;\n best = f;\n }\n }\n const o = y * (stride + 1);\n raw[o] = best;\n // Only a filter whose scoring loop ran to the end can win, so its row is complete.\n raw.set(cand[best], o + 1);\n }\n const idat = deflate(raw);\n const chunks: Array<[string, Uint8Array]> = [];\n const ihdr = new Uint8Array(13);\n writeU32(ihdr, 0, width);\n writeU32(ihdr, 4, height);\n ihdr[8] = 8;\n ihdr[9] = channels === 1 ? 0 : 6;\n chunks.push(['IHDR', ihdr], ['IDAT', idat], ['IEND', new Uint8Array(0)]);\n let size = 8;\n for (const [, d] of chunks) size += 12 + d.length;\n const out = new Uint8Array(size);\n out.set(SIGNATURE, 0);\n let p = 8;\n for (const [type, d] of chunks) {\n writeU32(out, p, d.length);\n for (let i = 0; i < 4; i++) out[p + 4 + i] = type.charCodeAt(i);\n out.set(d, p + 8);\n writeU32(out, p + 8 + d.length, crc32(out, p + 4, p + 8 + d.length));\n p += 12 + d.length;\n }\n return out;\n}\n\nfunction writeU32(b: Uint8Array, o: number, v: number): void {\n b[o] = v >>> 24;\n b[o + 1] = (v >>> 16) & 255;\n b[o + 2] = (v >>> 8) & 255;\n b[o + 3] = v & 255;\n}\n\nfunction readU32(b: Uint8Array, o: number): number {\n return ((b[o] << 24) | (b[o + 1] << 16) | (b[o + 2] << 8) | b[o + 3]) >>> 0;\n}\n\nexport function isPng(bytes: Uint8Array): boolean {\n return bytes.length > 8 && SIGNATURE.every((v, i) => bytes[i] === v);\n}\n\n/**\n * Decodes a PNG. Output is RGBA (4 channels) unless `keepGray` is set and the image is\n * greyscale without alpha, in which case it is one byte per pixel.\n */\nexport function decodePng(bytes: Uint8Array, options: { keepGray?: boolean; maxPixels?: number } = {}): DecodedPng {\n if (!isPng(bytes)) throw new Error('Not a PNG image.');\n let p = 8;\n let width = 0;\n let height = 0;\n let depth = 0;\n let type = 0;\n let interlace = 0;\n let palette: Uint8Array | null = null;\n let trns: Uint8Array | null = null;\n const idat: Uint8Array[] = [];\n while (p + 8 <= bytes.length) {\n const len = readU32(bytes, p);\n const t = String.fromCharCode(bytes[p + 4], bytes[p + 5], bytes[p + 6], bytes[p + 7]);\n const body = bytes.subarray(p + 8, p + 8 + len);\n if (p + 12 + len > bytes.length) throw new Error('Truncated PNG.');\n if (t === 'IHDR') {\n width = readU32(body, 0);\n height = readU32(body, 4);\n depth = body[8];\n type = body[9];\n interlace = body[12];\n } else if (t === 'PLTE') palette = body;\n else if (t === 'tRNS') trns = body;\n else if (t === 'IDAT') idat.push(body);\n else if (t === 'IEND') break;\n p += 12 + len;\n }\n if (!width || !height) throw new Error('PNG has no image header.');\n if (interlace) throw new Error('Interlaced PNGs are not supported here; decode them with a canvas.');\n const maxPixels = options.maxPixels ?? 1 << 28;\n if (width * height > maxPixels) throw new Error(`PNG is too large (${width}×${height}).`);\n const samples = type === 0 ? 1 : type === 2 ? 3 : type === 3 ? 1 : type === 4 ? 2 : type === 6 ? 4 : 0;\n if (!samples || ![1, 2, 4, 8, 16].includes(depth)) throw new Error(`Unsupported PNG format (type ${type}, depth ${depth}).`);\n let total = 0;\n for (const c of idat) total += c.length;\n const z = new Uint8Array(total);\n let o = 0;\n for (const c of idat) {\n z.set(c, o);\n o += c.length;\n }\n const bitsPerPixel = samples * depth;\n const stride = Math.ceil((width * bitsPerPixel) / 8);\n const raw = inflate(z, { maxOutput: (stride + 1) * height, sizeHint: (stride + 1) * height });\n if (raw.length < (stride + 1) * height) throw new Error('PNG image data is truncated.');\n const bpp = Math.max(1, bitsPerPixel >> 3);\n const lines = new Uint8Array(stride * height);\n for (let y = 0; y < height; y++) {\n const f = raw[y * (stride + 1)];\n const src = y * (stride + 1) + 1;\n const dst = y * stride;\n const up = dst - stride;\n for (let x = 0; x < stride; x++) {\n const v = raw[src + x];\n const a = x >= bpp ? lines[dst + x - bpp] : 0;\n const b = y > 0 ? lines[up + x] : 0;\n const c = x >= bpp && y > 0 ? lines[up + x - bpp] : 0;\n let r: number;\n switch (f) {\n case 0: r = v; break;\n case 1: r = v + a; break;\n case 2: r = v + b; break;\n case 3: r = v + ((a + b) >> 1); break;\n case 4: r = v + paeth(a, b, c); break;\n default: throw new Error(`Invalid PNG filter ${f}.`);\n }\n lines[dst + x] = r & 255;\n }\n }\n const sample = (y: number, i: number): number => {\n // The i-th sample of row y, scaled to 8 bits.\n const row = y * stride;\n if (depth === 8) return lines[row + i];\n if (depth === 16) return lines[row + i * 2];\n const perByte = 8 / depth;\n const byte = lines[row + Math.floor(i / perByte)];\n const shift = 8 - depth * ((i % perByte) + 1);\n const v = (byte >> shift) & ((1 << depth) - 1);\n return type === 3 ? v : Math.round((v * 255) / ((1 << depth) - 1));\n };\n const gray = options.keepGray && type === 0 && !trns;\n const channels: 1 | 4 = gray ? 1 : 4;\n const out = new Uint8ClampedArray(width * height * channels);\n const trnsGray = trns && type === 0 ? (depth === 16 ? trns[0] : sample16(trns, 0, depth)) : -1;\n const trnsRgb = trns && type === 2 ? [0, 1, 2].map((k) => (depth === 16 ? trns![k * 2] : sample16(trns!, k, depth))) : null;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const d = (y * width + x) * channels;\n if (type === 0) {\n const v = sample(y, x);\n if (gray) out[d] = v;\n else {\n out[d] = out[d + 1] = out[d + 2] = v;\n out[d + 3] = v === trnsGray && trns ? 0 : 255;\n }\n } else if (type === 2) {\n const r = sample(y, x * 3);\n const g = sample(y, x * 3 + 1);\n const b = sample(y, x * 3 + 2);\n out[d] = r;\n out[d + 1] = g;\n out[d + 2] = b;\n out[d + 3] = trnsRgb && r === trnsRgb[0] && g === trnsRgb[1] && b === trnsRgb[2] ? 0 : 255;\n } else if (type === 3) {\n const i = sample(y, x);\n if (!palette || i * 3 + 2 >= palette.length) throw new Error('PNG palette index out of range.');\n out[d] = palette[i * 3];\n out[d + 1] = palette[i * 3 + 1];\n out[d + 2] = palette[i * 3 + 2];\n out[d + 3] = trns && i < trns.length ? trns[i] : 255;\n } else if (type === 4) {\n const v = sample(y, x * 2);\n out[d] = out[d + 1] = out[d + 2] = v;\n out[d + 3] = sample(y, x * 2 + 1);\n } else {\n out[d] = sample(y, x * 4);\n out[d + 1] = sample(y, x * 4 + 1);\n out[d + 2] = sample(y, x * 4 + 2);\n out[d + 3] = sample(y, x * 4 + 3);\n }\n }\n }\n return { width, height, channels, data: out };\n}\n\n/** A tRNS sample (stored as 16-bit big endian) scaled like the image samples. */\nfunction sample16(trns: Uint8Array, k: number, depth: number): number {\n const v = (trns[k * 2] << 8) | trns[k * 2 + 1];\n if (depth === 8) return v & 255;\n return Math.round(((v & ((1 << depth) - 1)) * 255) / ((1 << depth) - 1));\n}\n\n// ---------------------------------------------------------------------------\n// Base64 / data URLs\n// ---------------------------------------------------------------------------\n\nconst B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nlet B64_INV: Int16Array | null = null;\n\nexport function bytesToBase64(bytes: Uint8Array): string {\n const parts: string[] = [];\n const CHUNK = 3 * 4096;\n for (let start = 0; start < bytes.length; start += CHUNK) {\n const end = Math.min(bytes.length, start + CHUNK);\n let s = '';\n let i = start;\n for (; i + 2 < end; i += 3) {\n const n = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\n s += B64[n >> 18] + B64[(n >> 12) & 63] + B64[(n >> 6) & 63] + B64[n & 63];\n }\n if (i < end) {\n const n = (bytes[i] << 16) | (i + 1 < end ? bytes[i + 1] << 8 : 0);\n s += B64[n >> 18] + B64[(n >> 12) & 63] + (i + 1 < end ? B64[(n >> 6) & 63] : '=') + '=';\n }\n parts.push(s);\n }\n return parts.join('');\n}\n\nexport function base64ToBytes(text: string): Uint8Array {\n if (!B64_INV) {\n B64_INV = new Int16Array(128).fill(-1);\n for (let i = 0; i < 64; i++) B64_INV[B64.charCodeAt(i)] = i;\n B64_INV['-'.charCodeAt(0)] = 62;\n B64_INV['_'.charCodeAt(0)] = 63;\n }\n const inv = B64_INV;\n const clean = text.replace(/[\\s=]/g, '');\n const out = new Uint8Array(Math.floor((clean.length * 3) / 4));\n let bits = 0;\n let acc = 0;\n let o = 0;\n for (let i = 0; i < clean.length; i++) {\n const c = clean.charCodeAt(i);\n const v = c < 128 ? inv[c] : -1;\n if (v < 0) throw new Error('Invalid base64 data.');\n acc = (acc << 6) | v;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out[o++] = (acc >> bits) & 255;\n }\n }\n return out.subarray(0, o);\n}\n\n/** The bytes and MIME type of a `data:` URL (base64 or percent-encoded). */\nexport function parseDataUrl(url: string): { mime: string; bytes: Uint8Array } | null {\n const m = /^data:([^;,]*)((?:;[^;,]*)*?),/i.exec(url);\n if (!m) return null;\n const body = url.slice(m[0].length);\n const isBase64 = /;base64/i.test(m[2]);\n if (isBase64) return { mime: m[1] || 'text/plain', bytes: base64ToBytes(body) };\n const text = decodeURIComponent(body);\n const bytes = new Uint8Array(text.length);\n for (let i = 0; i < text.length; i++) bytes[i] = text.charCodeAt(i) & 255;\n return { mime: m[1] || 'text/plain', bytes };\n}\n\nexport function pngDataUrl(width: number, height: number, data: ArrayLike<number>, channels: 1 | 4 = 4): string {\n return `data:image/png;base64,${bytesToBase64(encodePng(width, height, data, channels))}`;\n}\n"]}
|