@liquid-js/qr-code-styling 1.10.3 → 1.10.5
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.
|
@@ -612,6 +612,56 @@ class QRDot {
|
|
|
612
612
|
}
|
|
613
613
|
}
|
|
614
614
|
|
|
615
|
+
const browserImageTools = {
|
|
616
|
+
toDataURL(url) {
|
|
617
|
+
return new Promise((resolve, reject) => {
|
|
618
|
+
if (typeof url == "string") {
|
|
619
|
+
const xhr = new XMLHttpRequest();
|
|
620
|
+
xhr.onload = function () {
|
|
621
|
+
const reader = new FileReader();
|
|
622
|
+
reader.onloadend = function () {
|
|
623
|
+
resolve(reader.result);
|
|
624
|
+
};
|
|
625
|
+
reader.readAsDataURL(xhr.response);
|
|
626
|
+
};
|
|
627
|
+
xhr.onerror = xhr.onabort = xhr.ontimeout = reject;
|
|
628
|
+
xhr.open("GET", url);
|
|
629
|
+
xhr.responseType = "blob";
|
|
630
|
+
xhr.send();
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
const reader = new FileReader();
|
|
634
|
+
reader.onloadend = function () {
|
|
635
|
+
resolve(reader.result);
|
|
636
|
+
};
|
|
637
|
+
reader.readAsDataURL(url);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
},
|
|
641
|
+
getSize(options) {
|
|
642
|
+
return new Promise((resolve, reject) => {
|
|
643
|
+
if (!options.image) {
|
|
644
|
+
return reject("Image is not defined");
|
|
645
|
+
}
|
|
646
|
+
const image = new Image();
|
|
647
|
+
if (typeof options.imageOptions.crossOrigin === "string") {
|
|
648
|
+
image.crossOrigin = options.imageOptions.crossOrigin;
|
|
649
|
+
}
|
|
650
|
+
image.onload = () => {
|
|
651
|
+
resolve({ width: image.width, height: image.height });
|
|
652
|
+
};
|
|
653
|
+
image.onerror = image.onabort = reject;
|
|
654
|
+
if (typeof options.image == "string")
|
|
655
|
+
image.src = options.image;
|
|
656
|
+
else
|
|
657
|
+
browserImageTools
|
|
658
|
+
.toDataURL(options.image)
|
|
659
|
+
.then((url) => (image.src = url))
|
|
660
|
+
.catch(reject);
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
|
|
615
665
|
function calculateImageSize({ originalHeight, originalWidth, maxHiddenDots, maxHiddenAxisDots, dotSize, margin }) {
|
|
616
666
|
const hideDots = { x: 0, y: 0 };
|
|
617
667
|
const imageSize = { x: 0, y: 0 };
|
|
@@ -682,56 +732,6 @@ function calculateImageSize({ originalHeight, originalWidth, maxHiddenDots, maxH
|
|
|
682
732
|
};
|
|
683
733
|
}
|
|
684
734
|
|
|
685
|
-
const browserImageTools = {
|
|
686
|
-
toDataURL(url) {
|
|
687
|
-
return new Promise((resolve, reject) => {
|
|
688
|
-
if (typeof url == "string") {
|
|
689
|
-
const xhr = new XMLHttpRequest();
|
|
690
|
-
xhr.onload = function () {
|
|
691
|
-
const reader = new FileReader();
|
|
692
|
-
reader.onloadend = function () {
|
|
693
|
-
resolve(reader.result);
|
|
694
|
-
};
|
|
695
|
-
reader.readAsDataURL(xhr.response);
|
|
696
|
-
};
|
|
697
|
-
xhr.onerror = xhr.onabort = xhr.ontimeout = reject;
|
|
698
|
-
xhr.open("GET", url);
|
|
699
|
-
xhr.responseType = "blob";
|
|
700
|
-
xhr.send();
|
|
701
|
-
}
|
|
702
|
-
else {
|
|
703
|
-
const reader = new FileReader();
|
|
704
|
-
reader.onloadend = function () {
|
|
705
|
-
resolve(reader.result);
|
|
706
|
-
};
|
|
707
|
-
reader.readAsDataURL(url);
|
|
708
|
-
}
|
|
709
|
-
});
|
|
710
|
-
},
|
|
711
|
-
getSize(options) {
|
|
712
|
-
return new Promise((resolve, reject) => {
|
|
713
|
-
if (!options.image) {
|
|
714
|
-
return reject("Image is not defined");
|
|
715
|
-
}
|
|
716
|
-
const image = new Image();
|
|
717
|
-
if (typeof options.imageOptions.crossOrigin === "string") {
|
|
718
|
-
image.crossOrigin = options.imageOptions.crossOrigin;
|
|
719
|
-
}
|
|
720
|
-
image.onload = () => {
|
|
721
|
-
resolve({ width: image.width, height: image.height });
|
|
722
|
-
};
|
|
723
|
-
image.onerror = image.onabort = reject;
|
|
724
|
-
if (typeof options.image == "string")
|
|
725
|
-
image.src = options.image;
|
|
726
|
-
else
|
|
727
|
-
browserImageTools
|
|
728
|
-
.toDataURL(options.image)
|
|
729
|
-
.then((url) => (image.src = url))
|
|
730
|
-
.catch(reject);
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
};
|
|
734
|
-
|
|
735
735
|
const squareMask = [
|
|
736
736
|
[1, 1, 1, 1, 1, 1, 1],
|
|
737
737
|
[1, 0, 0, 0, 0, 0, 1],
|
|
@@ -750,48 +750,15 @@ const dotMask = [
|
|
|
750
750
|
[0, 0, 0, 0, 0, 0, 0],
|
|
751
751
|
[0, 0, 0, 0, 0, 0, 0]
|
|
752
752
|
];
|
|
753
|
-
const
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
"9": 1056,
|
|
763
|
-
"10": 1232,
|
|
764
|
-
"11": 1440,
|
|
765
|
-
"12": 1648,
|
|
766
|
-
"13": 1952,
|
|
767
|
-
"14": 2088,
|
|
768
|
-
"15": 2360,
|
|
769
|
-
"16": 2600,
|
|
770
|
-
"17": 2936,
|
|
771
|
-
"18": 3176,
|
|
772
|
-
"19": 3560,
|
|
773
|
-
"20": 3880,
|
|
774
|
-
"21": 4096,
|
|
775
|
-
"22": 4544,
|
|
776
|
-
"23": 4912,
|
|
777
|
-
"24": 5312,
|
|
778
|
-
"25": 5744,
|
|
779
|
-
"26": 6032,
|
|
780
|
-
"27": 6464,
|
|
781
|
-
"28": 6968,
|
|
782
|
-
"29": 7288,
|
|
783
|
-
"30": 7880,
|
|
784
|
-
"31": 8264,
|
|
785
|
-
"32": 8920,
|
|
786
|
-
"33": 9368,
|
|
787
|
-
"34": 9848,
|
|
788
|
-
"35": 10288,
|
|
789
|
-
"36": 10832,
|
|
790
|
-
"37": 11408,
|
|
791
|
-
"38": 12016,
|
|
792
|
-
"39": 12656,
|
|
793
|
-
"40": 13328
|
|
794
|
-
};
|
|
753
|
+
const alignmentCount = [
|
|
754
|
+
[35, 46],
|
|
755
|
+
[28, 33],
|
|
756
|
+
[21, 22],
|
|
757
|
+
[14, 13],
|
|
758
|
+
[7, 6],
|
|
759
|
+
[2, 1],
|
|
760
|
+
[1, 0]
|
|
761
|
+
];
|
|
795
762
|
class QRSVG {
|
|
796
763
|
//TODO don't pass all options to this class
|
|
797
764
|
constructor(options) {
|
|
@@ -816,7 +783,7 @@ class QRSVG {
|
|
|
816
783
|
}
|
|
817
784
|
async drawQR(qr) {
|
|
818
785
|
const count = qr.getModuleCount();
|
|
819
|
-
const typeNumber = ((count - 17) / 4).toFixed(0);
|
|
786
|
+
const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10);
|
|
820
787
|
const dotSize = this._options.dotsOptions.size;
|
|
821
788
|
let drawImageSize = {
|
|
822
789
|
hideXDots: 0,
|
|
@@ -830,7 +797,9 @@ class QRSVG {
|
|
|
830
797
|
const size = await this._imageTools.getSize(this._options);
|
|
831
798
|
const { imageOptions, qrOptions } = this._options;
|
|
832
799
|
const coverLevel = imageOptions.imageSize * ErrorCorrectionPercents[qrOptions.errorCorrectionLevel];
|
|
833
|
-
const
|
|
800
|
+
const alignment = alignmentCount.find((v) => v[0] <= typeNumber) || [0, 0];
|
|
801
|
+
const maxHiddenDots = Math.floor(coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment[1] * 25));
|
|
802
|
+
console.log(alignment, typeNumber, maxHiddenDots);
|
|
834
803
|
drawImageSize = calculateImageSize({
|
|
835
804
|
originalWidth: size.width,
|
|
836
805
|
originalHeight: size.height,
|