@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.
Files changed (164) hide show
  1. package/dist/animation-editor/index.cjs +63 -55
  2. package/dist/animation-editor/index.cjs.map +1 -1
  3. package/dist/animation-editor/index.d.cts +8 -5
  4. package/dist/animation-editor/index.d.ts +8 -5
  5. package/dist/animation-editor/index.js +10 -2
  6. package/dist/animation-editor/index.js.map +1 -1
  7. package/dist/{bezier-J8i4uqSH.d.cts → bezier-CZ2AhjID.d.cts} +1 -1
  8. package/dist/{bezier-lNEOp0Jx.d.ts → bezier-Dywv3Bw8.d.ts} +1 -1
  9. package/dist/blending-D7jCmjO6.d.cts +1026 -0
  10. package/dist/blending-NgF3qo3d.d.ts +1026 -0
  11. package/dist/brushes-CnvZSYYU.d.cts +744 -0
  12. package/dist/brushes-DJmUbIgz.d.ts +744 -0
  13. package/dist/{brushstrokeRender-SII6MG4R.js → brushstrokeRender-2FAXA3XC.js} +13 -16
  14. package/dist/{brushstrokeRender-SII6MG4R.js.map → brushstrokeRender-2FAXA3XC.js.map} +1 -1
  15. package/dist/{brushstrokeRender-JNHVEUFG.cjs → brushstrokeRender-IMFY3FF6.cjs} +16 -19
  16. package/dist/brushstrokeRender-IMFY3FF6.cjs.map +1 -0
  17. package/dist/canvas/index.cjs +10 -10
  18. package/dist/canvas/index.cjs.map +1 -1
  19. package/dist/canvas/index.d.cts +10 -7
  20. package/dist/canvas/index.d.ts +10 -7
  21. package/dist/canvas/index.js +4 -4
  22. package/dist/{chunk-W4LNKTHT.cjs → chunk-2XS6LTUP.cjs} +63 -63
  23. package/dist/{chunk-W4LNKTHT.cjs.map → chunk-2XS6LTUP.cjs.map} +1 -1
  24. package/dist/{chunk-HHTCDFZC.js → chunk-3D77LOBM.js} +234 -136
  25. package/dist/chunk-3D77LOBM.js.map +1 -0
  26. package/dist/{chunk-BR7EKQUP.js → chunk-3G6J7UFV.js} +322 -2
  27. package/dist/chunk-3G6J7UFV.js.map +1 -0
  28. package/dist/{chunk-62XUO5LB.js → chunk-3X6IAJUQ.js} +2 -2
  29. package/dist/{chunk-EM3FMJWE.js → chunk-5FSRTP6E.js} +320 -3
  30. package/dist/chunk-5FSRTP6E.js.map +1 -0
  31. package/dist/{chunk-Z2H7KECK.cjs → chunk-5OOIUXNJ.cjs} +345 -247
  32. package/dist/chunk-5OOIUXNJ.cjs.map +1 -0
  33. package/dist/{chunk-7RJ6P7MI.js → chunk-6S6362D2.js} +2 -2
  34. package/dist/chunk-A3BVTI3G.js +150 -0
  35. package/dist/chunk-A3BVTI3G.js.map +1 -0
  36. package/dist/{chunk-24ATT2PE.cjs → chunk-AEAAN4AD.cjs} +120 -120
  37. package/dist/{chunk-24ATT2PE.cjs.map → chunk-AEAAN4AD.cjs.map} +1 -1
  38. package/dist/chunk-ECCXGELC.cjs +727 -0
  39. package/dist/chunk-ECCXGELC.cjs.map +1 -0
  40. package/dist/{chunk-SVYE5HIM.js → chunk-EQQMGO42.js} +2 -2
  41. package/dist/{chunk-FHPVDTI2.cjs → chunk-F2Y4E4GU.cjs} +22 -22
  42. package/dist/{chunk-FHPVDTI2.cjs.map → chunk-F2Y4E4GU.cjs.map} +1 -1
  43. package/dist/{chunk-OXSV64JX.js → chunk-G6IKY6PL.js} +4 -4
  44. package/dist/{chunk-UYQUPUR6.js → chunk-HUO3TI4C.js} +3 -3
  45. package/dist/chunk-I52DRGGJ.js +727 -0
  46. package/dist/chunk-I52DRGGJ.js.map +1 -0
  47. package/dist/{chunk-DDSO4HS7.cjs → chunk-KEENUAFN.cjs} +2 -2
  48. package/dist/{chunk-DDSO4HS7.cjs.map → chunk-KEENUAFN.cjs.map} +1 -1
  49. package/dist/{chunk-2HC4DRF4.js → chunk-LLFHCSU2.js} +2 -2
  50. package/dist/{chunk-J5BA3BQ6.cjs → chunk-O7LUD7MH.cjs} +323 -3
  51. package/dist/chunk-O7LUD7MH.cjs.map +1 -0
  52. package/dist/{chunk-ILYFOJUN.js → chunk-OIBIRXRG.js} +3 -3
  53. package/dist/{chunk-FWEO3HSL.js → chunk-PQQF5KOW.js} +8 -8
  54. package/dist/{chunk-T6TV6HY6.cjs → chunk-PRSRYHQD.cjs} +36 -36
  55. package/dist/{chunk-T6TV6HY6.cjs.map → chunk-PRSRYHQD.cjs.map} +1 -1
  56. package/dist/chunk-Q6OUXEK3.cjs +150 -0
  57. package/dist/chunk-Q6OUXEK3.cjs.map +1 -0
  58. package/dist/{chunk-6GFRKLLS.cjs → chunk-QBWEH3IM.cjs} +429 -112
  59. package/dist/chunk-QBWEH3IM.cjs.map +1 -0
  60. package/dist/{chunk-ESIWZMMK.js → chunk-SYT2TLQF.js} +35 -37
  61. package/dist/{chunk-ESIWZMMK.js.map → chunk-SYT2TLQF.js.map} +1 -1
  62. package/dist/{chunk-YT3JL7YM.cjs → chunk-TLCTTQFF.cjs} +53 -53
  63. package/dist/{chunk-YT3JL7YM.cjs.map → chunk-TLCTTQFF.cjs.map} +1 -1
  64. package/dist/{chunk-P3RQ5UJE.cjs → chunk-UTQKC66X.cjs} +4 -4
  65. package/dist/{chunk-P3RQ5UJE.cjs.map → chunk-UTQKC66X.cjs.map} +1 -1
  66. package/dist/{chunk-J3B45HTA.cjs → chunk-XB25WOC2.cjs} +6 -6
  67. package/dist/{chunk-J3B45HTA.cjs.map → chunk-XB25WOC2.cjs.map} +1 -1
  68. package/dist/{chunk-YAFS2QFZ.cjs → chunk-XN2NBLV5.cjs} +313 -315
  69. package/dist/chunk-XN2NBLV5.cjs.map +1 -0
  70. package/dist/effects/index.d.cts +7 -4
  71. package/dist/effects/index.d.ts +7 -4
  72. package/dist/{export-DMeG6E06.d.ts → export-41rL6Cne.d.ts} +1 -1
  73. package/dist/{export-AZSwX087.d.cts → export-CyJdfP_Z.d.cts} +5 -4
  74. package/dist/{export-KzubBKo7.d.cts → export-D9mXp05Q.d.cts} +1 -1
  75. package/dist/{export-BDkyDNM8.d.ts → export-DwnZ_hvQ.d.ts} +5 -4
  76. package/dist/extensions/index.cjs +3 -3
  77. package/dist/extensions/index.cjs.map +1 -1
  78. package/dist/extensions/index.js +2 -2
  79. package/dist/generation/index.cjs +150 -945
  80. package/dist/generation/index.cjs.map +1 -1
  81. package/dist/generation/index.d.cts +3 -423
  82. package/dist/generation/index.d.ts +3 -423
  83. package/dist/generation/index.js +59 -854
  84. package/dist/generation/index.js.map +1 -1
  85. package/dist/grammar/index.cjs +3 -3
  86. package/dist/grammar/index.cjs.map +1 -1
  87. package/dist/grammar/index.js +2 -2
  88. package/dist/{helpers-Coa4e2j_.d.ts → helpers-C-RgeyvH.d.ts} +25 -8
  89. package/dist/{helpers-DHl28yLO.d.cts → helpers-v6GMazzg.d.cts} +25 -8
  90. package/dist/image-editor/index.cjs +986 -986
  91. package/dist/image-editor/index.cjs.map +1 -1
  92. package/dist/image-editor/index.d.cts +15 -11
  93. package/dist/image-editor/index.d.ts +15 -11
  94. package/dist/image-editor/index.js +94 -94
  95. package/dist/index.cjs +28 -28
  96. package/dist/index.cjs.map +1 -1
  97. package/dist/index.js +36 -36
  98. package/dist/{opentype-BWR7Qv8W.d.cts → opentype-KR_jj6b_.d.cts} +1 -1
  99. package/dist/{opentype-Dfcx6wFx.d.ts → opentype-a1KAW-qs.d.ts} +1 -1
  100. package/dist/paint/index.cjs +5 -8
  101. package/dist/paint/index.cjs.map +1 -1
  102. package/dist/paint/index.d.cts +4 -2
  103. package/dist/paint/index.d.ts +4 -2
  104. package/dist/paint/index.js +15 -18
  105. package/dist/paint-editor/index.cjs +405 -403
  106. package/dist/paint-editor/index.cjs.map +1 -1
  107. package/dist/paint-editor/index.d.cts +15 -748
  108. package/dist/paint-editor/index.d.ts +15 -748
  109. package/dist/paint-editor/index.js +79 -77
  110. package/dist/paint-editor/index.js.map +1 -1
  111. package/dist/{pathfinder-D8KQ6blQ.d.cts → pathfinder-BHS4vQNm.d.cts} +1 -1
  112. package/dist/{pathfinder-Celbi3e6.d.ts → pathfinder-BVvTIBMo.d.ts} +1 -1
  113. package/dist/{pool-8JZGWHvR.d.ts → pool-CZQOrSXZ.d.ts} +1 -1
  114. package/dist/{pool-BfuxBKTd.d.cts → pool-FjZZmZ80.d.cts} +1 -1
  115. package/dist/provenance-DmlcgdzT.d.cts +426 -0
  116. package/dist/provenance-uh5r2TQ8.d.ts +426 -0
  117. package/dist/rand-8xbUb6ur.d.ts +1118 -0
  118. package/dist/rand-Cw9VLrVC.d.cts +1118 -0
  119. package/dist/raster/index.cjs +17 -19
  120. package/dist/raster/index.cjs.map +1 -1
  121. package/dist/raster/index.js +9 -11
  122. package/dist/raster/index.js.map +1 -1
  123. package/dist/{svg-CxxqG3_W.d.ts → svg-CSz3mzkw.d.ts} +2 -2
  124. package/dist/{svg-pwXWq6s2.d.cts → svg-DTb40ICU.d.cts} +2 -2
  125. package/dist/{tools-y1M6O3UT.d.ts → tools-B0wXP5cF.d.ts} +1 -1
  126. package/dist/{tools-3EBjR91b.d.cts → tools-Ca0kI1qo.d.cts} +1 -1
  127. package/dist/vector/index.cjs +2698 -1674
  128. package/dist/vector/index.cjs.map +1 -1
  129. package/dist/vector/index.d.cts +390 -72
  130. package/dist/vector/index.d.ts +390 -72
  131. package/dist/vector/index.js +1665 -641
  132. package/dist/vector/index.js.map +1 -1
  133. package/dist/video-editor/index.d.cts +7 -4
  134. package/dist/video-editor/index.d.ts +7 -4
  135. package/dist/{warp-Ceqdz7kj.d.cts → warp-DTOp0lON.d.cts} +1 -1
  136. package/dist/{warp-C1gwu2G_.d.ts → warp-pd7hrH4T.d.ts} +1 -1
  137. package/package.json +1 -1
  138. package/skills/pixerate-vector/SKILL.md +22 -0
  139. package/dist/brushstrokeRender-JNHVEUFG.cjs.map +0 -1
  140. package/dist/chunk-64PYNEHJ.js +0 -340
  141. package/dist/chunk-64PYNEHJ.js.map +0 -1
  142. package/dist/chunk-6GFRKLLS.cjs.map +0 -1
  143. package/dist/chunk-7QN76ESJ.js +0 -323
  144. package/dist/chunk-7QN76ESJ.js.map +0 -1
  145. package/dist/chunk-BR7EKQUP.js.map +0 -1
  146. package/dist/chunk-DCLJNVZS.cjs +0 -323
  147. package/dist/chunk-DCLJNVZS.cjs.map +0 -1
  148. package/dist/chunk-EM3FMJWE.js.map +0 -1
  149. package/dist/chunk-HHTCDFZC.js.map +0 -1
  150. package/dist/chunk-J5BA3BQ6.cjs.map +0 -1
  151. package/dist/chunk-YAFS2QFZ.cjs.map +0 -1
  152. package/dist/chunk-Z2H7KECK.cjs.map +0 -1
  153. package/dist/chunk-Z6OUCS2K.cjs +0 -340
  154. package/dist/chunk-Z6OUCS2K.cjs.map +0 -1
  155. package/dist/rand-BszBST4s.d.ts +0 -2140
  156. package/dist/rand-DOH_aMvm.d.cts +0 -2140
  157. /package/dist/{chunk-62XUO5LB.js.map → chunk-3X6IAJUQ.js.map} +0 -0
  158. /package/dist/{chunk-7RJ6P7MI.js.map → chunk-6S6362D2.js.map} +0 -0
  159. /package/dist/{chunk-SVYE5HIM.js.map → chunk-EQQMGO42.js.map} +0 -0
  160. /package/dist/{chunk-OXSV64JX.js.map → chunk-G6IKY6PL.js.map} +0 -0
  161. /package/dist/{chunk-UYQUPUR6.js.map → chunk-HUO3TI4C.js.map} +0 -0
  162. /package/dist/{chunk-2HC4DRF4.js.map → chunk-LLFHCSU2.js.map} +0 -0
  163. /package/dist/{chunk-ILYFOJUN.js.map → chunk-OIBIRXRG.js.map} +0 -0
  164. /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-BR7EKQUP.js.map
1736
+ //# sourceMappingURL=chunk-3G6J7UFV.js.map