emf-converter 4.6.4 → 4.6.6
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/browser.js +176 -37
- package/dist/browser.mjs +176 -37
- package/dist/index.js +176 -37
- package/dist/index.mjs +176 -37
- package/package.json +1 -1
package/dist/browser.js
CHANGED
|
@@ -28728,7 +28728,105 @@ var HOBBY = [
|
|
|
28728
28728
|
[[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
|
|
28729
28729
|
];
|
|
28730
28730
|
var HOBBY_LIMIT = 104;
|
|
28731
|
-
var
|
|
28731
|
+
var FLAT_SECTOR_BIAS = {
|
|
28732
|
+
7: [9, "cf..", "edededEdcDcdcd"],
|
|
28733
|
+
8: [9, "dFee", "ededededbdbdbd"],
|
|
28734
|
+
9: [9, "df..", "ddddddddbDbdbd"],
|
|
28735
|
+
10: [9, "de..", "dededeDebEbebE"],
|
|
28736
|
+
11: [9, "ce..", "eeeeeeEececece"],
|
|
28737
|
+
12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
|
|
28738
|
+
13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
|
|
28739
|
+
14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
|
|
28740
|
+
15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
|
|
28741
|
+
16: [17, "ce..", "eeeededededeeeeececebebebebece"],
|
|
28742
|
+
17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
|
|
28743
|
+
18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
|
|
28744
|
+
19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
|
|
28745
|
+
20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
|
|
28746
|
+
21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
|
|
28747
|
+
22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
|
|
28748
|
+
23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
|
|
28749
|
+
24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
|
|
28750
|
+
25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
|
|
28751
|
+
26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
|
|
28752
|
+
27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
|
|
28753
|
+
28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
|
|
28754
|
+
29: [17, "ce..", "eeeeeeeededededebebebebececece"],
|
|
28755
|
+
30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
|
|
28756
|
+
31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
|
|
28757
|
+
32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
|
|
28758
|
+
33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
|
|
28759
|
+
34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
|
|
28760
|
+
35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
|
|
28761
|
+
36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
|
|
28762
|
+
37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
|
|
28763
|
+
38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
|
|
28764
|
+
39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
|
|
28765
|
+
40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
|
|
28766
|
+
41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
|
|
28767
|
+
42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
|
|
28768
|
+
43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
|
|
28769
|
+
44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
|
|
28770
|
+
45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
|
|
28771
|
+
46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
|
|
28772
|
+
47: [17, "ce..", "dedededededededececececececece"],
|
|
28773
|
+
48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
|
|
28774
|
+
49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
|
|
28775
|
+
50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
|
|
28776
|
+
51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
|
|
28777
|
+
52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
|
|
28778
|
+
53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
|
|
28779
|
+
54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
|
|
28780
|
+
55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
|
|
28781
|
+
56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
|
|
28782
|
+
57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
|
|
28783
|
+
58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
|
|
28784
|
+
59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
|
|
28785
|
+
60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
|
|
28786
|
+
61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
|
|
28787
|
+
62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
|
|
28788
|
+
63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
|
|
28789
|
+
64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
|
|
28790
|
+
65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
|
|
28791
|
+
66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
|
|
28792
|
+
67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
|
|
28793
|
+
68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
|
|
28794
|
+
69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
|
|
28795
|
+
70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
|
|
28796
|
+
71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
|
|
28797
|
+
72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
|
|
28798
|
+
73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
|
|
28799
|
+
74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
|
|
28800
|
+
75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
|
|
28801
|
+
76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
|
|
28802
|
+
77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
|
|
28803
|
+
78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
|
|
28804
|
+
79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
|
|
28805
|
+
80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
|
|
28806
|
+
81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
|
|
28807
|
+
82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
|
|
28808
|
+
83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
|
|
28809
|
+
84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
|
|
28810
|
+
85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
|
|
28811
|
+
86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
|
|
28812
|
+
87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
|
|
28813
|
+
88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
|
|
28814
|
+
89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
|
|
28815
|
+
90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
|
|
28816
|
+
91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
|
|
28817
|
+
92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
|
|
28818
|
+
93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
|
|
28819
|
+
94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
|
|
28820
|
+
95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
|
|
28821
|
+
96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
|
|
28822
|
+
97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
|
|
28823
|
+
98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
|
|
28824
|
+
99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
|
|
28825
|
+
100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
|
|
28826
|
+
};
|
|
28827
|
+
function sectorBias(code) {
|
|
28828
|
+
return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
|
|
28829
|
+
}
|
|
28732
28830
|
var penCache = /* @__PURE__ */ new Map();
|
|
28733
28831
|
function penPolygon(width) {
|
|
28734
28832
|
const cached = penCache.get(width);
|
|
@@ -28807,13 +28905,19 @@ function perpendicularVectors(width, dx0, dy0) {
|
|
|
28807
28905
|
const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
|
|
28808
28906
|
const den = 2 * (bh - hB + (bh - hS));
|
|
28809
28907
|
const w = den === 0 ? 0 : (hB - hS) / den;
|
|
28810
|
-
const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
|
|
28811
|
-
const sgn = best < n / 2 ? 1 : -1;
|
|
28812
|
-
const ox = off ? sgn * off[0] : 0;
|
|
28813
|
-
const oy = off ? sgn * off[1] : 0;
|
|
28814
28908
|
const r = (v) => 8 * Math.floor((v + 4) / 8);
|
|
28815
28909
|
const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
|
|
28816
|
-
|
|
28910
|
+
let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
|
|
28911
|
+
const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
|
|
28912
|
+
if (table) {
|
|
28913
|
+
const key = best * 2 + (hP >= hN ? 0 : 1);
|
|
28914
|
+
const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
|
|
28915
|
+
if (pair[0] !== ".") {
|
|
28916
|
+
cx = sectorBias(pair.charCodeAt(0));
|
|
28917
|
+
cy = sectorBias(pair.charCodeAt(1));
|
|
28918
|
+
}
|
|
28919
|
+
}
|
|
28920
|
+
const vx = r(x + cx), vy = r(y + cy);
|
|
28817
28921
|
return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
|
|
28818
28922
|
}
|
|
28819
28923
|
function squareExtension(width, dx, dy) {
|
|
@@ -31372,42 +31476,77 @@ function halftoneDespeckle(px, w, h) {
|
|
|
31372
31476
|
const src = px.slice();
|
|
31373
31477
|
const at = (x, y, c) => src[(y * w + x) * 3 + c];
|
|
31374
31478
|
const over = (v) => v < -SPECKLE_OVERSHOOT * 4 || v > (255 + SPECKLE_OVERSHOOT) * 4;
|
|
31479
|
+
const loneX = w > 2 && w % 2 === 1 ? w - 1 : -1;
|
|
31480
|
+
const loneY = h > 2 && h % 2 === 1 ? h - 1 : -1;
|
|
31481
|
+
const mirror2 = (i, n, d) => {
|
|
31482
|
+
const j = i + d;
|
|
31483
|
+
return j < 0 || j >= n ? i - d : j;
|
|
31484
|
+
};
|
|
31485
|
+
const vBlur = (x, y, c) => at(x, mirror2(y, h, -1), c) + 2 * at(x, y, c) + at(x, mirror2(y, h, 1), c) + 2 >> 2;
|
|
31486
|
+
const hBlur = (x, y, c) => at(mirror2(x, w, -1), y, c) + 2 * at(x, y, c) + at(mirror2(x, w, 1), y, c) + 2 >> 2;
|
|
31487
|
+
const differs = (x0, y0, x1, y1) => at(x0, y0, 0) !== at(x1, y1, 0) || at(x0, y0, 1) !== at(x1, y1, 1) || at(x0, y0, 2) !== at(x1, y1, 2);
|
|
31488
|
+
const loneColumn = (y) => loneX > 0 && differs(loneX, y, loneX - 1, y);
|
|
31489
|
+
const loneRow = (x) => loneY > 0 && differs(x, loneY, x, loneY - 1);
|
|
31490
|
+
const loneColumnValue = (y, c) => y === loneY && loneRow(loneX) ? at(loneX, y - 1, c) + 3 * at(loneX, y, c) + 2 >> 2 : vBlur(loneX, y, c);
|
|
31491
|
+
const loneRowValue = (x, c) => x === loneX && loneColumn(loneY) ? at(x - 1, loneY, c) + 3 * at(x, loneY, c) + 2 >> 2 : hBlur(x, loneY, c);
|
|
31492
|
+
const speckled = (x, y) => {
|
|
31493
|
+
const up = mirror2(y, h, -1);
|
|
31494
|
+
const down = mirror2(y, h, 1);
|
|
31495
|
+
const left = mirror2(x, w, -1);
|
|
31496
|
+
const right = mirror2(x, w, 1);
|
|
31497
|
+
let hClip = 0;
|
|
31498
|
+
let vClip = 0;
|
|
31499
|
+
let alternating = 0;
|
|
31500
|
+
for (let c = 0; c < 3; c++) {
|
|
31501
|
+
const v = at(x, y, c);
|
|
31502
|
+
const axial = Math.max(
|
|
31503
|
+
Math.abs(v - at(left, y, c)),
|
|
31504
|
+
Math.abs(v - at(right, y, c)),
|
|
31505
|
+
Math.abs(v - at(x, up, c)),
|
|
31506
|
+
Math.abs(v - at(x, down, c))
|
|
31507
|
+
);
|
|
31508
|
+
const diagonal = Math.min(
|
|
31509
|
+
Math.abs(v - at(left, up, c)),
|
|
31510
|
+
Math.abs(v - at(right, up, c)),
|
|
31511
|
+
Math.abs(v - at(left, down, c)),
|
|
31512
|
+
Math.abs(v - at(right, down, c))
|
|
31513
|
+
);
|
|
31514
|
+
if (diagonal < axial) alternating++;
|
|
31515
|
+
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31516
|
+
hClip++;
|
|
31517
|
+
}
|
|
31518
|
+
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31519
|
+
vClip++;
|
|
31520
|
+
}
|
|
31521
|
+
}
|
|
31522
|
+
return hClip >= 2 && vClip >= 2 && alternating >= 2;
|
|
31523
|
+
};
|
|
31375
31524
|
for (let y = 0; y < h; y++) {
|
|
31376
|
-
const up = y > 0 ? y - 1 : Math.min(h - 1, y + 1);
|
|
31377
|
-
const down = y < h - 1 ? y + 1 : Math.max(0, y - 1);
|
|
31378
31525
|
for (let x = 0; x < w; x++) {
|
|
31379
|
-
|
|
31380
|
-
const right = x < w - 1 ? x + 1 : Math.max(0, x - 1);
|
|
31381
|
-
let hClip = 0;
|
|
31382
|
-
let vClip = 0;
|
|
31383
|
-
let alternating = 0;
|
|
31384
|
-
for (let c = 0; c < 3; c++) {
|
|
31385
|
-
const v = at(x, y, c);
|
|
31386
|
-
const axial = Math.max(
|
|
31387
|
-
Math.abs(v - at(left, y, c)),
|
|
31388
|
-
Math.abs(v - at(right, y, c)),
|
|
31389
|
-
Math.abs(v - at(x, up, c)),
|
|
31390
|
-
Math.abs(v - at(x, down, c))
|
|
31391
|
-
);
|
|
31392
|
-
const diagonal = Math.min(
|
|
31393
|
-
Math.abs(v - at(left, up, c)),
|
|
31394
|
-
Math.abs(v - at(right, up, c)),
|
|
31395
|
-
Math.abs(v - at(left, down, c)),
|
|
31396
|
-
Math.abs(v - at(right, down, c))
|
|
31397
|
-
);
|
|
31398
|
-
if (diagonal < axial) alternating++;
|
|
31399
|
-
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31400
|
-
hClip++;
|
|
31401
|
-
}
|
|
31402
|
-
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31403
|
-
vClip++;
|
|
31404
|
-
}
|
|
31405
|
-
}
|
|
31406
|
-
if (hClip < 2 || vClip < 2 || alternating < 2) {
|
|
31526
|
+
if (!speckled(x, y)) {
|
|
31407
31527
|
continue;
|
|
31408
31528
|
}
|
|
31529
|
+
const left = mirror2(x, w, -1);
|
|
31530
|
+
const right = mirror2(x, w, 1);
|
|
31531
|
+
const up = mirror2(y, h, -1);
|
|
31532
|
+
const down = mirror2(y, h, 1);
|
|
31533
|
+
const lonelyColumn = x === loneX && loneColumn(y);
|
|
31534
|
+
const lonelyRow = y === loneY && loneRow(x);
|
|
31535
|
+
const nearLoneX = x === loneX - 1 && loneX > 0 && loneColumn(y) && !speckled(loneX, y);
|
|
31536
|
+
const nearLoneY = y === loneY - 1 && loneY > 0 && loneRow(x) && !speckled(x, loneY);
|
|
31537
|
+
const cornerRepeats = lonelyColumn && lonelyRow && (!speckled(x, y - 1) || !speckled(x - 1, y));
|
|
31409
31538
|
for (let c = 0; c < 3; c++) {
|
|
31410
|
-
|
|
31539
|
+
const v = at(x, y, c);
|
|
31540
|
+
let r;
|
|
31541
|
+
if (lonelyColumn && lonelyRow) {
|
|
31542
|
+
r = cornerRepeats ? at(left, y, c) + 3 * v + 2 >> 2 : hBlur(x, y, c);
|
|
31543
|
+
} else {
|
|
31544
|
+
let sum = lonelyColumn ? at(x, up, c) + 2 * v + at(x, down, c) : at(left, y, c) + 2 * v + at(right, y, c);
|
|
31545
|
+
if (nearLoneX) sum += loneColumnValue(y, c) - at(loneX, y, c);
|
|
31546
|
+
if (nearLoneY) sum += loneRowValue(x, c) - at(x, loneY, c);
|
|
31547
|
+
r = sum + 2 >> 2;
|
|
31548
|
+
}
|
|
31549
|
+
px[(y * w + x) * 3 + c] = r;
|
|
31411
31550
|
}
|
|
31412
31551
|
}
|
|
31413
31552
|
}
|
package/dist/browser.mjs
CHANGED
|
@@ -28726,7 +28726,105 @@ var HOBBY = [
|
|
|
28726
28726
|
[[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
|
|
28727
28727
|
];
|
|
28728
28728
|
var HOBBY_LIMIT = 104;
|
|
28729
|
-
var
|
|
28729
|
+
var FLAT_SECTOR_BIAS = {
|
|
28730
|
+
7: [9, "cf..", "edededEdcDcdcd"],
|
|
28731
|
+
8: [9, "dFee", "ededededbdbdbd"],
|
|
28732
|
+
9: [9, "df..", "ddddddddbDbdbd"],
|
|
28733
|
+
10: [9, "de..", "dededeDebEbebE"],
|
|
28734
|
+
11: [9, "ce..", "eeeeeeEececece"],
|
|
28735
|
+
12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
|
|
28736
|
+
13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
|
|
28737
|
+
14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
|
|
28738
|
+
15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
|
|
28739
|
+
16: [17, "ce..", "eeeededededeeeeececebebebebece"],
|
|
28740
|
+
17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
|
|
28741
|
+
18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
|
|
28742
|
+
19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
|
|
28743
|
+
20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
|
|
28744
|
+
21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
|
|
28745
|
+
22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
|
|
28746
|
+
23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
|
|
28747
|
+
24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
|
|
28748
|
+
25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
|
|
28749
|
+
26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
|
|
28750
|
+
27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
|
|
28751
|
+
28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
|
|
28752
|
+
29: [17, "ce..", "eeeeeeeededededebebebebececece"],
|
|
28753
|
+
30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
|
|
28754
|
+
31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
|
|
28755
|
+
32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
|
|
28756
|
+
33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
|
|
28757
|
+
34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
|
|
28758
|
+
35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
|
|
28759
|
+
36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
|
|
28760
|
+
37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
|
|
28761
|
+
38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
|
|
28762
|
+
39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
|
|
28763
|
+
40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
|
|
28764
|
+
41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
|
|
28765
|
+
42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
|
|
28766
|
+
43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
|
|
28767
|
+
44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
|
|
28768
|
+
45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
|
|
28769
|
+
46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
|
|
28770
|
+
47: [17, "ce..", "dedededededededececececececece"],
|
|
28771
|
+
48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
|
|
28772
|
+
49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
|
|
28773
|
+
50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
|
|
28774
|
+
51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
|
|
28775
|
+
52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
|
|
28776
|
+
53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
|
|
28777
|
+
54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
|
|
28778
|
+
55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
|
|
28779
|
+
56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
|
|
28780
|
+
57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
|
|
28781
|
+
58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
|
|
28782
|
+
59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
|
|
28783
|
+
60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
|
|
28784
|
+
61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
|
|
28785
|
+
62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
|
|
28786
|
+
63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
|
|
28787
|
+
64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
|
|
28788
|
+
65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
|
|
28789
|
+
66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
|
|
28790
|
+
67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
|
|
28791
|
+
68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
|
|
28792
|
+
69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
|
|
28793
|
+
70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
|
|
28794
|
+
71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
|
|
28795
|
+
72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
|
|
28796
|
+
73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
|
|
28797
|
+
74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
|
|
28798
|
+
75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
|
|
28799
|
+
76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
|
|
28800
|
+
77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
|
|
28801
|
+
78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
|
|
28802
|
+
79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
|
|
28803
|
+
80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
|
|
28804
|
+
81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
|
|
28805
|
+
82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
|
|
28806
|
+
83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
|
|
28807
|
+
84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
|
|
28808
|
+
85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
|
|
28809
|
+
86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
|
|
28810
|
+
87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
|
|
28811
|
+
88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
|
|
28812
|
+
89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
|
|
28813
|
+
90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
|
|
28814
|
+
91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
|
|
28815
|
+
92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
|
|
28816
|
+
93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
|
|
28817
|
+
94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
|
|
28818
|
+
95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
|
|
28819
|
+
96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
|
|
28820
|
+
97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
|
|
28821
|
+
98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
|
|
28822
|
+
99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
|
|
28823
|
+
100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
|
|
28824
|
+
};
|
|
28825
|
+
function sectorBias(code) {
|
|
28826
|
+
return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
|
|
28827
|
+
}
|
|
28730
28828
|
var penCache = /* @__PURE__ */ new Map();
|
|
28731
28829
|
function penPolygon(width) {
|
|
28732
28830
|
const cached = penCache.get(width);
|
|
@@ -28805,13 +28903,19 @@ function perpendicularVectors(width, dx0, dy0) {
|
|
|
28805
28903
|
const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
|
|
28806
28904
|
const den = 2 * (bh - hB + (bh - hS));
|
|
28807
28905
|
const w = den === 0 ? 0 : (hB - hS) / den;
|
|
28808
|
-
const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
|
|
28809
|
-
const sgn = best < n / 2 ? 1 : -1;
|
|
28810
|
-
const ox = off ? sgn * off[0] : 0;
|
|
28811
|
-
const oy = off ? sgn * off[1] : 0;
|
|
28812
28906
|
const r = (v) => 8 * Math.floor((v + 4) / 8);
|
|
28813
28907
|
const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
|
|
28814
|
-
|
|
28908
|
+
let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
|
|
28909
|
+
const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
|
|
28910
|
+
if (table) {
|
|
28911
|
+
const key = best * 2 + (hP >= hN ? 0 : 1);
|
|
28912
|
+
const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
|
|
28913
|
+
if (pair[0] !== ".") {
|
|
28914
|
+
cx = sectorBias(pair.charCodeAt(0));
|
|
28915
|
+
cy = sectorBias(pair.charCodeAt(1));
|
|
28916
|
+
}
|
|
28917
|
+
}
|
|
28918
|
+
const vx = r(x + cx), vy = r(y + cy);
|
|
28815
28919
|
return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
|
|
28816
28920
|
}
|
|
28817
28921
|
function squareExtension(width, dx, dy) {
|
|
@@ -31370,42 +31474,77 @@ function halftoneDespeckle(px, w, h) {
|
|
|
31370
31474
|
const src = px.slice();
|
|
31371
31475
|
const at = (x, y, c) => src[(y * w + x) * 3 + c];
|
|
31372
31476
|
const over = (v) => v < -SPECKLE_OVERSHOOT * 4 || v > (255 + SPECKLE_OVERSHOOT) * 4;
|
|
31477
|
+
const loneX = w > 2 && w % 2 === 1 ? w - 1 : -1;
|
|
31478
|
+
const loneY = h > 2 && h % 2 === 1 ? h - 1 : -1;
|
|
31479
|
+
const mirror2 = (i, n, d) => {
|
|
31480
|
+
const j = i + d;
|
|
31481
|
+
return j < 0 || j >= n ? i - d : j;
|
|
31482
|
+
};
|
|
31483
|
+
const vBlur = (x, y, c) => at(x, mirror2(y, h, -1), c) + 2 * at(x, y, c) + at(x, mirror2(y, h, 1), c) + 2 >> 2;
|
|
31484
|
+
const hBlur = (x, y, c) => at(mirror2(x, w, -1), y, c) + 2 * at(x, y, c) + at(mirror2(x, w, 1), y, c) + 2 >> 2;
|
|
31485
|
+
const differs = (x0, y0, x1, y1) => at(x0, y0, 0) !== at(x1, y1, 0) || at(x0, y0, 1) !== at(x1, y1, 1) || at(x0, y0, 2) !== at(x1, y1, 2);
|
|
31486
|
+
const loneColumn = (y) => loneX > 0 && differs(loneX, y, loneX - 1, y);
|
|
31487
|
+
const loneRow = (x) => loneY > 0 && differs(x, loneY, x, loneY - 1);
|
|
31488
|
+
const loneColumnValue = (y, c) => y === loneY && loneRow(loneX) ? at(loneX, y - 1, c) + 3 * at(loneX, y, c) + 2 >> 2 : vBlur(loneX, y, c);
|
|
31489
|
+
const loneRowValue = (x, c) => x === loneX && loneColumn(loneY) ? at(x - 1, loneY, c) + 3 * at(x, loneY, c) + 2 >> 2 : hBlur(x, loneY, c);
|
|
31490
|
+
const speckled = (x, y) => {
|
|
31491
|
+
const up = mirror2(y, h, -1);
|
|
31492
|
+
const down = mirror2(y, h, 1);
|
|
31493
|
+
const left = mirror2(x, w, -1);
|
|
31494
|
+
const right = mirror2(x, w, 1);
|
|
31495
|
+
let hClip = 0;
|
|
31496
|
+
let vClip = 0;
|
|
31497
|
+
let alternating = 0;
|
|
31498
|
+
for (let c = 0; c < 3; c++) {
|
|
31499
|
+
const v = at(x, y, c);
|
|
31500
|
+
const axial = Math.max(
|
|
31501
|
+
Math.abs(v - at(left, y, c)),
|
|
31502
|
+
Math.abs(v - at(right, y, c)),
|
|
31503
|
+
Math.abs(v - at(x, up, c)),
|
|
31504
|
+
Math.abs(v - at(x, down, c))
|
|
31505
|
+
);
|
|
31506
|
+
const diagonal = Math.min(
|
|
31507
|
+
Math.abs(v - at(left, up, c)),
|
|
31508
|
+
Math.abs(v - at(right, up, c)),
|
|
31509
|
+
Math.abs(v - at(left, down, c)),
|
|
31510
|
+
Math.abs(v - at(right, down, c))
|
|
31511
|
+
);
|
|
31512
|
+
if (diagonal < axial) alternating++;
|
|
31513
|
+
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31514
|
+
hClip++;
|
|
31515
|
+
}
|
|
31516
|
+
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31517
|
+
vClip++;
|
|
31518
|
+
}
|
|
31519
|
+
}
|
|
31520
|
+
return hClip >= 2 && vClip >= 2 && alternating >= 2;
|
|
31521
|
+
};
|
|
31373
31522
|
for (let y = 0; y < h; y++) {
|
|
31374
|
-
const up = y > 0 ? y - 1 : Math.min(h - 1, y + 1);
|
|
31375
|
-
const down = y < h - 1 ? y + 1 : Math.max(0, y - 1);
|
|
31376
31523
|
for (let x = 0; x < w; x++) {
|
|
31377
|
-
|
|
31378
|
-
const right = x < w - 1 ? x + 1 : Math.max(0, x - 1);
|
|
31379
|
-
let hClip = 0;
|
|
31380
|
-
let vClip = 0;
|
|
31381
|
-
let alternating = 0;
|
|
31382
|
-
for (let c = 0; c < 3; c++) {
|
|
31383
|
-
const v = at(x, y, c);
|
|
31384
|
-
const axial = Math.max(
|
|
31385
|
-
Math.abs(v - at(left, y, c)),
|
|
31386
|
-
Math.abs(v - at(right, y, c)),
|
|
31387
|
-
Math.abs(v - at(x, up, c)),
|
|
31388
|
-
Math.abs(v - at(x, down, c))
|
|
31389
|
-
);
|
|
31390
|
-
const diagonal = Math.min(
|
|
31391
|
-
Math.abs(v - at(left, up, c)),
|
|
31392
|
-
Math.abs(v - at(right, up, c)),
|
|
31393
|
-
Math.abs(v - at(left, down, c)),
|
|
31394
|
-
Math.abs(v - at(right, down, c))
|
|
31395
|
-
);
|
|
31396
|
-
if (diagonal < axial) alternating++;
|
|
31397
|
-
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31398
|
-
hClip++;
|
|
31399
|
-
}
|
|
31400
|
-
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31401
|
-
vClip++;
|
|
31402
|
-
}
|
|
31403
|
-
}
|
|
31404
|
-
if (hClip < 2 || vClip < 2 || alternating < 2) {
|
|
31524
|
+
if (!speckled(x, y)) {
|
|
31405
31525
|
continue;
|
|
31406
31526
|
}
|
|
31527
|
+
const left = mirror2(x, w, -1);
|
|
31528
|
+
const right = mirror2(x, w, 1);
|
|
31529
|
+
const up = mirror2(y, h, -1);
|
|
31530
|
+
const down = mirror2(y, h, 1);
|
|
31531
|
+
const lonelyColumn = x === loneX && loneColumn(y);
|
|
31532
|
+
const lonelyRow = y === loneY && loneRow(x);
|
|
31533
|
+
const nearLoneX = x === loneX - 1 && loneX > 0 && loneColumn(y) && !speckled(loneX, y);
|
|
31534
|
+
const nearLoneY = y === loneY - 1 && loneY > 0 && loneRow(x) && !speckled(x, loneY);
|
|
31535
|
+
const cornerRepeats = lonelyColumn && lonelyRow && (!speckled(x, y - 1) || !speckled(x - 1, y));
|
|
31407
31536
|
for (let c = 0; c < 3; c++) {
|
|
31408
|
-
|
|
31537
|
+
const v = at(x, y, c);
|
|
31538
|
+
let r;
|
|
31539
|
+
if (lonelyColumn && lonelyRow) {
|
|
31540
|
+
r = cornerRepeats ? at(left, y, c) + 3 * v + 2 >> 2 : hBlur(x, y, c);
|
|
31541
|
+
} else {
|
|
31542
|
+
let sum = lonelyColumn ? at(x, up, c) + 2 * v + at(x, down, c) : at(left, y, c) + 2 * v + at(right, y, c);
|
|
31543
|
+
if (nearLoneX) sum += loneColumnValue(y, c) - at(loneX, y, c);
|
|
31544
|
+
if (nearLoneY) sum += loneRowValue(x, c) - at(x, loneY, c);
|
|
31545
|
+
r = sum + 2 >> 2;
|
|
31546
|
+
}
|
|
31547
|
+
px[(y * w + x) * 3 + c] = r;
|
|
31409
31548
|
}
|
|
31410
31549
|
}
|
|
31411
31550
|
}
|
package/dist/index.js
CHANGED
|
@@ -28729,7 +28729,105 @@ var HOBBY = [
|
|
|
28729
28729
|
[[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
|
|
28730
28730
|
];
|
|
28731
28731
|
var HOBBY_LIMIT = 104;
|
|
28732
|
-
var
|
|
28732
|
+
var FLAT_SECTOR_BIAS = {
|
|
28733
|
+
7: [9, "cf..", "edededEdcDcdcd"],
|
|
28734
|
+
8: [9, "dFee", "ededededbdbdbd"],
|
|
28735
|
+
9: [9, "df..", "ddddddddbDbdbd"],
|
|
28736
|
+
10: [9, "de..", "dededeDebEbebE"],
|
|
28737
|
+
11: [9, "ce..", "eeeeeeEececece"],
|
|
28738
|
+
12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
|
|
28739
|
+
13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
|
|
28740
|
+
14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
|
|
28741
|
+
15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
|
|
28742
|
+
16: [17, "ce..", "eeeededededeeeeececebebebebece"],
|
|
28743
|
+
17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
|
|
28744
|
+
18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
|
|
28745
|
+
19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
|
|
28746
|
+
20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
|
|
28747
|
+
21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
|
|
28748
|
+
22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
|
|
28749
|
+
23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
|
|
28750
|
+
24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
|
|
28751
|
+
25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
|
|
28752
|
+
26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
|
|
28753
|
+
27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
|
|
28754
|
+
28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
|
|
28755
|
+
29: [17, "ce..", "eeeeeeeededededebebebebececece"],
|
|
28756
|
+
30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
|
|
28757
|
+
31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
|
|
28758
|
+
32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
|
|
28759
|
+
33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
|
|
28760
|
+
34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
|
|
28761
|
+
35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
|
|
28762
|
+
36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
|
|
28763
|
+
37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
|
|
28764
|
+
38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
|
|
28765
|
+
39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
|
|
28766
|
+
40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
|
|
28767
|
+
41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
|
|
28768
|
+
42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
|
|
28769
|
+
43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
|
|
28770
|
+
44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
|
|
28771
|
+
45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
|
|
28772
|
+
46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
|
|
28773
|
+
47: [17, "ce..", "dedededededededececececececece"],
|
|
28774
|
+
48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
|
|
28775
|
+
49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
|
|
28776
|
+
50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
|
|
28777
|
+
51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
|
|
28778
|
+
52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
|
|
28779
|
+
53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
|
|
28780
|
+
54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
|
|
28781
|
+
55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
|
|
28782
|
+
56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
|
|
28783
|
+
57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
|
|
28784
|
+
58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
|
|
28785
|
+
59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
|
|
28786
|
+
60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
|
|
28787
|
+
61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
|
|
28788
|
+
62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
|
|
28789
|
+
63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
|
|
28790
|
+
64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
|
|
28791
|
+
65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
|
|
28792
|
+
66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
|
|
28793
|
+
67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
|
|
28794
|
+
68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
|
|
28795
|
+
69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
|
|
28796
|
+
70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
|
|
28797
|
+
71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
|
|
28798
|
+
72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
|
|
28799
|
+
73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
|
|
28800
|
+
74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
|
|
28801
|
+
75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
|
|
28802
|
+
76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
|
|
28803
|
+
77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
|
|
28804
|
+
78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
|
|
28805
|
+
79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
|
|
28806
|
+
80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
|
|
28807
|
+
81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
|
|
28808
|
+
82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
|
|
28809
|
+
83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
|
|
28810
|
+
84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
|
|
28811
|
+
85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
|
|
28812
|
+
86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
|
|
28813
|
+
87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
|
|
28814
|
+
88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
|
|
28815
|
+
89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
|
|
28816
|
+
90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
|
|
28817
|
+
91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
|
|
28818
|
+
92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
|
|
28819
|
+
93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
|
|
28820
|
+
94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
|
|
28821
|
+
95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
|
|
28822
|
+
96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
|
|
28823
|
+
97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
|
|
28824
|
+
98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
|
|
28825
|
+
99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
|
|
28826
|
+
100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
|
|
28827
|
+
};
|
|
28828
|
+
function sectorBias(code) {
|
|
28829
|
+
return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
|
|
28830
|
+
}
|
|
28733
28831
|
var penCache = /* @__PURE__ */ new Map();
|
|
28734
28832
|
function penPolygon(width) {
|
|
28735
28833
|
const cached = penCache.get(width);
|
|
@@ -28808,13 +28906,19 @@ function perpendicularVectors(width, dx0, dy0) {
|
|
|
28808
28906
|
const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
|
|
28809
28907
|
const den = 2 * (bh - hB + (bh - hS));
|
|
28810
28908
|
const w = den === 0 ? 0 : (hB - hS) / den;
|
|
28811
|
-
const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
|
|
28812
|
-
const sgn = best < n / 2 ? 1 : -1;
|
|
28813
|
-
const ox = off ? sgn * off[0] : 0;
|
|
28814
|
-
const oy = off ? sgn * off[1] : 0;
|
|
28815
28909
|
const r = (v) => 8 * Math.floor((v + 4) / 8);
|
|
28816
28910
|
const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
|
|
28817
|
-
|
|
28911
|
+
let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
|
|
28912
|
+
const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
|
|
28913
|
+
if (table) {
|
|
28914
|
+
const key = best * 2 + (hP >= hN ? 0 : 1);
|
|
28915
|
+
const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
|
|
28916
|
+
if (pair[0] !== ".") {
|
|
28917
|
+
cx = sectorBias(pair.charCodeAt(0));
|
|
28918
|
+
cy = sectorBias(pair.charCodeAt(1));
|
|
28919
|
+
}
|
|
28920
|
+
}
|
|
28921
|
+
const vx = r(x + cx), vy = r(y + cy);
|
|
28818
28922
|
return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
|
|
28819
28923
|
}
|
|
28820
28924
|
function squareExtension(width, dx, dy) {
|
|
@@ -31373,42 +31477,77 @@ function halftoneDespeckle(px, w, h) {
|
|
|
31373
31477
|
const src = px.slice();
|
|
31374
31478
|
const at = (x, y, c) => src[(y * w + x) * 3 + c];
|
|
31375
31479
|
const over = (v) => v < -SPECKLE_OVERSHOOT * 4 || v > (255 + SPECKLE_OVERSHOOT) * 4;
|
|
31480
|
+
const loneX = w > 2 && w % 2 === 1 ? w - 1 : -1;
|
|
31481
|
+
const loneY = h > 2 && h % 2 === 1 ? h - 1 : -1;
|
|
31482
|
+
const mirror2 = (i, n, d) => {
|
|
31483
|
+
const j = i + d;
|
|
31484
|
+
return j < 0 || j >= n ? i - d : j;
|
|
31485
|
+
};
|
|
31486
|
+
const vBlur = (x, y, c) => at(x, mirror2(y, h, -1), c) + 2 * at(x, y, c) + at(x, mirror2(y, h, 1), c) + 2 >> 2;
|
|
31487
|
+
const hBlur = (x, y, c) => at(mirror2(x, w, -1), y, c) + 2 * at(x, y, c) + at(mirror2(x, w, 1), y, c) + 2 >> 2;
|
|
31488
|
+
const differs = (x0, y0, x1, y1) => at(x0, y0, 0) !== at(x1, y1, 0) || at(x0, y0, 1) !== at(x1, y1, 1) || at(x0, y0, 2) !== at(x1, y1, 2);
|
|
31489
|
+
const loneColumn = (y) => loneX > 0 && differs(loneX, y, loneX - 1, y);
|
|
31490
|
+
const loneRow = (x) => loneY > 0 && differs(x, loneY, x, loneY - 1);
|
|
31491
|
+
const loneColumnValue = (y, c) => y === loneY && loneRow(loneX) ? at(loneX, y - 1, c) + 3 * at(loneX, y, c) + 2 >> 2 : vBlur(loneX, y, c);
|
|
31492
|
+
const loneRowValue = (x, c) => x === loneX && loneColumn(loneY) ? at(x - 1, loneY, c) + 3 * at(x, loneY, c) + 2 >> 2 : hBlur(x, loneY, c);
|
|
31493
|
+
const speckled = (x, y) => {
|
|
31494
|
+
const up = mirror2(y, h, -1);
|
|
31495
|
+
const down = mirror2(y, h, 1);
|
|
31496
|
+
const left = mirror2(x, w, -1);
|
|
31497
|
+
const right = mirror2(x, w, 1);
|
|
31498
|
+
let hClip = 0;
|
|
31499
|
+
let vClip = 0;
|
|
31500
|
+
let alternating = 0;
|
|
31501
|
+
for (let c = 0; c < 3; c++) {
|
|
31502
|
+
const v = at(x, y, c);
|
|
31503
|
+
const axial = Math.max(
|
|
31504
|
+
Math.abs(v - at(left, y, c)),
|
|
31505
|
+
Math.abs(v - at(right, y, c)),
|
|
31506
|
+
Math.abs(v - at(x, up, c)),
|
|
31507
|
+
Math.abs(v - at(x, down, c))
|
|
31508
|
+
);
|
|
31509
|
+
const diagonal = Math.min(
|
|
31510
|
+
Math.abs(v - at(left, up, c)),
|
|
31511
|
+
Math.abs(v - at(right, up, c)),
|
|
31512
|
+
Math.abs(v - at(left, down, c)),
|
|
31513
|
+
Math.abs(v - at(right, down, c))
|
|
31514
|
+
);
|
|
31515
|
+
if (diagonal < axial) alternating++;
|
|
31516
|
+
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31517
|
+
hClip++;
|
|
31518
|
+
}
|
|
31519
|
+
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31520
|
+
vClip++;
|
|
31521
|
+
}
|
|
31522
|
+
}
|
|
31523
|
+
return hClip >= 2 && vClip >= 2 && alternating >= 2;
|
|
31524
|
+
};
|
|
31376
31525
|
for (let y = 0; y < h; y++) {
|
|
31377
|
-
const up = y > 0 ? y - 1 : Math.min(h - 1, y + 1);
|
|
31378
|
-
const down = y < h - 1 ? y + 1 : Math.max(0, y - 1);
|
|
31379
31526
|
for (let x = 0; x < w; x++) {
|
|
31380
|
-
|
|
31381
|
-
const right = x < w - 1 ? x + 1 : Math.max(0, x - 1);
|
|
31382
|
-
let hClip = 0;
|
|
31383
|
-
let vClip = 0;
|
|
31384
|
-
let alternating = 0;
|
|
31385
|
-
for (let c = 0; c < 3; c++) {
|
|
31386
|
-
const v = at(x, y, c);
|
|
31387
|
-
const axial = Math.max(
|
|
31388
|
-
Math.abs(v - at(left, y, c)),
|
|
31389
|
-
Math.abs(v - at(right, y, c)),
|
|
31390
|
-
Math.abs(v - at(x, up, c)),
|
|
31391
|
-
Math.abs(v - at(x, down, c))
|
|
31392
|
-
);
|
|
31393
|
-
const diagonal = Math.min(
|
|
31394
|
-
Math.abs(v - at(left, up, c)),
|
|
31395
|
-
Math.abs(v - at(right, up, c)),
|
|
31396
|
-
Math.abs(v - at(left, down, c)),
|
|
31397
|
-
Math.abs(v - at(right, down, c))
|
|
31398
|
-
);
|
|
31399
|
-
if (diagonal < axial) alternating++;
|
|
31400
|
-
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31401
|
-
hClip++;
|
|
31402
|
-
}
|
|
31403
|
-
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31404
|
-
vClip++;
|
|
31405
|
-
}
|
|
31406
|
-
}
|
|
31407
|
-
if (hClip < 2 || vClip < 2 || alternating < 2) {
|
|
31527
|
+
if (!speckled(x, y)) {
|
|
31408
31528
|
continue;
|
|
31409
31529
|
}
|
|
31530
|
+
const left = mirror2(x, w, -1);
|
|
31531
|
+
const right = mirror2(x, w, 1);
|
|
31532
|
+
const up = mirror2(y, h, -1);
|
|
31533
|
+
const down = mirror2(y, h, 1);
|
|
31534
|
+
const lonelyColumn = x === loneX && loneColumn(y);
|
|
31535
|
+
const lonelyRow = y === loneY && loneRow(x);
|
|
31536
|
+
const nearLoneX = x === loneX - 1 && loneX > 0 && loneColumn(y) && !speckled(loneX, y);
|
|
31537
|
+
const nearLoneY = y === loneY - 1 && loneY > 0 && loneRow(x) && !speckled(x, loneY);
|
|
31538
|
+
const cornerRepeats = lonelyColumn && lonelyRow && (!speckled(x, y - 1) || !speckled(x - 1, y));
|
|
31410
31539
|
for (let c = 0; c < 3; c++) {
|
|
31411
|
-
|
|
31540
|
+
const v = at(x, y, c);
|
|
31541
|
+
let r;
|
|
31542
|
+
if (lonelyColumn && lonelyRow) {
|
|
31543
|
+
r = cornerRepeats ? at(left, y, c) + 3 * v + 2 >> 2 : hBlur(x, y, c);
|
|
31544
|
+
} else {
|
|
31545
|
+
let sum = lonelyColumn ? at(x, up, c) + 2 * v + at(x, down, c) : at(left, y, c) + 2 * v + at(right, y, c);
|
|
31546
|
+
if (nearLoneX) sum += loneColumnValue(y, c) - at(loneX, y, c);
|
|
31547
|
+
if (nearLoneY) sum += loneRowValue(x, c) - at(x, loneY, c);
|
|
31548
|
+
r = sum + 2 >> 2;
|
|
31549
|
+
}
|
|
31550
|
+
px[(y * w + x) * 3 + c] = r;
|
|
31412
31551
|
}
|
|
31413
31552
|
}
|
|
31414
31553
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -28727,7 +28727,105 @@ var HOBBY = [
|
|
|
28727
28727
|
[[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
|
|
28728
28728
|
];
|
|
28729
28729
|
var HOBBY_LIMIT = 104;
|
|
28730
|
-
var
|
|
28730
|
+
var FLAT_SECTOR_BIAS = {
|
|
28731
|
+
7: [9, "cf..", "edededEdcDcdcd"],
|
|
28732
|
+
8: [9, "dFee", "ededededbdbdbd"],
|
|
28733
|
+
9: [9, "df..", "ddddddddbDbdbd"],
|
|
28734
|
+
10: [9, "de..", "dededeDebEbebE"],
|
|
28735
|
+
11: [9, "ce..", "eeeeeeEececece"],
|
|
28736
|
+
12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
|
|
28737
|
+
13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
|
|
28738
|
+
14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
|
|
28739
|
+
15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
|
|
28740
|
+
16: [17, "ce..", "eeeededededeeeeececebebebebece"],
|
|
28741
|
+
17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
|
|
28742
|
+
18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
|
|
28743
|
+
19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
|
|
28744
|
+
20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
|
|
28745
|
+
21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
|
|
28746
|
+
22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
|
|
28747
|
+
23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
|
|
28748
|
+
24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
|
|
28749
|
+
25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
|
|
28750
|
+
26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
|
|
28751
|
+
27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
|
|
28752
|
+
28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
|
|
28753
|
+
29: [17, "ce..", "eeeeeeeededededebebebebececece"],
|
|
28754
|
+
30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
|
|
28755
|
+
31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
|
|
28756
|
+
32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
|
|
28757
|
+
33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
|
|
28758
|
+
34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
|
|
28759
|
+
35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
|
|
28760
|
+
36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
|
|
28761
|
+
37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
|
|
28762
|
+
38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
|
|
28763
|
+
39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
|
|
28764
|
+
40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
|
|
28765
|
+
41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
|
|
28766
|
+
42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
|
|
28767
|
+
43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
|
|
28768
|
+
44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
|
|
28769
|
+
45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
|
|
28770
|
+
46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
|
|
28771
|
+
47: [17, "ce..", "dedededededededececececececece"],
|
|
28772
|
+
48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
|
|
28773
|
+
49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
|
|
28774
|
+
50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
|
|
28775
|
+
51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
|
|
28776
|
+
52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
|
|
28777
|
+
53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
|
|
28778
|
+
54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
|
|
28779
|
+
55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
|
|
28780
|
+
56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
|
|
28781
|
+
57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
|
|
28782
|
+
58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
|
|
28783
|
+
59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
|
|
28784
|
+
60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
|
|
28785
|
+
61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
|
|
28786
|
+
62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
|
|
28787
|
+
63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
|
|
28788
|
+
64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
|
|
28789
|
+
65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
|
|
28790
|
+
66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
|
|
28791
|
+
67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
|
|
28792
|
+
68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
|
|
28793
|
+
69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
|
|
28794
|
+
70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
|
|
28795
|
+
71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
|
|
28796
|
+
72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
|
|
28797
|
+
73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
|
|
28798
|
+
74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
|
|
28799
|
+
75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
|
|
28800
|
+
76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
|
|
28801
|
+
77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
|
|
28802
|
+
78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
|
|
28803
|
+
79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
|
|
28804
|
+
80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
|
|
28805
|
+
81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
|
|
28806
|
+
82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
|
|
28807
|
+
83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
|
|
28808
|
+
84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
|
|
28809
|
+
85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
|
|
28810
|
+
86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
|
|
28811
|
+
87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
|
|
28812
|
+
88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
|
|
28813
|
+
89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
|
|
28814
|
+
90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
|
|
28815
|
+
91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
|
|
28816
|
+
92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
|
|
28817
|
+
93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
|
|
28818
|
+
94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
|
|
28819
|
+
95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
|
|
28820
|
+
96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
|
|
28821
|
+
97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
|
|
28822
|
+
98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
|
|
28823
|
+
99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
|
|
28824
|
+
100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
|
|
28825
|
+
};
|
|
28826
|
+
function sectorBias(code) {
|
|
28827
|
+
return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
|
|
28828
|
+
}
|
|
28731
28829
|
var penCache = /* @__PURE__ */ new Map();
|
|
28732
28830
|
function penPolygon(width) {
|
|
28733
28831
|
const cached = penCache.get(width);
|
|
@@ -28806,13 +28904,19 @@ function perpendicularVectors(width, dx0, dy0) {
|
|
|
28806
28904
|
const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
|
|
28807
28905
|
const den = 2 * (bh - hB + (bh - hS));
|
|
28808
28906
|
const w = den === 0 ? 0 : (hB - hS) / den;
|
|
28809
|
-
const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
|
|
28810
|
-
const sgn = best < n / 2 ? 1 : -1;
|
|
28811
|
-
const ox = off ? sgn * off[0] : 0;
|
|
28812
|
-
const oy = off ? sgn * off[1] : 0;
|
|
28813
28907
|
const r = (v) => 8 * Math.floor((v + 4) / 8);
|
|
28814
28908
|
const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
|
|
28815
|
-
|
|
28909
|
+
let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
|
|
28910
|
+
const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
|
|
28911
|
+
if (table) {
|
|
28912
|
+
const key = best * 2 + (hP >= hN ? 0 : 1);
|
|
28913
|
+
const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
|
|
28914
|
+
if (pair[0] !== ".") {
|
|
28915
|
+
cx = sectorBias(pair.charCodeAt(0));
|
|
28916
|
+
cy = sectorBias(pair.charCodeAt(1));
|
|
28917
|
+
}
|
|
28918
|
+
}
|
|
28919
|
+
const vx = r(x + cx), vy = r(y + cy);
|
|
28816
28920
|
return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
|
|
28817
28921
|
}
|
|
28818
28922
|
function squareExtension(width, dx, dy) {
|
|
@@ -31371,42 +31475,77 @@ function halftoneDespeckle(px, w, h) {
|
|
|
31371
31475
|
const src = px.slice();
|
|
31372
31476
|
const at = (x, y, c) => src[(y * w + x) * 3 + c];
|
|
31373
31477
|
const over = (v) => v < -SPECKLE_OVERSHOOT * 4 || v > (255 + SPECKLE_OVERSHOOT) * 4;
|
|
31478
|
+
const loneX = w > 2 && w % 2 === 1 ? w - 1 : -1;
|
|
31479
|
+
const loneY = h > 2 && h % 2 === 1 ? h - 1 : -1;
|
|
31480
|
+
const mirror2 = (i, n, d) => {
|
|
31481
|
+
const j = i + d;
|
|
31482
|
+
return j < 0 || j >= n ? i - d : j;
|
|
31483
|
+
};
|
|
31484
|
+
const vBlur = (x, y, c) => at(x, mirror2(y, h, -1), c) + 2 * at(x, y, c) + at(x, mirror2(y, h, 1), c) + 2 >> 2;
|
|
31485
|
+
const hBlur = (x, y, c) => at(mirror2(x, w, -1), y, c) + 2 * at(x, y, c) + at(mirror2(x, w, 1), y, c) + 2 >> 2;
|
|
31486
|
+
const differs = (x0, y0, x1, y1) => at(x0, y0, 0) !== at(x1, y1, 0) || at(x0, y0, 1) !== at(x1, y1, 1) || at(x0, y0, 2) !== at(x1, y1, 2);
|
|
31487
|
+
const loneColumn = (y) => loneX > 0 && differs(loneX, y, loneX - 1, y);
|
|
31488
|
+
const loneRow = (x) => loneY > 0 && differs(x, loneY, x, loneY - 1);
|
|
31489
|
+
const loneColumnValue = (y, c) => y === loneY && loneRow(loneX) ? at(loneX, y - 1, c) + 3 * at(loneX, y, c) + 2 >> 2 : vBlur(loneX, y, c);
|
|
31490
|
+
const loneRowValue = (x, c) => x === loneX && loneColumn(loneY) ? at(x - 1, loneY, c) + 3 * at(x, loneY, c) + 2 >> 2 : hBlur(x, loneY, c);
|
|
31491
|
+
const speckled = (x, y) => {
|
|
31492
|
+
const up = mirror2(y, h, -1);
|
|
31493
|
+
const down = mirror2(y, h, 1);
|
|
31494
|
+
const left = mirror2(x, w, -1);
|
|
31495
|
+
const right = mirror2(x, w, 1);
|
|
31496
|
+
let hClip = 0;
|
|
31497
|
+
let vClip = 0;
|
|
31498
|
+
let alternating = 0;
|
|
31499
|
+
for (let c = 0; c < 3; c++) {
|
|
31500
|
+
const v = at(x, y, c);
|
|
31501
|
+
const axial = Math.max(
|
|
31502
|
+
Math.abs(v - at(left, y, c)),
|
|
31503
|
+
Math.abs(v - at(right, y, c)),
|
|
31504
|
+
Math.abs(v - at(x, up, c)),
|
|
31505
|
+
Math.abs(v - at(x, down, c))
|
|
31506
|
+
);
|
|
31507
|
+
const diagonal = Math.min(
|
|
31508
|
+
Math.abs(v - at(left, up, c)),
|
|
31509
|
+
Math.abs(v - at(right, up, c)),
|
|
31510
|
+
Math.abs(v - at(left, down, c)),
|
|
31511
|
+
Math.abs(v - at(right, down, c))
|
|
31512
|
+
);
|
|
31513
|
+
if (diagonal < axial) alternating++;
|
|
31514
|
+
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31515
|
+
hClip++;
|
|
31516
|
+
}
|
|
31517
|
+
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31518
|
+
vClip++;
|
|
31519
|
+
}
|
|
31520
|
+
}
|
|
31521
|
+
return hClip >= 2 && vClip >= 2 && alternating >= 2;
|
|
31522
|
+
};
|
|
31374
31523
|
for (let y = 0; y < h; y++) {
|
|
31375
|
-
const up = y > 0 ? y - 1 : Math.min(h - 1, y + 1);
|
|
31376
|
-
const down = y < h - 1 ? y + 1 : Math.max(0, y - 1);
|
|
31377
31524
|
for (let x = 0; x < w; x++) {
|
|
31378
|
-
|
|
31379
|
-
const right = x < w - 1 ? x + 1 : Math.max(0, x - 1);
|
|
31380
|
-
let hClip = 0;
|
|
31381
|
-
let vClip = 0;
|
|
31382
|
-
let alternating = 0;
|
|
31383
|
-
for (let c = 0; c < 3; c++) {
|
|
31384
|
-
const v = at(x, y, c);
|
|
31385
|
-
const axial = Math.max(
|
|
31386
|
-
Math.abs(v - at(left, y, c)),
|
|
31387
|
-
Math.abs(v - at(right, y, c)),
|
|
31388
|
-
Math.abs(v - at(x, up, c)),
|
|
31389
|
-
Math.abs(v - at(x, down, c))
|
|
31390
|
-
);
|
|
31391
|
-
const diagonal = Math.min(
|
|
31392
|
-
Math.abs(v - at(left, up, c)),
|
|
31393
|
-
Math.abs(v - at(right, up, c)),
|
|
31394
|
-
Math.abs(v - at(left, down, c)),
|
|
31395
|
-
Math.abs(v - at(right, down, c))
|
|
31396
|
-
);
|
|
31397
|
-
if (diagonal < axial) alternating++;
|
|
31398
|
-
if (over(6 * v - at(left, y, c) - at(right, y, c))) {
|
|
31399
|
-
hClip++;
|
|
31400
|
-
}
|
|
31401
|
-
if (over(6 * v - at(x, up, c) - at(x, down, c))) {
|
|
31402
|
-
vClip++;
|
|
31403
|
-
}
|
|
31404
|
-
}
|
|
31405
|
-
if (hClip < 2 || vClip < 2 || alternating < 2) {
|
|
31525
|
+
if (!speckled(x, y)) {
|
|
31406
31526
|
continue;
|
|
31407
31527
|
}
|
|
31528
|
+
const left = mirror2(x, w, -1);
|
|
31529
|
+
const right = mirror2(x, w, 1);
|
|
31530
|
+
const up = mirror2(y, h, -1);
|
|
31531
|
+
const down = mirror2(y, h, 1);
|
|
31532
|
+
const lonelyColumn = x === loneX && loneColumn(y);
|
|
31533
|
+
const lonelyRow = y === loneY && loneRow(x);
|
|
31534
|
+
const nearLoneX = x === loneX - 1 && loneX > 0 && loneColumn(y) && !speckled(loneX, y);
|
|
31535
|
+
const nearLoneY = y === loneY - 1 && loneY > 0 && loneRow(x) && !speckled(x, loneY);
|
|
31536
|
+
const cornerRepeats = lonelyColumn && lonelyRow && (!speckled(x, y - 1) || !speckled(x - 1, y));
|
|
31408
31537
|
for (let c = 0; c < 3; c++) {
|
|
31409
|
-
|
|
31538
|
+
const v = at(x, y, c);
|
|
31539
|
+
let r;
|
|
31540
|
+
if (lonelyColumn && lonelyRow) {
|
|
31541
|
+
r = cornerRepeats ? at(left, y, c) + 3 * v + 2 >> 2 : hBlur(x, y, c);
|
|
31542
|
+
} else {
|
|
31543
|
+
let sum = lonelyColumn ? at(x, up, c) + 2 * v + at(x, down, c) : at(left, y, c) + 2 * v + at(right, y, c);
|
|
31544
|
+
if (nearLoneX) sum += loneColumnValue(y, c) - at(loneX, y, c);
|
|
31545
|
+
if (nearLoneY) sum += loneRowValue(x, c) - at(x, loneY, c);
|
|
31546
|
+
r = sum + 2 >> 2;
|
|
31547
|
+
}
|
|
31548
|
+
px[(y * w + x) * 3 + c] = r;
|
|
31410
31549
|
}
|
|
31411
31550
|
}
|
|
31412
31551
|
}
|