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.
Files changed (48) hide show
  1. package/README.md +18 -0
  2. package/lib/browser/pdf.umd.js +162 -118
  3. package/lib/browser/pdf.umd.js.map +1 -1
  4. package/lib/browser/png.d.ts +1 -1
  5. package/lib/browser/png.umd.js +138 -40
  6. package/lib/browser/png.umd.js.map +1 -1
  7. package/lib/browser/png_browser.d.ts +1 -1
  8. package/lib/browser/react.umd.js +276 -172
  9. package/lib/browser/react.umd.js.map +1 -1
  10. package/lib/browser/svg.d.ts +1 -1
  11. package/lib/browser/svg.umd.js +143 -39
  12. package/lib/browser/svg.umd.js.map +1 -1
  13. package/lib/browser/typing/types.d.ts +6 -0
  14. package/lib/browser/utils.d.ts +8 -2
  15. package/lib/errorcode.js +12 -16
  16. package/lib/errorcode.js.map +1 -1
  17. package/lib/matrix.js +11 -3
  18. package/lib/matrix.js.map +1 -1
  19. package/lib/pdf.js +26 -18
  20. package/lib/pdf.js.map +1 -1
  21. package/lib/png.d.ts +1 -1
  22. package/lib/png.js +5 -1
  23. package/lib/png.js.map +1 -1
  24. package/lib/png_browser.d.ts +1 -1
  25. package/lib/png_browser.js +17 -6
  26. package/lib/png_browser.js.map +1 -1
  27. package/lib/qr-base.js +6 -4
  28. package/lib/qr-base.js.map +1 -1
  29. package/lib/svg.d.ts +1 -1
  30. package/lib/svg.js +23 -6
  31. package/lib/svg.js.map +1 -1
  32. package/lib/tests/test.js +73 -1
  33. package/lib/tests/test.js.map +1 -1
  34. package/lib/typing/types.d.ts +6 -0
  35. package/lib/utils.d.ts +8 -2
  36. package/lib/utils.js +92 -11
  37. package/lib/utils.js.map +1 -1
  38. package/package.json +9 -9
  39. package/src/errorcode.ts +10 -17
  40. package/src/matrix.ts +13 -3
  41. package/src/pdf.ts +30 -17
  42. package/src/png.ts +8 -0
  43. package/src/png_browser.ts +19 -5
  44. package/src/qr-base.ts +6 -4
  45. package/src/svg.ts +28 -6
  46. package/src/tests/test.ts +73 -1
  47. package/src/typing/types.ts +45 -0
  48. 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
 
@@ -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(!0){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;
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 = -((p1x - p2x) * (p3x - p2x)) / (p3y - p2y) + p2y;
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
- '4A0': [4767.87, 6740.79],
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
- msg = [].slice.call(msg);
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 i = 0; i < ec_len; i++)
25851
- msg.push(0);
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
- msg[i] = msg[i] ^ exp(poly[i] + log_k);
25809
+ buf[offset + i] = buf[offset + i] ^ exp(poly[i] + log_k);
25860
25810
  }
25861
- msg.shift();
25862
25811
  }
25863
- return new Uint8Array(msg);
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
- while (k < 0)
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
- fillData(matrix, data, bestMask);
26247
- fillReserved(matrix, data.ec_level, bestMask);
26248
- return matrix.map((row) => row.map((cell) => (cell & 1)));
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 deepCopy(version);
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 deepCopy(version);
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 deepCopy(version);
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
- const deepCopy = typeof structuredClone !== "undefined" ? structuredClone : ((obj) => JSON.parse(JSON.stringify(obj)));
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 getDotsSVGPath(matrix, size, margin = 0, borderRadius = 0) {
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
- const delta = size - 2 * borderRadius;
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 + borderRadius),
26922
- svgVerticalDeltaLite(delta),
26923
- svgDeltaArc(borderRadius, borderRadius, borderRadius),
26924
- svgHorizontalDeltaLine(delta),
26925
- svgDeltaArc(borderRadius, borderRadius, -borderRadius),
26926
- svgVerticalDeltaLite(-delta),
26927
- svgDeltaArc(borderRadius, -borderRadius, -borderRadius),
26928
- svgHorizontalDeltaLine(-delta),
26929
- svgDeltaArc(borderRadius, -borderRadius, borderRadius),
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 path = getDotsSVGPath(matrix, size, marginPx, borderRadius);
27059
- page.drawSvgPath(path, {
27060
- color: rgb(...colorToRGB(color)),
27061
- opacity: getOpacity(color),
27062
- borderColor: rgb(...colorToRGB(color)),
27063
- borderOpacity: getOpacity(color),
27064
- });
27065
- const findersPath = getFindersSVGPath(matrix, size, marginPx, borderRadius);
27066
- patchContentStream(page);
27067
- page.drawSvgPath(findersPath, {
27068
- color: rgb(...colorToRGB(color)),
27069
- opacity: getOpacity(color),
27070
- borderColor: rgb(...colorToRGB(color)),
27071
- borderOpacity: getOpacity(color),
27072
- });
27073
- revertContentStream(page);
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));