@pixerate/editor 0.135.0 → 0.137.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/animation-editor/index.cjs +63 -55
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +8 -5
- package/dist/animation-editor/index.d.ts +8 -5
- package/dist/animation-editor/index.js +10 -2
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/{bezier-J8i4uqSH.d.cts → bezier-CZ2AhjID.d.cts} +1 -1
- package/dist/{bezier-lNEOp0Jx.d.ts → bezier-Dywv3Bw8.d.ts} +1 -1
- package/dist/blending-D7jCmjO6.d.cts +1026 -0
- package/dist/blending-NgF3qo3d.d.ts +1026 -0
- package/dist/brushes-CnvZSYYU.d.cts +744 -0
- package/dist/brushes-DJmUbIgz.d.ts +744 -0
- package/dist/{brushstrokeRender-SII6MG4R.js → brushstrokeRender-2FAXA3XC.js} +13 -16
- package/dist/{brushstrokeRender-SII6MG4R.js.map → brushstrokeRender-2FAXA3XC.js.map} +1 -1
- package/dist/{brushstrokeRender-JNHVEUFG.cjs → brushstrokeRender-IMFY3FF6.cjs} +16 -19
- package/dist/brushstrokeRender-IMFY3FF6.cjs.map +1 -0
- package/dist/canvas/index.cjs +10 -10
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +10 -7
- package/dist/canvas/index.d.ts +10 -7
- package/dist/canvas/index.js +4 -4
- package/dist/{chunk-W4LNKTHT.cjs → chunk-2XS6LTUP.cjs} +63 -63
- package/dist/{chunk-W4LNKTHT.cjs.map → chunk-2XS6LTUP.cjs.map} +1 -1
- package/dist/{chunk-HHTCDFZC.js → chunk-3D77LOBM.js} +234 -136
- package/dist/chunk-3D77LOBM.js.map +1 -0
- package/dist/{chunk-BR7EKQUP.js → chunk-3G6J7UFV.js} +322 -2
- package/dist/chunk-3G6J7UFV.js.map +1 -0
- package/dist/{chunk-62XUO5LB.js → chunk-3X6IAJUQ.js} +2 -2
- package/dist/{chunk-EM3FMJWE.js → chunk-5FSRTP6E.js} +320 -3
- package/dist/chunk-5FSRTP6E.js.map +1 -0
- package/dist/{chunk-Z2H7KECK.cjs → chunk-5OOIUXNJ.cjs} +345 -247
- package/dist/chunk-5OOIUXNJ.cjs.map +1 -0
- package/dist/{chunk-7RJ6P7MI.js → chunk-6S6362D2.js} +2 -2
- package/dist/chunk-A3BVTI3G.js +150 -0
- package/dist/chunk-A3BVTI3G.js.map +1 -0
- package/dist/{chunk-24ATT2PE.cjs → chunk-AEAAN4AD.cjs} +120 -120
- package/dist/{chunk-24ATT2PE.cjs.map → chunk-AEAAN4AD.cjs.map} +1 -1
- package/dist/chunk-ECCXGELC.cjs +727 -0
- package/dist/chunk-ECCXGELC.cjs.map +1 -0
- package/dist/{chunk-SVYE5HIM.js → chunk-EQQMGO42.js} +2 -2
- package/dist/{chunk-FHPVDTI2.cjs → chunk-F2Y4E4GU.cjs} +22 -22
- package/dist/{chunk-FHPVDTI2.cjs.map → chunk-F2Y4E4GU.cjs.map} +1 -1
- package/dist/{chunk-OXSV64JX.js → chunk-G6IKY6PL.js} +4 -4
- package/dist/{chunk-UYQUPUR6.js → chunk-HUO3TI4C.js} +3 -3
- package/dist/chunk-I52DRGGJ.js +727 -0
- package/dist/chunk-I52DRGGJ.js.map +1 -0
- package/dist/{chunk-DDSO4HS7.cjs → chunk-KEENUAFN.cjs} +2 -2
- package/dist/{chunk-DDSO4HS7.cjs.map → chunk-KEENUAFN.cjs.map} +1 -1
- package/dist/{chunk-2HC4DRF4.js → chunk-LLFHCSU2.js} +2 -2
- package/dist/{chunk-J5BA3BQ6.cjs → chunk-O7LUD7MH.cjs} +323 -3
- package/dist/chunk-O7LUD7MH.cjs.map +1 -0
- package/dist/{chunk-ILYFOJUN.js → chunk-OIBIRXRG.js} +3 -3
- package/dist/{chunk-FWEO3HSL.js → chunk-PQQF5KOW.js} +8 -8
- package/dist/{chunk-T6TV6HY6.cjs → chunk-PRSRYHQD.cjs} +36 -36
- package/dist/{chunk-T6TV6HY6.cjs.map → chunk-PRSRYHQD.cjs.map} +1 -1
- package/dist/chunk-Q6OUXEK3.cjs +150 -0
- package/dist/chunk-Q6OUXEK3.cjs.map +1 -0
- package/dist/{chunk-6GFRKLLS.cjs → chunk-QBWEH3IM.cjs} +429 -112
- package/dist/chunk-QBWEH3IM.cjs.map +1 -0
- package/dist/{chunk-ESIWZMMK.js → chunk-SYT2TLQF.js} +35 -37
- package/dist/{chunk-ESIWZMMK.js.map → chunk-SYT2TLQF.js.map} +1 -1
- package/dist/{chunk-YT3JL7YM.cjs → chunk-TLCTTQFF.cjs} +53 -53
- package/dist/{chunk-YT3JL7YM.cjs.map → chunk-TLCTTQFF.cjs.map} +1 -1
- package/dist/{chunk-P3RQ5UJE.cjs → chunk-UTQKC66X.cjs} +4 -4
- package/dist/{chunk-P3RQ5UJE.cjs.map → chunk-UTQKC66X.cjs.map} +1 -1
- package/dist/{chunk-J3B45HTA.cjs → chunk-XB25WOC2.cjs} +6 -6
- package/dist/{chunk-J3B45HTA.cjs.map → chunk-XB25WOC2.cjs.map} +1 -1
- package/dist/{chunk-YAFS2QFZ.cjs → chunk-XN2NBLV5.cjs} +313 -315
- package/dist/chunk-XN2NBLV5.cjs.map +1 -0
- package/dist/effects/index.d.cts +7 -4
- package/dist/effects/index.d.ts +7 -4
- package/dist/{export-DMeG6E06.d.ts → export-41rL6Cne.d.ts} +1 -1
- package/dist/{export-AZSwX087.d.cts → export-CyJdfP_Z.d.cts} +5 -4
- package/dist/{export-KzubBKo7.d.cts → export-D9mXp05Q.d.cts} +1 -1
- package/dist/{export-BDkyDNM8.d.ts → export-DwnZ_hvQ.d.ts} +5 -4
- package/dist/extensions/index.cjs +3 -3
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/generation/index.cjs +150 -945
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.d.cts +3 -423
- package/dist/generation/index.d.ts +3 -423
- package/dist/generation/index.js +59 -854
- package/dist/generation/index.js.map +1 -1
- package/dist/grammar/index.cjs +3 -3
- package/dist/grammar/index.cjs.map +1 -1
- package/dist/grammar/index.js +2 -2
- package/dist/{helpers-Coa4e2j_.d.ts → helpers-C-RgeyvH.d.ts} +25 -8
- package/dist/{helpers-DHl28yLO.d.cts → helpers-v6GMazzg.d.cts} +25 -8
- package/dist/image-editor/index.cjs +986 -986
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +15 -11
- package/dist/image-editor/index.d.ts +15 -11
- package/dist/image-editor/index.js +94 -94
- package/dist/index.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36 -36
- package/dist/{opentype-BWR7Qv8W.d.cts → opentype-KR_jj6b_.d.cts} +1 -1
- package/dist/{opentype-Dfcx6wFx.d.ts → opentype-a1KAW-qs.d.ts} +1 -1
- package/dist/paint/index.cjs +5 -8
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +4 -2
- package/dist/paint/index.d.ts +4 -2
- package/dist/paint/index.js +15 -18
- package/dist/paint-editor/index.cjs +405 -403
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +15 -748
- package/dist/paint-editor/index.d.ts +15 -748
- package/dist/paint-editor/index.js +79 -77
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/{pathfinder-D8KQ6blQ.d.cts → pathfinder-BHS4vQNm.d.cts} +1 -1
- package/dist/{pathfinder-Celbi3e6.d.ts → pathfinder-BVvTIBMo.d.ts} +1 -1
- package/dist/{pool-8JZGWHvR.d.ts → pool-CZQOrSXZ.d.ts} +1 -1
- package/dist/{pool-BfuxBKTd.d.cts → pool-FjZZmZ80.d.cts} +1 -1
- package/dist/provenance-DmlcgdzT.d.cts +426 -0
- package/dist/provenance-uh5r2TQ8.d.ts +426 -0
- package/dist/rand-8xbUb6ur.d.ts +1118 -0
- package/dist/rand-Cw9VLrVC.d.cts +1118 -0
- package/dist/raster/index.cjs +17 -19
- package/dist/raster/index.cjs.map +1 -1
- package/dist/raster/index.js +9 -11
- package/dist/raster/index.js.map +1 -1
- package/dist/{svg-CxxqG3_W.d.ts → svg-CSz3mzkw.d.ts} +2 -2
- package/dist/{svg-pwXWq6s2.d.cts → svg-DTb40ICU.d.cts} +2 -2
- package/dist/{tools-y1M6O3UT.d.ts → tools-B0wXP5cF.d.ts} +1 -1
- package/dist/{tools-3EBjR91b.d.cts → tools-Ca0kI1qo.d.cts} +1 -1
- package/dist/vector/index.cjs +2698 -1674
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +390 -72
- package/dist/vector/index.d.ts +390 -72
- package/dist/vector/index.js +1665 -641
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.d.cts +7 -4
- package/dist/video-editor/index.d.ts +7 -4
- package/dist/{warp-Ceqdz7kj.d.cts → warp-DTOp0lON.d.cts} +1 -1
- package/dist/{warp-C1gwu2G_.d.ts → warp-pd7hrH4T.d.ts} +1 -1
- package/package.json +1 -1
- package/skills/pixerate-vector/SKILL.md +22 -0
- package/dist/brushstrokeRender-JNHVEUFG.cjs.map +0 -1
- package/dist/chunk-64PYNEHJ.js +0 -340
- package/dist/chunk-64PYNEHJ.js.map +0 -1
- package/dist/chunk-6GFRKLLS.cjs.map +0 -1
- package/dist/chunk-7QN76ESJ.js +0 -323
- package/dist/chunk-7QN76ESJ.js.map +0 -1
- package/dist/chunk-BR7EKQUP.js.map +0 -1
- package/dist/chunk-DCLJNVZS.cjs +0 -323
- package/dist/chunk-DCLJNVZS.cjs.map +0 -1
- package/dist/chunk-EM3FMJWE.js.map +0 -1
- package/dist/chunk-HHTCDFZC.js.map +0 -1
- package/dist/chunk-J5BA3BQ6.cjs.map +0 -1
- package/dist/chunk-YAFS2QFZ.cjs.map +0 -1
- package/dist/chunk-Z2H7KECK.cjs.map +0 -1
- package/dist/chunk-Z6OUCS2K.cjs +0 -340
- package/dist/chunk-Z6OUCS2K.cjs.map +0 -1
- package/dist/rand-BszBST4s.d.ts +0 -2140
- package/dist/rand-DOH_aMvm.d.cts +0 -2140
- /package/dist/{chunk-62XUO5LB.js.map → chunk-3X6IAJUQ.js.map} +0 -0
- /package/dist/{chunk-7RJ6P7MI.js.map → chunk-6S6362D2.js.map} +0 -0
- /package/dist/{chunk-SVYE5HIM.js.map → chunk-EQQMGO42.js.map} +0 -0
- /package/dist/{chunk-OXSV64JX.js.map → chunk-G6IKY6PL.js.map} +0 -0
- /package/dist/{chunk-UYQUPUR6.js.map → chunk-HUO3TI4C.js.map} +0 -0
- /package/dist/{chunk-2HC4DRF4.js.map → chunk-LLFHCSU2.js.map} +0 -0
- /package/dist/{chunk-ILYFOJUN.js.map → chunk-OIBIRXRG.js.map} +0 -0
- /package/dist/{chunk-FWEO3HSL.js.map → chunk-PQQF5KOW.js.map} +0 -0
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
deflate,
|
|
3
|
+
inflate
|
|
4
|
+
} from "./chunk-6FCKOS2B.js";
|
|
5
|
+
|
|
1
6
|
// src/raster/pigment.ts
|
|
2
7
|
var PIGMENT_BANDS = 36;
|
|
3
8
|
var PIGMENT_LAMBDA_MIN = 380;
|
|
@@ -1336,6 +1341,314 @@ function keepDeepSamples(before, after) {
|
|
|
1336
1341
|
return tiles ? new TiledSurface(ch, tiles, after.defaultValue) : after;
|
|
1337
1342
|
}
|
|
1338
1343
|
|
|
1344
|
+
// src/raster/png.ts
|
|
1345
|
+
var SIGNATURE = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
1346
|
+
var crcTable = null;
|
|
1347
|
+
function crc32(bytes, start, end) {
|
|
1348
|
+
if (!crcTable) {
|
|
1349
|
+
crcTable = new Uint32Array(256);
|
|
1350
|
+
for (let n = 0; n < 256; n++) {
|
|
1351
|
+
let c2 = n;
|
|
1352
|
+
for (let k = 0; k < 8; k++) c2 = c2 & 1 ? 3988292384 ^ c2 >>> 1 : c2 >>> 1;
|
|
1353
|
+
crcTable[n] = c2 >>> 0;
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
let c = 4294967295;
|
|
1357
|
+
for (let i = start; i < end; i++) c = crcTable[(c ^ bytes[i]) & 255] ^ c >>> 8;
|
|
1358
|
+
return (c ^ 4294967295) >>> 0;
|
|
1359
|
+
}
|
|
1360
|
+
function paeth(a, b, c) {
|
|
1361
|
+
const p = a + b - c;
|
|
1362
|
+
const pa = Math.abs(p - a);
|
|
1363
|
+
const pb = Math.abs(p - b);
|
|
1364
|
+
const pc = Math.abs(p - c);
|
|
1365
|
+
return pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
|
|
1366
|
+
}
|
|
1367
|
+
function encodePng(width, height, data, channels = 4) {
|
|
1368
|
+
const stride = width * channels;
|
|
1369
|
+
const raw = new Uint8Array((stride + 1) * height);
|
|
1370
|
+
const bpp = channels;
|
|
1371
|
+
const cand = [new Uint8Array(stride), new Uint8Array(stride), new Uint8Array(stride), new Uint8Array(stride), new Uint8Array(stride)];
|
|
1372
|
+
for (let y = 0; y < height; y++) {
|
|
1373
|
+
const row = y * stride;
|
|
1374
|
+
const prevRow = (y - 1) * stride;
|
|
1375
|
+
let best = 0;
|
|
1376
|
+
let bestScore = Infinity;
|
|
1377
|
+
for (let f = 0; f < 5; f++) {
|
|
1378
|
+
const out2 = cand[f];
|
|
1379
|
+
let score = 0;
|
|
1380
|
+
for (let x = 0; x < stride; x++) {
|
|
1381
|
+
const v = data[row + x];
|
|
1382
|
+
const a = x >= bpp ? data[row + x - bpp] : 0;
|
|
1383
|
+
const b = y > 0 ? data[prevRow + x] : 0;
|
|
1384
|
+
const c = x >= bpp && y > 0 ? data[prevRow + x - bpp] : 0;
|
|
1385
|
+
let r;
|
|
1386
|
+
switch (f) {
|
|
1387
|
+
case 0:
|
|
1388
|
+
r = v;
|
|
1389
|
+
break;
|
|
1390
|
+
case 1:
|
|
1391
|
+
r = v - a;
|
|
1392
|
+
break;
|
|
1393
|
+
case 2:
|
|
1394
|
+
r = v - b;
|
|
1395
|
+
break;
|
|
1396
|
+
case 3:
|
|
1397
|
+
r = v - (a + b >> 1);
|
|
1398
|
+
break;
|
|
1399
|
+
default:
|
|
1400
|
+
r = v - paeth(a, b, c);
|
|
1401
|
+
}
|
|
1402
|
+
r &= 255;
|
|
1403
|
+
out2[x] = r;
|
|
1404
|
+
score += r < 128 ? r : 256 - r;
|
|
1405
|
+
if (score >= bestScore) break;
|
|
1406
|
+
}
|
|
1407
|
+
if (score < bestScore) {
|
|
1408
|
+
bestScore = score;
|
|
1409
|
+
best = f;
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
const o = y * (stride + 1);
|
|
1413
|
+
raw[o] = best;
|
|
1414
|
+
raw.set(cand[best], o + 1);
|
|
1415
|
+
}
|
|
1416
|
+
const idat = deflate(raw);
|
|
1417
|
+
const chunks = [];
|
|
1418
|
+
const ihdr = new Uint8Array(13);
|
|
1419
|
+
writeU32(ihdr, 0, width);
|
|
1420
|
+
writeU32(ihdr, 4, height);
|
|
1421
|
+
ihdr[8] = 8;
|
|
1422
|
+
ihdr[9] = channels === 1 ? 0 : 6;
|
|
1423
|
+
chunks.push(["IHDR", ihdr], ["IDAT", idat], ["IEND", new Uint8Array(0)]);
|
|
1424
|
+
let size = 8;
|
|
1425
|
+
for (const [, d] of chunks) size += 12 + d.length;
|
|
1426
|
+
const out = new Uint8Array(size);
|
|
1427
|
+
out.set(SIGNATURE, 0);
|
|
1428
|
+
let p = 8;
|
|
1429
|
+
for (const [type, d] of chunks) {
|
|
1430
|
+
writeU32(out, p, d.length);
|
|
1431
|
+
for (let i = 0; i < 4; i++) out[p + 4 + i] = type.charCodeAt(i);
|
|
1432
|
+
out.set(d, p + 8);
|
|
1433
|
+
writeU32(out, p + 8 + d.length, crc32(out, p + 4, p + 8 + d.length));
|
|
1434
|
+
p += 12 + d.length;
|
|
1435
|
+
}
|
|
1436
|
+
return out;
|
|
1437
|
+
}
|
|
1438
|
+
function writeU32(b, o, v) {
|
|
1439
|
+
b[o] = v >>> 24;
|
|
1440
|
+
b[o + 1] = v >>> 16 & 255;
|
|
1441
|
+
b[o + 2] = v >>> 8 & 255;
|
|
1442
|
+
b[o + 3] = v & 255;
|
|
1443
|
+
}
|
|
1444
|
+
function readU32(b, o) {
|
|
1445
|
+
return (b[o] << 24 | b[o + 1] << 16 | b[o + 2] << 8 | b[o + 3]) >>> 0;
|
|
1446
|
+
}
|
|
1447
|
+
function isPng(bytes) {
|
|
1448
|
+
return bytes.length > 8 && SIGNATURE.every((v, i) => bytes[i] === v);
|
|
1449
|
+
}
|
|
1450
|
+
function decodePng(bytes, options = {}) {
|
|
1451
|
+
if (!isPng(bytes)) throw new Error("Not a PNG image.");
|
|
1452
|
+
let p = 8;
|
|
1453
|
+
let width = 0;
|
|
1454
|
+
let height = 0;
|
|
1455
|
+
let depth = 0;
|
|
1456
|
+
let type = 0;
|
|
1457
|
+
let interlace = 0;
|
|
1458
|
+
let palette = null;
|
|
1459
|
+
let trns = null;
|
|
1460
|
+
const idat = [];
|
|
1461
|
+
while (p + 8 <= bytes.length) {
|
|
1462
|
+
const len = readU32(bytes, p);
|
|
1463
|
+
const t = String.fromCharCode(bytes[p + 4], bytes[p + 5], bytes[p + 6], bytes[p + 7]);
|
|
1464
|
+
const body = bytes.subarray(p + 8, p + 8 + len);
|
|
1465
|
+
if (p + 12 + len > bytes.length) throw new Error("Truncated PNG.");
|
|
1466
|
+
if (t === "IHDR") {
|
|
1467
|
+
width = readU32(body, 0);
|
|
1468
|
+
height = readU32(body, 4);
|
|
1469
|
+
depth = body[8];
|
|
1470
|
+
type = body[9];
|
|
1471
|
+
interlace = body[12];
|
|
1472
|
+
} else if (t === "PLTE") palette = body;
|
|
1473
|
+
else if (t === "tRNS") trns = body;
|
|
1474
|
+
else if (t === "IDAT") idat.push(body);
|
|
1475
|
+
else if (t === "IEND") break;
|
|
1476
|
+
p += 12 + len;
|
|
1477
|
+
}
|
|
1478
|
+
if (!width || !height) throw new Error("PNG has no image header.");
|
|
1479
|
+
if (interlace) throw new Error("Interlaced PNGs are not supported here; decode them with a canvas.");
|
|
1480
|
+
const maxPixels = options.maxPixels ?? 1 << 28;
|
|
1481
|
+
if (width * height > maxPixels) throw new Error(`PNG is too large (${width}\xD7${height}).`);
|
|
1482
|
+
const samples = type === 0 ? 1 : type === 2 ? 3 : type === 3 ? 1 : type === 4 ? 2 : type === 6 ? 4 : 0;
|
|
1483
|
+
if (!samples || ![1, 2, 4, 8, 16].includes(depth)) throw new Error(`Unsupported PNG format (type ${type}, depth ${depth}).`);
|
|
1484
|
+
let total = 0;
|
|
1485
|
+
for (const c of idat) total += c.length;
|
|
1486
|
+
const z = new Uint8Array(total);
|
|
1487
|
+
let o = 0;
|
|
1488
|
+
for (const c of idat) {
|
|
1489
|
+
z.set(c, o);
|
|
1490
|
+
o += c.length;
|
|
1491
|
+
}
|
|
1492
|
+
const bitsPerPixel = samples * depth;
|
|
1493
|
+
const stride = Math.ceil(width * bitsPerPixel / 8);
|
|
1494
|
+
const raw = inflate(z, { maxOutput: (stride + 1) * height, sizeHint: (stride + 1) * height });
|
|
1495
|
+
if (raw.length < (stride + 1) * height) throw new Error("PNG image data is truncated.");
|
|
1496
|
+
const bpp = Math.max(1, bitsPerPixel >> 3);
|
|
1497
|
+
const lines = new Uint8Array(stride * height);
|
|
1498
|
+
for (let y = 0; y < height; y++) {
|
|
1499
|
+
const f = raw[y * (stride + 1)];
|
|
1500
|
+
const src = y * (stride + 1) + 1;
|
|
1501
|
+
const dst = y * stride;
|
|
1502
|
+
const up = dst - stride;
|
|
1503
|
+
for (let x = 0; x < stride; x++) {
|
|
1504
|
+
const v = raw[src + x];
|
|
1505
|
+
const a = x >= bpp ? lines[dst + x - bpp] : 0;
|
|
1506
|
+
const b = y > 0 ? lines[up + x] : 0;
|
|
1507
|
+
const c = x >= bpp && y > 0 ? lines[up + x - bpp] : 0;
|
|
1508
|
+
let r;
|
|
1509
|
+
switch (f) {
|
|
1510
|
+
case 0:
|
|
1511
|
+
r = v;
|
|
1512
|
+
break;
|
|
1513
|
+
case 1:
|
|
1514
|
+
r = v + a;
|
|
1515
|
+
break;
|
|
1516
|
+
case 2:
|
|
1517
|
+
r = v + b;
|
|
1518
|
+
break;
|
|
1519
|
+
case 3:
|
|
1520
|
+
r = v + (a + b >> 1);
|
|
1521
|
+
break;
|
|
1522
|
+
case 4:
|
|
1523
|
+
r = v + paeth(a, b, c);
|
|
1524
|
+
break;
|
|
1525
|
+
default:
|
|
1526
|
+
throw new Error(`Invalid PNG filter ${f}.`);
|
|
1527
|
+
}
|
|
1528
|
+
lines[dst + x] = r & 255;
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
const sample = (y, i) => {
|
|
1532
|
+
const row = y * stride;
|
|
1533
|
+
if (depth === 8) return lines[row + i];
|
|
1534
|
+
if (depth === 16) return lines[row + i * 2];
|
|
1535
|
+
const perByte = 8 / depth;
|
|
1536
|
+
const byte = lines[row + Math.floor(i / perByte)];
|
|
1537
|
+
const shift = 8 - depth * (i % perByte + 1);
|
|
1538
|
+
const v = byte >> shift & (1 << depth) - 1;
|
|
1539
|
+
return type === 3 ? v : Math.round(v * 255 / ((1 << depth) - 1));
|
|
1540
|
+
};
|
|
1541
|
+
const gray = options.keepGray && type === 0 && !trns;
|
|
1542
|
+
const channels = gray ? 1 : 4;
|
|
1543
|
+
const out = new Uint8ClampedArray(width * height * channels);
|
|
1544
|
+
const trnsGray = trns && type === 0 ? depth === 16 ? trns[0] : sample16(trns, 0, depth) : -1;
|
|
1545
|
+
const trnsRgb = trns && type === 2 ? [0, 1, 2].map((k) => depth === 16 ? trns[k * 2] : sample16(trns, k, depth)) : null;
|
|
1546
|
+
for (let y = 0; y < height; y++) {
|
|
1547
|
+
for (let x = 0; x < width; x++) {
|
|
1548
|
+
const d = (y * width + x) * channels;
|
|
1549
|
+
if (type === 0) {
|
|
1550
|
+
const v = sample(y, x);
|
|
1551
|
+
if (gray) out[d] = v;
|
|
1552
|
+
else {
|
|
1553
|
+
out[d] = out[d + 1] = out[d + 2] = v;
|
|
1554
|
+
out[d + 3] = v === trnsGray && trns ? 0 : 255;
|
|
1555
|
+
}
|
|
1556
|
+
} else if (type === 2) {
|
|
1557
|
+
const r = sample(y, x * 3);
|
|
1558
|
+
const g = sample(y, x * 3 + 1);
|
|
1559
|
+
const b = sample(y, x * 3 + 2);
|
|
1560
|
+
out[d] = r;
|
|
1561
|
+
out[d + 1] = g;
|
|
1562
|
+
out[d + 2] = b;
|
|
1563
|
+
out[d + 3] = trnsRgb && r === trnsRgb[0] && g === trnsRgb[1] && b === trnsRgb[2] ? 0 : 255;
|
|
1564
|
+
} else if (type === 3) {
|
|
1565
|
+
const i = sample(y, x);
|
|
1566
|
+
if (!palette || i * 3 + 2 >= palette.length) throw new Error("PNG palette index out of range.");
|
|
1567
|
+
out[d] = palette[i * 3];
|
|
1568
|
+
out[d + 1] = palette[i * 3 + 1];
|
|
1569
|
+
out[d + 2] = palette[i * 3 + 2];
|
|
1570
|
+
out[d + 3] = trns && i < trns.length ? trns[i] : 255;
|
|
1571
|
+
} else if (type === 4) {
|
|
1572
|
+
const v = sample(y, x * 2);
|
|
1573
|
+
out[d] = out[d + 1] = out[d + 2] = v;
|
|
1574
|
+
out[d + 3] = sample(y, x * 2 + 1);
|
|
1575
|
+
} else {
|
|
1576
|
+
out[d] = sample(y, x * 4);
|
|
1577
|
+
out[d + 1] = sample(y, x * 4 + 1);
|
|
1578
|
+
out[d + 2] = sample(y, x * 4 + 2);
|
|
1579
|
+
out[d + 3] = sample(y, x * 4 + 3);
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
return { width, height, channels, data: out };
|
|
1584
|
+
}
|
|
1585
|
+
function sample16(trns, k, depth) {
|
|
1586
|
+
const v = trns[k * 2] << 8 | trns[k * 2 + 1];
|
|
1587
|
+
if (depth === 8) return v & 255;
|
|
1588
|
+
return Math.round((v & (1 << depth) - 1) * 255 / ((1 << depth) - 1));
|
|
1589
|
+
}
|
|
1590
|
+
var B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
1591
|
+
var B64_INV = null;
|
|
1592
|
+
function bytesToBase64(bytes) {
|
|
1593
|
+
const parts = [];
|
|
1594
|
+
const CHUNK = 3 * 4096;
|
|
1595
|
+
for (let start = 0; start < bytes.length; start += CHUNK) {
|
|
1596
|
+
const end = Math.min(bytes.length, start + CHUNK);
|
|
1597
|
+
let s = "";
|
|
1598
|
+
let i = start;
|
|
1599
|
+
for (; i + 2 < end; i += 3) {
|
|
1600
|
+
const n = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2];
|
|
1601
|
+
s += B64[n >> 18] + B64[n >> 12 & 63] + B64[n >> 6 & 63] + B64[n & 63];
|
|
1602
|
+
}
|
|
1603
|
+
if (i < end) {
|
|
1604
|
+
const n = bytes[i] << 16 | (i + 1 < end ? bytes[i + 1] << 8 : 0);
|
|
1605
|
+
s += B64[n >> 18] + B64[n >> 12 & 63] + (i + 1 < end ? B64[n >> 6 & 63] : "=") + "=";
|
|
1606
|
+
}
|
|
1607
|
+
parts.push(s);
|
|
1608
|
+
}
|
|
1609
|
+
return parts.join("");
|
|
1610
|
+
}
|
|
1611
|
+
function base64ToBytes(text) {
|
|
1612
|
+
if (!B64_INV) {
|
|
1613
|
+
B64_INV = new Int16Array(128).fill(-1);
|
|
1614
|
+
for (let i = 0; i < 64; i++) B64_INV[B64.charCodeAt(i)] = i;
|
|
1615
|
+
B64_INV["-".charCodeAt(0)] = 62;
|
|
1616
|
+
B64_INV["_".charCodeAt(0)] = 63;
|
|
1617
|
+
}
|
|
1618
|
+
const inv = B64_INV;
|
|
1619
|
+
const clean = text.replace(/[\s=]/g, "");
|
|
1620
|
+
const out = new Uint8Array(Math.floor(clean.length * 3 / 4));
|
|
1621
|
+
let bits = 0;
|
|
1622
|
+
let acc = 0;
|
|
1623
|
+
let o = 0;
|
|
1624
|
+
for (let i = 0; i < clean.length; i++) {
|
|
1625
|
+
const c = clean.charCodeAt(i);
|
|
1626
|
+
const v = c < 128 ? inv[c] : -1;
|
|
1627
|
+
if (v < 0) throw new Error("Invalid base64 data.");
|
|
1628
|
+
acc = acc << 6 | v;
|
|
1629
|
+
bits += 6;
|
|
1630
|
+
if (bits >= 8) {
|
|
1631
|
+
bits -= 8;
|
|
1632
|
+
out[o++] = acc >> bits & 255;
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
return out.subarray(0, o);
|
|
1636
|
+
}
|
|
1637
|
+
function parseDataUrl(url) {
|
|
1638
|
+
const m = /^data:([^;,]*)((?:;[^;,]*)*?),/i.exec(url);
|
|
1639
|
+
if (!m) return null;
|
|
1640
|
+
const body = url.slice(m[0].length);
|
|
1641
|
+
const isBase64 = /;base64/i.test(m[2]);
|
|
1642
|
+
if (isBase64) return { mime: m[1] || "text/plain", bytes: base64ToBytes(body) };
|
|
1643
|
+
const text = decodeURIComponent(body);
|
|
1644
|
+
const bytes = new Uint8Array(text.length);
|
|
1645
|
+
for (let i = 0; i < text.length; i++) bytes[i] = text.charCodeAt(i) & 255;
|
|
1646
|
+
return { mime: m[1] || "text/plain", bytes };
|
|
1647
|
+
}
|
|
1648
|
+
function pngDataUrl(width, height, data, channels = 4) {
|
|
1649
|
+
return `data:image/png;base64,${bytesToBase64(encodePng(width, height, data, channels))}`;
|
|
1650
|
+
}
|
|
1651
|
+
|
|
1339
1652
|
export {
|
|
1340
1653
|
PIGMENT_BANDS,
|
|
1341
1654
|
PIGMENT_LAMBDA_MIN,
|
|
@@ -1411,6 +1724,13 @@ export {
|
|
|
1411
1724
|
surfaceFromDeepPixels,
|
|
1412
1725
|
convertSurfaceDepth,
|
|
1413
1726
|
deepBytes,
|
|
1414
|
-
keepDeepSamples
|
|
1727
|
+
keepDeepSamples,
|
|
1728
|
+
encodePng,
|
|
1729
|
+
isPng,
|
|
1730
|
+
decodePng,
|
|
1731
|
+
bytesToBase64,
|
|
1732
|
+
base64ToBytes,
|
|
1733
|
+
parseDataUrl,
|
|
1734
|
+
pngDataUrl
|
|
1415
1735
|
};
|
|
1416
|
-
//# sourceMappingURL=chunk-
|
|
1736
|
+
//# sourceMappingURL=chunk-3G6J7UFV.js.map
|