qreator 9.7.1 → 9.8.2
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/README.md +18 -0
- package/lib/browser/pdf.umd.js +162 -118
- package/lib/browser/pdf.umd.js.map +1 -1
- package/lib/browser/png.d.ts +1 -1
- package/lib/browser/png.umd.js +138 -40
- package/lib/browser/png.umd.js.map +1 -1
- package/lib/browser/png_browser.d.ts +1 -1
- package/lib/browser/react.umd.js +276 -172
- package/lib/browser/react.umd.js.map +1 -1
- package/lib/browser/svg.d.ts +1 -1
- package/lib/browser/svg.umd.js +143 -39
- package/lib/browser/svg.umd.js.map +1 -1
- package/lib/browser/typing/types.d.ts +6 -0
- package/lib/browser/utils.d.ts +8 -2
- package/lib/errorcode.js +12 -16
- package/lib/errorcode.js.map +1 -1
- package/lib/matrix.js +11 -3
- package/lib/matrix.js.map +1 -1
- package/lib/pdf.js +26 -18
- package/lib/pdf.js.map +1 -1
- package/lib/png.d.ts +1 -1
- package/lib/png.js +5 -1
- package/lib/png.js.map +1 -1
- package/lib/png_browser.d.ts +1 -1
- package/lib/png_browser.js +17 -6
- package/lib/png_browser.js.map +1 -1
- package/lib/qr-base.js +6 -4
- package/lib/qr-base.js.map +1 -1
- package/lib/svg.d.ts +1 -1
- package/lib/svg.js +23 -6
- package/lib/svg.js.map +1 -1
- package/lib/tests/test.js +73 -1
- package/lib/tests/test.js.map +1 -1
- package/lib/typing/types.d.ts +6 -0
- package/lib/utils.d.ts +8 -2
- package/lib/utils.js +92 -11
- package/lib/utils.js.map +1 -1
- package/package.json +9 -9
- package/src/errorcode.ts +10 -17
- package/src/matrix.ts +13 -3
- package/src/pdf.ts +30 -17
- package/src/png.ts +8 -0
- package/src/png_browser.ts +19 -5
- package/src/qr-base.ts +6 -4
- package/src/svg.ts +28 -6
- package/src/tests/test.ts +73 -1
- package/src/typing/types.ts +45 -0
- package/src/utils.ts +114 -12
package/README.md
CHANGED
|
@@ -14,6 +14,8 @@ QR Code generator for browser and node.js with tree shaking and logo support
|
|
|
14
14
|
- supports color customization
|
|
15
15
|
- supports logos
|
|
16
16
|
- supports border-radius
|
|
17
|
+
- supports corner mode (merged rounded corners)
|
|
18
|
+
- supports finder pattern customization (shape + color)
|
|
17
19
|
- tree shaking support
|
|
18
20
|
- browser / node.js
|
|
19
21
|
|
|
@@ -47,6 +49,18 @@ const pngBuffer = await getPNG("I love QR", {
|
|
|
47
49
|
});
|
|
48
50
|
```
|
|
49
51
|
|
|
52
|
+
### Finder pattern customization
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
const svgString = await getSVG("I love QR", {
|
|
56
|
+
finderOuterShape: "drop",
|
|
57
|
+
finderInnerShape: "circle",
|
|
58
|
+
finderColor: "#ff0000",
|
|
59
|
+
borderRadius: 2,
|
|
60
|
+
cornerMode: "merge",
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
50
64
|
[More examples](./examples)
|
|
51
65
|
|
|
52
66
|
### Syntax
|
|
@@ -75,6 +89,10 @@ const pngBuffer = await getPNG("I love QR", {
|
|
|
75
89
|
| `color` | module color in rgba or hex format | number | `#000000` - `#000000` | `#000000`<br />(black with 100% opacity) |
|
|
76
90
|
| `bgColor` | background color in rgba or hex format | number | `#000000` - `#FFFFFF` | `#FFFFFF`<br />(white with 100% opacity) |
|
|
77
91
|
| `borderRadius` | border-radius (in pixels) | number | 0 - `size / 2` | `0` |
|
|
92
|
+
| `cornerMode` | how corners are rendered when borderRadius > 0 | string | `individual`, `merge` | `individual` |
|
|
93
|
+
| `finderOuterShape` | shape of the outer ring of finder patterns | string | `square`, `rounded`, `circle`, `drop` | `undefined` |
|
|
94
|
+
| `finderInnerShape` | shape of the inner dot of finder patterns | string | `square`, `rounded`, `circle`, `drop` | `undefined` |
|
|
95
|
+
| `finderColor` | color of finder patterns (overrides `color`) | number/string | same as `color` | `undefined` |
|
|
78
96
|
| `noExcavate` | don't remove partially covered modules | boolean | `true`, `false` | `false` |
|
|
79
97
|
|
|
80
98
|
|
package/lib/browser/pdf.umd.js
CHANGED
|
@@ -761,7 +761,7 @@
|
|
|
761
761
|
function requireCommon () {
|
|
762
762
|
if (hasRequiredCommon) return common;
|
|
763
763
|
hasRequiredCommon = 1;
|
|
764
|
-
(function (exports) {
|
|
764
|
+
(function (exports$1) {
|
|
765
765
|
|
|
766
766
|
|
|
767
767
|
var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
|
|
@@ -772,7 +772,7 @@
|
|
|
772
772
|
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
773
773
|
}
|
|
774
774
|
|
|
775
|
-
exports.assign = function (obj /*from1, from2, from3, ...*/) {
|
|
775
|
+
exports$1.assign = function (obj /*from1, from2, from3, ...*/) {
|
|
776
776
|
var sources = Array.prototype.slice.call(arguments, 1);
|
|
777
777
|
while (sources.length) {
|
|
778
778
|
var source = sources.shift();
|
|
@@ -794,7 +794,7 @@
|
|
|
794
794
|
|
|
795
795
|
|
|
796
796
|
// reduce buffer size, avoiding mem copy
|
|
797
|
-
exports.shrinkBuf = function (buf, size) {
|
|
797
|
+
exports$1.shrinkBuf = function (buf, size) {
|
|
798
798
|
if (buf.length === size) { return buf; }
|
|
799
799
|
if (buf.subarray) { return buf.subarray(0, size); }
|
|
800
800
|
buf.length = size;
|
|
@@ -851,21 +851,21 @@
|
|
|
851
851
|
|
|
852
852
|
// Enable/Disable typed arrays use, for testing
|
|
853
853
|
//
|
|
854
|
-
exports.setTyped = function (on) {
|
|
854
|
+
exports$1.setTyped = function (on) {
|
|
855
855
|
if (on) {
|
|
856
|
-
exports.Buf8 = Uint8Array;
|
|
857
|
-
exports.Buf16 = Uint16Array;
|
|
858
|
-
exports.Buf32 = Int32Array;
|
|
859
|
-
exports.assign(exports, fnTyped);
|
|
856
|
+
exports$1.Buf8 = Uint8Array;
|
|
857
|
+
exports$1.Buf16 = Uint16Array;
|
|
858
|
+
exports$1.Buf32 = Int32Array;
|
|
859
|
+
exports$1.assign(exports$1, fnTyped);
|
|
860
860
|
} else {
|
|
861
|
-
exports.Buf8 = Array;
|
|
862
|
-
exports.Buf16 = Array;
|
|
863
|
-
exports.Buf32 = Array;
|
|
864
|
-
exports.assign(exports, fnUntyped);
|
|
861
|
+
exports$1.Buf8 = Array;
|
|
862
|
+
exports$1.Buf16 = Array;
|
|
863
|
+
exports$1.Buf32 = Array;
|
|
864
|
+
exports$1.assign(exports$1, fnUntyped);
|
|
865
865
|
}
|
|
866
866
|
};
|
|
867
867
|
|
|
868
|
-
exports.setTyped(TYPED_OK);
|
|
868
|
+
exports$1.setTyped(TYPED_OK);
|
|
869
869
|
} (common));
|
|
870
870
|
return common;
|
|
871
871
|
}
|
|
@@ -10808,7 +10808,6 @@
|
|
|
10808
10808
|
var flags = makeFontFlags({
|
|
10809
10809
|
fixedPitch: font.post.isFixedPitch,
|
|
10810
10810
|
serif: 1 <= familyClass && familyClass <= 7,
|
|
10811
|
-
symbolic: true,
|
|
10812
10811
|
script: familyClass === 10,
|
|
10813
10812
|
italic: font.head.macStyle.italic,
|
|
10814
10813
|
});
|
|
@@ -11598,7 +11597,7 @@
|
|
|
11598
11597
|
h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0;}for(var c=0;
|
|
11599
11598
|
c<Q;c++){var K=A(N,d+c*3,3);b.Q[(b.X[c]<<1)+1]=K;if(K>j)j=K;}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d;
|
|
11600
11599
|
d=l(b.u,(1<<j)-1,J+h,N,d,b.v);var r=V.V(b.v,0,J,b.C);X=(1<<r)-1;var S=V.V(b.v,J,h,b.D);u=(1<<S)-1;M(b.C,r);
|
|
11601
|
-
I(b.C,r,v);M(b.D,S);I(b.D,S,C);}while(
|
|
11600
|
+
I(b.C,r,v);M(b.D,S);I(b.D,S,C);}while(true){var T=v[e(N,d)&X];d+=T&15;var p=T>>>4;if(p>>>8==0){W[w++]=p;}else if(p==256){break}else {var z=w+p-254;
|
|
11602
11601
|
if(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7;}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15);
|
|
11603
11602
|
d+=Y&15;while(w<z){W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a];}w=z;}}}return W.length==w?W:W.slice(0,w)};
|
|
11604
11603
|
H.H.W=function(N,W){var R=N.length;if(W<=R)return N;var V=new Uint8Array(R<<1);V.set(N,0);return V};
|
|
@@ -17551,7 +17550,7 @@
|
|
|
17551
17550
|
var p3x = 1 - 0.31;
|
|
17552
17551
|
// (x, y) coords of the check mark's center (vertically) point
|
|
17553
17552
|
var p1x = -1 + 0.325;
|
|
17554
|
-
var p1y =
|
|
17553
|
+
var p1y = 0.3995 / (p3y - p2y) + p2y;
|
|
17555
17554
|
/****************************************************************************/
|
|
17556
17555
|
return [
|
|
17557
17556
|
pushGraphicsState(),
|
|
@@ -22473,57 +22472,7 @@
|
|
|
22473
22472
|
};
|
|
22474
22473
|
|
|
22475
22474
|
var PageSizes = {
|
|
22476
|
-
|
|
22477
|
-
'2A0': [3370.39, 4767.87],
|
|
22478
|
-
A0: [2383.94, 3370.39],
|
|
22479
|
-
A1: [1683.78, 2383.94],
|
|
22480
|
-
A2: [1190.55, 1683.78],
|
|
22481
|
-
A3: [841.89, 1190.55],
|
|
22482
|
-
A4: [595.28, 841.89],
|
|
22483
|
-
A5: [419.53, 595.28],
|
|
22484
|
-
A6: [297.64, 419.53],
|
|
22485
|
-
A7: [209.76, 297.64],
|
|
22486
|
-
A8: [147.4, 209.76],
|
|
22487
|
-
A9: [104.88, 147.4],
|
|
22488
|
-
A10: [73.7, 104.88],
|
|
22489
|
-
B0: [2834.65, 4008.19],
|
|
22490
|
-
B1: [2004.09, 2834.65],
|
|
22491
|
-
B2: [1417.32, 2004.09],
|
|
22492
|
-
B3: [1000.63, 1417.32],
|
|
22493
|
-
B4: [708.66, 1000.63],
|
|
22494
|
-
B5: [498.9, 708.66],
|
|
22495
|
-
B6: [354.33, 498.9],
|
|
22496
|
-
B7: [249.45, 354.33],
|
|
22497
|
-
B8: [175.75, 249.45],
|
|
22498
|
-
B9: [124.72, 175.75],
|
|
22499
|
-
B10: [87.87, 124.72],
|
|
22500
|
-
C0: [2599.37, 3676.54],
|
|
22501
|
-
C1: [1836.85, 2599.37],
|
|
22502
|
-
C2: [1298.27, 1836.85],
|
|
22503
|
-
C3: [918.43, 1298.27],
|
|
22504
|
-
C4: [649.13, 918.43],
|
|
22505
|
-
C5: [459.21, 649.13],
|
|
22506
|
-
C6: [323.15, 459.21],
|
|
22507
|
-
C7: [229.61, 323.15],
|
|
22508
|
-
C8: [161.57, 229.61],
|
|
22509
|
-
C9: [113.39, 161.57],
|
|
22510
|
-
C10: [79.37, 113.39],
|
|
22511
|
-
RA0: [2437.8, 3458.27],
|
|
22512
|
-
RA1: [1729.13, 2437.8],
|
|
22513
|
-
RA2: [1218.9, 1729.13],
|
|
22514
|
-
RA3: [864.57, 1218.9],
|
|
22515
|
-
RA4: [609.45, 864.57],
|
|
22516
|
-
SRA0: [2551.18, 3628.35],
|
|
22517
|
-
SRA1: [1814.17, 2551.18],
|
|
22518
|
-
SRA2: [1275.59, 1814.17],
|
|
22519
|
-
SRA3: [907.09, 1275.59],
|
|
22520
|
-
SRA4: [637.8, 907.09],
|
|
22521
|
-
Executive: [521.86, 756.0],
|
|
22522
|
-
Folio: [612.0, 936.0],
|
|
22523
|
-
Legal: [612.0, 1008.0],
|
|
22524
|
-
Letter: [612.0, 792.0],
|
|
22525
|
-
Tabloid: [792.0, 1224.0],
|
|
22526
|
-
};
|
|
22475
|
+
A4: [595.28, 841.89]};
|
|
22527
22476
|
|
|
22528
22477
|
var ParseSpeeds;
|
|
22529
22478
|
(function (ParseSpeeds) {
|
|
@@ -25845,22 +25794,22 @@
|
|
|
25845
25794
|
}
|
|
25846
25795
|
|
|
25847
25796
|
function calculateEC(msg, ec_len) {
|
|
25848
|
-
|
|
25797
|
+
const len = msg.length;
|
|
25798
|
+
const buf = new Array(len + ec_len);
|
|
25799
|
+
for (let i = 0; i < len; i++)
|
|
25800
|
+
buf[i] = msg[i];
|
|
25801
|
+
for (let i = len; i < len + ec_len; i++)
|
|
25802
|
+
buf[i] = 0;
|
|
25849
25803
|
const poly = generatorPolynomial(ec_len);
|
|
25850
|
-
for (let
|
|
25851
|
-
|
|
25852
|
-
while (msg.length > ec_len) {
|
|
25853
|
-
if (!msg[0]) {
|
|
25854
|
-
msg.shift();
|
|
25804
|
+
for (let offset = 0; offset < len; offset++) {
|
|
25805
|
+
if (!buf[offset])
|
|
25855
25806
|
continue;
|
|
25856
|
-
|
|
25857
|
-
const log_k = log(msg[0]);
|
|
25807
|
+
const log_k = log(buf[offset]);
|
|
25858
25808
|
for (let i = 0; i <= ec_len; i++) {
|
|
25859
|
-
|
|
25809
|
+
buf[offset + i] = buf[offset + i] ^ exp(poly[i] + log_k);
|
|
25860
25810
|
}
|
|
25861
|
-
msg.shift();
|
|
25862
25811
|
}
|
|
25863
|
-
return new Uint8Array(
|
|
25812
|
+
return new Uint8Array(buf.slice(len));
|
|
25864
25813
|
}
|
|
25865
25814
|
const GF256_BASE = 285;
|
|
25866
25815
|
const EXP_TABLE = [1];
|
|
@@ -25875,11 +25824,7 @@
|
|
|
25875
25824
|
LOG_TABLE[EXP_TABLE[i]] = i;
|
|
25876
25825
|
}
|
|
25877
25826
|
function exp(k) {
|
|
25878
|
-
|
|
25879
|
-
k += 255;
|
|
25880
|
-
while (k > 255)
|
|
25881
|
-
k -= 255;
|
|
25882
|
-
return EXP_TABLE[k];
|
|
25827
|
+
return EXP_TABLE[((k % 255) + 255) % 255];
|
|
25883
25828
|
}
|
|
25884
25829
|
function log(k) {
|
|
25885
25830
|
if (k < 1 || k > 255) {
|
|
@@ -26243,9 +26188,17 @@
|
|
|
26243
26188
|
bestMask = mask;
|
|
26244
26189
|
}
|
|
26245
26190
|
}
|
|
26246
|
-
|
|
26247
|
-
|
|
26248
|
-
|
|
26191
|
+
if (bestMask !== 7) {
|
|
26192
|
+
fillData(matrix, data, bestMask);
|
|
26193
|
+
fillReserved(matrix, data.ec_level, bestMask);
|
|
26194
|
+
}
|
|
26195
|
+
for (let i = 0; i < matrix.length; i++) {
|
|
26196
|
+
const row = matrix[i];
|
|
26197
|
+
for (let j = 0; j < row.length; j++) {
|
|
26198
|
+
row[j] = (row[j] & 1);
|
|
26199
|
+
}
|
|
26200
|
+
}
|
|
26201
|
+
return matrix;
|
|
26249
26202
|
}
|
|
26250
26203
|
|
|
26251
26204
|
const EC_LEVELS = ["L", "M", "Q", "H"];
|
|
@@ -26261,7 +26214,7 @@
|
|
|
26261
26214
|
for (; i < 10; i++) {
|
|
26262
26215
|
let version = mappedVersions[i][ec_level];
|
|
26263
26216
|
if (version.data_len >= len) {
|
|
26264
|
-
return
|
|
26217
|
+
return copyTemplate(version);
|
|
26265
26218
|
}
|
|
26266
26219
|
}
|
|
26267
26220
|
if (message.data10) {
|
|
@@ -26273,14 +26226,14 @@
|
|
|
26273
26226
|
for (; i < 27; i++) {
|
|
26274
26227
|
let version = mappedVersions[i][ec_level];
|
|
26275
26228
|
if (version.data_len >= len) {
|
|
26276
|
-
return
|
|
26229
|
+
return copyTemplate(version);
|
|
26277
26230
|
}
|
|
26278
26231
|
}
|
|
26279
26232
|
len = Math.ceil(message.data27.length / 8);
|
|
26280
26233
|
for (; i < 41; i++) {
|
|
26281
26234
|
let version = mappedVersions[i][ec_level];
|
|
26282
26235
|
if (version.data_len >= len) {
|
|
26283
|
-
return
|
|
26236
|
+
return copyTemplate(version);
|
|
26284
26237
|
}
|
|
26285
26238
|
}
|
|
26286
26239
|
throw new Error("Too much data");
|
|
@@ -26325,7 +26278,9 @@
|
|
|
26325
26278
|
const data = fillTemplate(message, getTemplate(message, ec_level));
|
|
26326
26279
|
return getMatrix(data);
|
|
26327
26280
|
}
|
|
26328
|
-
|
|
26281
|
+
function copyTemplate(t) {
|
|
26282
|
+
return { ...t, blocks: [...t.blocks], ec: [] };
|
|
26283
|
+
}
|
|
26329
26284
|
const versions = [
|
|
26330
26285
|
[],
|
|
26331
26286
|
[26, 7, 1, 10, 1, 13, 1, 17, 1],
|
|
@@ -26908,7 +26863,22 @@
|
|
|
26908
26863
|
}
|
|
26909
26864
|
return rectangles.join(" ");
|
|
26910
26865
|
}
|
|
26911
|
-
function
|
|
26866
|
+
function isActive(matrix, x, y) {
|
|
26867
|
+
return x >= 0 && x < matrix.length && y >= 0 && y < (matrix[0]?.length ?? 0) && !!matrix[x][y];
|
|
26868
|
+
}
|
|
26869
|
+
function getExposedCorners(matrix, x, y) {
|
|
26870
|
+
const left = isActive(matrix, x - 1, y);
|
|
26871
|
+
const right = isActive(matrix, x + 1, y);
|
|
26872
|
+
const top = isActive(matrix, x, y - 1);
|
|
26873
|
+
const bottom = isActive(matrix, x, y + 1);
|
|
26874
|
+
return [
|
|
26875
|
+
!left && !top,
|
|
26876
|
+
!right && !top,
|
|
26877
|
+
!right && !bottom,
|
|
26878
|
+
!left && !bottom,
|
|
26879
|
+
];
|
|
26880
|
+
}
|
|
26881
|
+
function getDotsSVGPath(matrix, size, margin = 0, borderRadius = 0, cornerMode = 'individual') {
|
|
26912
26882
|
let rectangles = [];
|
|
26913
26883
|
for (let x = 0; x < matrix.length; x++) {
|
|
26914
26884
|
const column = matrix[x];
|
|
@@ -26916,17 +26886,27 @@
|
|
|
26916
26886
|
if (column[y]) {
|
|
26917
26887
|
const leftX = x * size + margin;
|
|
26918
26888
|
const topY = y * size + margin;
|
|
26919
|
-
|
|
26889
|
+
let rTL, rTR, rBR, rBL;
|
|
26890
|
+
if (cornerMode === 'merge') {
|
|
26891
|
+
const [eTL, eTR, eBR, eBL] = getExposedCorners(matrix, x, y);
|
|
26892
|
+
rTL = eTL ? borderRadius : 0;
|
|
26893
|
+
rTR = eTR ? borderRadius : 0;
|
|
26894
|
+
rBR = eBR ? borderRadius : 0;
|
|
26895
|
+
rBL = eBL ? borderRadius : 0;
|
|
26896
|
+
}
|
|
26897
|
+
else {
|
|
26898
|
+
rTL = rTR = rBR = rBL = borderRadius;
|
|
26899
|
+
}
|
|
26920
26900
|
const rectangle = [
|
|
26921
|
-
svgMove(leftX, topY +
|
|
26922
|
-
svgVerticalDeltaLite(
|
|
26923
|
-
svgDeltaArc(
|
|
26924
|
-
svgHorizontalDeltaLine(
|
|
26925
|
-
svgDeltaArc(
|
|
26926
|
-
svgVerticalDeltaLite(-
|
|
26927
|
-
svgDeltaArc(
|
|
26928
|
-
svgHorizontalDeltaLine(-
|
|
26929
|
-
svgDeltaArc(
|
|
26901
|
+
svgMove(leftX, topY + rTL),
|
|
26902
|
+
svgVerticalDeltaLite(size - rTL - rBL),
|
|
26903
|
+
svgDeltaArc(rBL, rBL, rBL),
|
|
26904
|
+
svgHorizontalDeltaLine(size - rBL - rBR),
|
|
26905
|
+
svgDeltaArc(rBR, rBR, -rBR),
|
|
26906
|
+
svgVerticalDeltaLite(-(size - rBR - rTR)),
|
|
26907
|
+
svgDeltaArc(rTR, -rTR, -rTR),
|
|
26908
|
+
svgHorizontalDeltaLine(-(size - rTR - rTL)),
|
|
26909
|
+
svgDeltaArc(rTL, -rTL, rTL),
|
|
26930
26910
|
svgReturn(),
|
|
26931
26911
|
];
|
|
26932
26912
|
rectangles.push(...rectangle.flat());
|
|
@@ -26935,6 +26915,62 @@
|
|
|
26935
26915
|
}
|
|
26936
26916
|
return rectangles.join(" ");
|
|
26937
26917
|
}
|
|
26918
|
+
const FINDER_SIDES = [[0, 0], [1, 0], [0, 1]];
|
|
26919
|
+
const FINDER_END = 7;
|
|
26920
|
+
function getCornerRadii(shape, sideLength, borderRadius) {
|
|
26921
|
+
const maxR = sideLength / 2;
|
|
26922
|
+
switch (shape) {
|
|
26923
|
+
case 'square': return [0, 0, 0, 0];
|
|
26924
|
+
case 'rounded': return [borderRadius, borderRadius, borderRadius, borderRadius];
|
|
26925
|
+
case 'circle': return [maxR, maxR, maxR, maxR];
|
|
26926
|
+
case 'drop': return [maxR, 0, maxR, maxR];
|
|
26927
|
+
}
|
|
26928
|
+
}
|
|
26929
|
+
function drawFinderRect(xCorner, yCorner, sideLength, xSign, ySign, sweep, cornerRadii) {
|
|
26930
|
+
const [r0, r1, r2, r3] = cornerRadii;
|
|
26931
|
+
return [
|
|
26932
|
+
svgMove(xCorner, yCorner + r3 * ySign),
|
|
26933
|
+
svgVerticalDeltaLite(ySign * (sideLength - r3 - r0)),
|
|
26934
|
+
svgDeltaArc(r0, r0 * xSign, r0 * ySign, sweep),
|
|
26935
|
+
svgHorizontalDeltaLine(xSign * (sideLength - r0 - r1)),
|
|
26936
|
+
svgDeltaArc(r1, r1 * xSign, -r1 * ySign, sweep),
|
|
26937
|
+
svgVerticalDeltaLite(-ySign * (sideLength - r1 - r2)),
|
|
26938
|
+
svgDeltaArc(r2, -r2 * xSign, -r2 * ySign, sweep),
|
|
26939
|
+
svgHorizontalDeltaLine(-xSign * (sideLength - r2 - r3)),
|
|
26940
|
+
svgDeltaArc(r3, -r3 * xSign, r3 * ySign, sweep),
|
|
26941
|
+
svgReturn(),
|
|
26942
|
+
].flat();
|
|
26943
|
+
}
|
|
26944
|
+
function getFinderOuterSVGPath(matrix, size, margin, borderRadius, shape) {
|
|
26945
|
+
const matrixSize = matrix.length * size + margin * 2;
|
|
26946
|
+
const rectangles = [];
|
|
26947
|
+
for (const side of FINDER_SIDES) {
|
|
26948
|
+
const [xSign, ySign] = side.map(s => s === 0 ? 1 : -1);
|
|
26949
|
+
const sweep = side[1] | side[0];
|
|
26950
|
+
for (const offset of [0, 1]) {
|
|
26951
|
+
const sideLength = size * (FINDER_END - 2 * offset);
|
|
26952
|
+
const xCorner = matrixSize * side[0] + xSign * (margin + size * offset);
|
|
26953
|
+
const yCorner = matrixSize * side[1] + ySign * (margin + size * offset);
|
|
26954
|
+
const radii = getCornerRadii(shape, sideLength, borderRadius);
|
|
26955
|
+
rectangles.push(...drawFinderRect(xCorner, yCorner, sideLength, xSign, ySign, sweep, radii));
|
|
26956
|
+
}
|
|
26957
|
+
}
|
|
26958
|
+
return rectangles.join(" ");
|
|
26959
|
+
}
|
|
26960
|
+
function getFinderInnerSVGPath(matrix, size, margin, borderRadius, shape) {
|
|
26961
|
+
const matrixSize = matrix.length * size + margin * 2;
|
|
26962
|
+
const rectangles = [];
|
|
26963
|
+
for (const side of FINDER_SIDES) {
|
|
26964
|
+
const [xSign, ySign] = side.map(s => s === 0 ? 1 : -1);
|
|
26965
|
+
const sweep = side[1] | side[0];
|
|
26966
|
+
const sideLength = size * (FINDER_END - 2 * 2);
|
|
26967
|
+
const xCorner = matrixSize * side[0] + xSign * (margin + size * 2);
|
|
26968
|
+
const yCorner = matrixSize * side[1] + ySign * (margin + size * 2);
|
|
26969
|
+
const radii = getCornerRadii(shape, sideLength, borderRadius);
|
|
26970
|
+
rectangles.push(...drawFinderRect(xCorner, yCorner, sideLength, xSign, ySign, sweep, radii));
|
|
26971
|
+
}
|
|
26972
|
+
return rectangles.join(" ");
|
|
26973
|
+
}
|
|
26938
26974
|
const commonOptions = {
|
|
26939
26975
|
type: "png",
|
|
26940
26976
|
parse_url: false,
|
|
@@ -27043,7 +27079,7 @@
|
|
|
27043
27079
|
page.getContentStream = page.prevGetContentStream;
|
|
27044
27080
|
page.contentStream.push = page.contentStream.prevPush;
|
|
27045
27081
|
}
|
|
27046
|
-
async function PDF({ matrix, margin, logo, logoWidth, logoHeight, color, bgColor, borderRadius, }) {
|
|
27082
|
+
async function PDF({ matrix, margin, logo, logoWidth, logoHeight, color, bgColor, borderRadius, cornerMode, finderOuterShape, finderInnerShape, finderColor, }) {
|
|
27047
27083
|
const size = 9;
|
|
27048
27084
|
const marginPx = margin * size;
|
|
27049
27085
|
const matrixSizePx = matrix.length * size;
|
|
@@ -27055,22 +27091,30 @@
|
|
|
27055
27091
|
color: rgb(...colorToRGB(bgColor)),
|
|
27056
27092
|
});
|
|
27057
27093
|
page.moveTo(0, page.getHeight());
|
|
27058
|
-
const
|
|
27059
|
-
|
|
27060
|
-
|
|
27061
|
-
|
|
27062
|
-
|
|
27063
|
-
|
|
27064
|
-
|
|
27065
|
-
|
|
27066
|
-
|
|
27067
|
-
|
|
27068
|
-
color:
|
|
27069
|
-
|
|
27070
|
-
|
|
27071
|
-
|
|
27072
|
-
|
|
27073
|
-
|
|
27094
|
+
const fgRGB = rgb(...colorToRGB(color));
|
|
27095
|
+
const fgOpacity = getOpacity(color);
|
|
27096
|
+
const fgStyle = { color: fgRGB, opacity: fgOpacity, borderColor: fgRGB, borderOpacity: fgOpacity };
|
|
27097
|
+
const path = getDotsSVGPath(matrix, size, marginPx, borderRadius, cornerMode);
|
|
27098
|
+
page.drawSvgPath(path, fgStyle);
|
|
27099
|
+
const hasFinderOptions = finderOuterShape || finderInnerShape || finderColor;
|
|
27100
|
+
if (hasFinderOptions) {
|
|
27101
|
+
const fc = finderColor ?? color;
|
|
27102
|
+
const fcRGB = rgb(...colorToRGB(fc));
|
|
27103
|
+
const fcOpacity = getOpacity(fc);
|
|
27104
|
+
const fcStyle = { color: fcRGB, opacity: fcOpacity, borderColor: fcRGB, borderOpacity: fcOpacity };
|
|
27105
|
+
const outerPath = getFinderOuterSVGPath(matrix, size, marginPx, borderRadius, finderOuterShape ?? 'rounded');
|
|
27106
|
+
patchContentStream(page);
|
|
27107
|
+
page.drawSvgPath(outerPath, fcStyle);
|
|
27108
|
+
revertContentStream(page);
|
|
27109
|
+
const innerPath = getFinderInnerSVGPath(matrix, size, marginPx, borderRadius, finderInnerShape ?? 'rounded');
|
|
27110
|
+
page.drawSvgPath(innerPath, fcStyle);
|
|
27111
|
+
}
|
|
27112
|
+
else {
|
|
27113
|
+
const findersPath = getFindersSVGPath(matrix, size, marginPx, borderRadius);
|
|
27114
|
+
patchContentStream(page);
|
|
27115
|
+
page.drawSvgPath(findersPath, fgStyle);
|
|
27116
|
+
revertContentStream(page);
|
|
27117
|
+
}
|
|
27074
27118
|
if (logo) {
|
|
27075
27119
|
let logoData;
|
|
27076
27120
|
const header = new Uint8Array(logo.slice(0, 4));
|