1// go-qrcode 2// Copyright 2014 Tom Harwood 3 4package qrcode 5 6import ( 7 "log" 8 9 bitset "github.com/skip2/go-qrcode/bitset" 10) 11 12// Error detection/recovery capacity. 13// 14// There are several levels of error detection/recovery capacity. Higher levels 15// of error recovery are able to correct more errors, with the trade-off of 16// increased symbol size. 17type RecoveryLevel int 18 19const ( 20 // Level L: 7% error recovery. 21 Low RecoveryLevel = iota 22 23 // Level M: 15% error recovery. Good default choice. 24 Medium 25 26 // Level Q: 25% error recovery. 27 High 28 29 // Level H: 30% error recovery. 30 Highest 31) 32 33// qrCodeVersion describes the data length and encoding order of a single QR 34// Code version. There are 40 versions numbers x 4 recovery levels == 160 35// possible qrCodeVersion structures. 36type qrCodeVersion struct { 37 // Version number (1-40 inclusive). 38 version int 39 40 // Error recovery level. 41 level RecoveryLevel 42 43 dataEncoderType dataEncoderType 44 45 // Encoded data can be split into multiple blocks. Each block contains data 46 // and error recovery bytes. 47 // 48 // Larger QR Codes contain more blocks. 49 block []block 50 51 // Number of bits required to pad the combined data & error correction bit 52 // stream up to the symbol's full capacity. 53 numRemainderBits int 54} 55 56type block struct { 57 numBlocks int 58 59 // Total codewords (numCodewords == numErrorCodewords+numDataCodewords). 60 numCodewords int 61 62 // Number of data codewords. 63 numDataCodewords int 64} 65 66var ( 67 versions = []qrCodeVersion{ 68 { 69 1, 70 Low, 71 dataEncoderType1To9, 72 []block{ 73 { 74 1, 75 26, 76 19, 77 }, 78 }, 79 0, 80 }, 81 { 82 1, 83 Medium, 84 dataEncoderType1To9, 85 []block{ 86 { 87 1, 88 26, 89 16, 90 }, 91 }, 92 0, 93 }, 94 { 95 1, 96 High, 97 dataEncoderType1To9, 98 []block{ 99 { 100 1, 101 26, 102 13, 103 }, 104 }, 105 0, 106 }, 107 { 108 1, 109 Highest, 110 dataEncoderType1To9, 111 []block{ 112 { 113 1, 114 26, 115 9, 116 }, 117 }, 118 0, 119 }, 120 { 121 2, 122 Low, 123 dataEncoderType1To9, 124 []block{ 125 { 126 1, 127 44, 128 34, 129 }, 130 }, 131 7, 132 }, 133 { 134 2, 135 Medium, 136 dataEncoderType1To9, 137 []block{ 138 { 139 1, 140 44, 141 28, 142 }, 143 }, 144 7, 145 }, 146 { 147 2, 148 High, 149 dataEncoderType1To9, 150 []block{ 151 { 152 1, 153 44, 154 22, 155 }, 156 }, 157 7, 158 }, 159 { 160 2, 161 Highest, 162 dataEncoderType1To9, 163 []block{ 164 { 165 1, 166 44, 167 16, 168 }, 169 }, 170 7, 171 }, 172 { 173 3, 174 Low, 175 dataEncoderType1To9, 176 []block{ 177 { 178 1, 179 70, 180 55, 181 }, 182 }, 183 7, 184 }, 185 { 186 3, 187 Medium, 188 dataEncoderType1To9, 189 []block{ 190 { 191 1, 192 70, 193 44, 194 }, 195 }, 196 7, 197 }, 198 { 199 3, 200 High, 201 dataEncoderType1To9, 202 []block{ 203 { 204 2, 205 35, 206 17, 207 }, 208 }, 209 7, 210 }, 211 { 212 3, 213 Highest, 214 dataEncoderType1To9, 215 []block{ 216 { 217 2, 218 35, 219 13, 220 }, 221 }, 222 7, 223 }, 224 { 225 4, 226 Low, 227 dataEncoderType1To9, 228 []block{ 229 { 230 1, 231 100, 232 80, 233 }, 234 }, 235 7, 236 }, 237 { 238 4, 239 Medium, 240 dataEncoderType1To9, 241 []block{ 242 { 243 2, 244 50, 245 32, 246 }, 247 }, 248 7, 249 }, 250 { 251 4, 252 High, 253 dataEncoderType1To9, 254 []block{ 255 { 256 2, 257 50, 258 24, 259 }, 260 }, 261 7, 262 }, 263 { 264 4, 265 Highest, 266 dataEncoderType1To9, 267 []block{ 268 { 269 4, 270 25, 271 9, 272 }, 273 }, 274 7, 275 }, 276 { 277 5, 278 Low, 279 dataEncoderType1To9, 280 []block{ 281 { 282 1, 283 134, 284 108, 285 }, 286 }, 287 7, 288 }, 289 { 290 5, 291 Medium, 292 dataEncoderType1To9, 293 []block{ 294 { 295 2, 296 67, 297 43, 298 }, 299 }, 300 7, 301 }, 302 { 303 5, 304 High, 305 dataEncoderType1To9, 306 []block{ 307 { 308 2, 309 33, 310 15, 311 }, 312 { 313 2, 314 34, 315 16, 316 }, 317 }, 318 7, 319 }, 320 { 321 5, 322 Highest, 323 dataEncoderType1To9, 324 []block{ 325 { 326 2, 327 33, 328 11, 329 }, 330 { 331 2, 332 34, 333 12, 334 }, 335 }, 336 7, 337 }, 338 { 339 6, 340 Low, 341 dataEncoderType1To9, 342 []block{ 343 { 344 2, 345 86, 346 68, 347 }, 348 }, 349 7, 350 }, 351 { 352 6, 353 Medium, 354 dataEncoderType1To9, 355 []block{ 356 { 357 4, 358 43, 359 27, 360 }, 361 }, 362 7, 363 }, 364 { 365 6, 366 High, 367 dataEncoderType1To9, 368 []block{ 369 { 370 4, 371 43, 372 19, 373 }, 374 }, 375 7, 376 }, 377 { 378 6, 379 Highest, 380 dataEncoderType1To9, 381 []block{ 382 { 383 4, 384 43, 385 15, 386 }, 387 }, 388 7, 389 }, 390 { 391 7, 392 Low, 393 dataEncoderType1To9, 394 []block{ 395 { 396 2, 397 98, 398 78, 399 }, 400 }, 401 0, 402 }, 403 { 404 7, 405 Medium, 406 dataEncoderType1To9, 407 []block{ 408 { 409 4, 410 49, 411 31, 412 }, 413 }, 414 0, 415 }, 416 { 417 7, 418 High, 419 dataEncoderType1To9, 420 []block{ 421 { 422 2, 423 32, 424 14, 425 }, 426 { 427 4, 428 33, 429 15, 430 }, 431 }, 432 0, 433 }, 434 { 435 7, 436 Highest, 437 dataEncoderType1To9, 438 []block{ 439 { 440 4, 441 39, 442 13, 443 }, 444 { 445 1, 446 40, 447 14, 448 }, 449 }, 450 0, 451 }, 452 { 453 8, 454 Low, 455 dataEncoderType1To9, 456 []block{ 457 { 458 2, 459 121, 460 97, 461 }, 462 }, 463 0, 464 }, 465 { 466 8, 467 Medium, 468 dataEncoderType1To9, 469 []block{ 470 { 471 2, 472 60, 473 38, 474 }, 475 { 476 2, 477 61, 478 39, 479 }, 480 }, 481 0, 482 }, 483 { 484 8, 485 High, 486 dataEncoderType1To9, 487 []block{ 488 { 489 4, 490 40, 491 18, 492 }, 493 { 494 2, 495 41, 496 19, 497 }, 498 }, 499 0, 500 }, 501 { 502 8, 503 Highest, 504 dataEncoderType1To9, 505 []block{ 506 { 507 4, 508 40, 509 14, 510 }, 511 { 512 2, 513 41, 514 15, 515 }, 516 }, 517 0, 518 }, 519 { 520 9, 521 Low, 522 dataEncoderType1To9, 523 []block{ 524 { 525 2, 526 146, 527 116, 528 }, 529 }, 530 0, 531 }, 532 { 533 9, 534 Medium, 535 dataEncoderType1To9, 536 []block{ 537 { 538 3, 539 58, 540 36, 541 }, 542 { 543 2, 544 59, 545 37, 546 }, 547 }, 548 0, 549 }, 550 { 551 9, 552 High, 553 dataEncoderType1To9, 554 []block{ 555 { 556 4, 557 36, 558 16, 559 }, 560 { 561 4, 562 37, 563 17, 564 }, 565 }, 566 0, 567 }, 568 { 569 9, 570 Highest, 571 dataEncoderType1To9, 572 []block{ 573 { 574 4, 575 36, 576 12, 577 }, 578 { 579 4, 580 37, 581 13, 582 }, 583 }, 584 0, 585 }, 586 { 587 10, 588 Low, 589 dataEncoderType10To26, 590 []block{ 591 { 592 2, 593 86, 594 68, 595 }, 596 { 597 2, 598 87, 599 69, 600 }, 601 }, 602 0, 603 }, 604 { 605 10, 606 Medium, 607 dataEncoderType10To26, 608 []block{ 609 { 610 4, 611 69, 612 43, 613 }, 614 { 615 1, 616 70, 617 44, 618 }, 619 }, 620 0, 621 }, 622 { 623 10, 624 High, 625 dataEncoderType10To26, 626 []block{ 627 { 628 6, 629 43, 630 19, 631 }, 632 { 633 2, 634 44, 635 20, 636 }, 637 }, 638 0, 639 }, 640 { 641 10, 642 Highest, 643 dataEncoderType10To26, 644 []block{ 645 { 646 6, 647 43, 648 15, 649 }, 650 { 651 2, 652 44, 653 16, 654 }, 655 }, 656 0, 657 }, 658 { 659 11, 660 Low, 661 dataEncoderType10To26, 662 []block{ 663 { 664 4, 665 101, 666 81, 667 }, 668 }, 669 0, 670 }, 671 { 672 11, 673 Medium, 674 dataEncoderType10To26, 675 []block{ 676 { 677 1, 678 80, 679 50, 680 }, 681 { 682 4, 683 81, 684 51, 685 }, 686 }, 687 0, 688 }, 689 { 690 11, 691 High, 692 dataEncoderType10To26, 693 []block{ 694 { 695 4, 696 50, 697 22, 698 }, 699 { 700 4, 701 51, 702 23, 703 }, 704 }, 705 0, 706 }, 707 { 708 11, 709 Highest, 710 dataEncoderType10To26, 711 []block{ 712 { 713 3, 714 36, 715 12, 716 }, 717 { 718 8, 719 37, 720 13, 721 }, 722 }, 723 0, 724 }, 725 { 726 12, 727 Low, 728 dataEncoderType10To26, 729 []block{ 730 { 731 2, 732 116, 733 92, 734 }, 735 { 736 2, 737 117, 738 93, 739 }, 740 }, 741 0, 742 }, 743 { 744 12, 745 Medium, 746 dataEncoderType10To26, 747 []block{ 748 { 749 6, 750 58, 751 36, 752 }, 753 { 754 2, 755 59, 756 37, 757 }, 758 }, 759 0, 760 }, 761 { 762 12, 763 High, 764 dataEncoderType10To26, 765 []block{ 766 { 767 4, 768 46, 769 20, 770 }, 771 { 772 6, 773 47, 774 21, 775 }, 776 }, 777 0, 778 }, 779 { 780 12, 781 Highest, 782 dataEncoderType10To26, 783 []block{ 784 { 785 7, 786 42, 787 14, 788 }, 789 { 790 4, 791 43, 792 15, 793 }, 794 }, 795 0, 796 }, 797 { 798 13, 799 Low, 800 dataEncoderType10To26, 801 []block{ 802 { 803 4, 804 133, 805 107, 806 }, 807 }, 808 0, 809 }, 810 { 811 13, 812 Medium, 813 dataEncoderType10To26, 814 []block{ 815 { 816 8, 817 59, 818 37, 819 }, 820 { 821 1, 822 60, 823 38, 824 }, 825 }, 826 0, 827 }, 828 { 829 13, 830 High, 831 dataEncoderType10To26, 832 []block{ 833 { 834 8, 835 44, 836 20, 837 }, 838 { 839 4, 840 45, 841 21, 842 }, 843 }, 844 0, 845 }, 846 { 847 13, 848 Highest, 849 dataEncoderType10To26, 850 []block{ 851 { 852 12, 853 33, 854 11, 855 }, 856 { 857 4, 858 34, 859 12, 860 }, 861 }, 862 0, 863 }, 864 { 865 14, 866 Low, 867 dataEncoderType10To26, 868 []block{ 869 { 870 3, 871 145, 872 115, 873 }, 874 { 875 1, 876 146, 877 116, 878 }, 879 }, 880 3, 881 }, 882 { 883 14, 884 Medium, 885 dataEncoderType10To26, 886 []block{ 887 { 888 4, 889 64, 890 40, 891 }, 892 { 893 5, 894 65, 895 41, 896 }, 897 }, 898 3, 899 }, 900 { 901 14, 902 High, 903 dataEncoderType10To26, 904 []block{ 905 { 906 11, 907 36, 908 16, 909 }, 910 { 911 5, 912 37, 913 17, 914 }, 915 }, 916 3, 917 }, 918 { 919 14, 920 Highest, 921 dataEncoderType10To26, 922 []block{ 923 { 924 11, 925 36, 926 12, 927 }, 928 { 929 5, 930 37, 931 13, 932 }, 933 }, 934 3, 935 }, 936 { 937 15, 938 Low, 939 dataEncoderType10To26, 940 []block{ 941 { 942 5, 943 109, 944 87, 945 }, 946 { 947 1, 948 110, 949 88, 950 }, 951 }, 952 3, 953 }, 954 { 955 15, 956 Medium, 957 dataEncoderType10To26, 958 []block{ 959 { 960 5, 961 65, 962 41, 963 }, 964 { 965 5, 966 66, 967 42, 968 }, 969 }, 970 3, 971 }, 972 { 973 15, 974 High, 975 dataEncoderType10To26, 976 []block{ 977 { 978 5, 979 54, 980 24, 981 }, 982 { 983 7, 984 55, 985 25, 986 }, 987 }, 988 3, 989 }, 990 { 991 15, 992 Highest, 993 dataEncoderType10To26, 994 []block{ 995 { 996 11, 997 36, 998 12, 999 }, 1000 { 1001 7, 1002 37, 1003 13, 1004 }, 1005 }, 1006 3, 1007 }, 1008 { 1009 16, 1010 Low, 1011 dataEncoderType10To26, 1012 []block{ 1013 { 1014 5, 1015 122, 1016 98, 1017 }, 1018 { 1019 1, 1020 123, 1021 99, 1022 }, 1023 }, 1024 3, 1025 }, 1026 { 1027 16, 1028 Medium, 1029 dataEncoderType10To26, 1030 []block{ 1031 { 1032 7, 1033 73, 1034 45, 1035 }, 1036 { 1037 3, 1038 74, 1039 46, 1040 }, 1041 }, 1042 3, 1043 }, 1044 { 1045 16, 1046 High, 1047 dataEncoderType10To26, 1048 []block{ 1049 { 1050 15, 1051 43, 1052 19, 1053 }, 1054 { 1055 2, 1056 44, 1057 20, 1058 }, 1059 }, 1060 3, 1061 }, 1062 { 1063 16, 1064 Highest, 1065 dataEncoderType10To26, 1066 []block{ 1067 { 1068 3, 1069 45, 1070 15, 1071 }, 1072 { 1073 13, 1074 46, 1075 16, 1076 }, 1077 }, 1078 3, 1079 }, 1080 { 1081 17, 1082 Low, 1083 dataEncoderType10To26, 1084 []block{ 1085 { 1086 1, 1087 135, 1088 107, 1089 }, 1090 { 1091 5, 1092 136, 1093 108, 1094 }, 1095 }, 1096 3, 1097 }, 1098 { 1099 17, 1100 Medium, 1101 dataEncoderType10To26, 1102 []block{ 1103 { 1104 10, 1105 74, 1106 46, 1107 }, 1108 { 1109 1, 1110 75, 1111 47, 1112 }, 1113 }, 1114 3, 1115 }, 1116 { 1117 17, 1118 High, 1119 dataEncoderType10To26, 1120 []block{ 1121 { 1122 1, 1123 50, 1124 22, 1125 }, 1126 { 1127 15, 1128 51, 1129 23, 1130 }, 1131 }, 1132 3, 1133 }, 1134 { 1135 17, 1136 Highest, 1137 dataEncoderType10To26, 1138 []block{ 1139 { 1140 2, 1141 42, 1142 14, 1143 }, 1144 { 1145 17, 1146 43, 1147 15, 1148 }, 1149 }, 1150 3, 1151 }, 1152 { 1153 18, 1154 Low, 1155 dataEncoderType10To26, 1156 []block{ 1157 { 1158 5, 1159 150, 1160 120, 1161 }, 1162 { 1163 1, 1164 151, 1165 121, 1166 }, 1167 }, 1168 3, 1169 }, 1170 { 1171 18, 1172 Medium, 1173 dataEncoderType10To26, 1174 []block{ 1175 { 1176 9, 1177 69, 1178 43, 1179 }, 1180 { 1181 4, 1182 70, 1183 44, 1184 }, 1185 }, 1186 3, 1187 }, 1188 { 1189 18, 1190 High, 1191 dataEncoderType10To26, 1192 []block{ 1193 { 1194 17, 1195 50, 1196 22, 1197 }, 1198 { 1199 1, 1200 51, 1201 23, 1202 }, 1203 }, 1204 3, 1205 }, 1206 { 1207 18, 1208 Highest, 1209 dataEncoderType10To26, 1210 []block{ 1211 { 1212 2, 1213 42, 1214 14, 1215 }, 1216 { 1217 19, 1218 43, 1219 15, 1220 }, 1221 }, 1222 3, 1223 }, 1224 { 1225 19, 1226 Low, 1227 dataEncoderType10To26, 1228 []block{ 1229 { 1230 3, 1231 141, 1232 113, 1233 }, 1234 { 1235 4, 1236 142, 1237 114, 1238 }, 1239 }, 1240 3, 1241 }, 1242 { 1243 19, 1244 Medium, 1245 dataEncoderType10To26, 1246 []block{ 1247 { 1248 3, 1249 70, 1250 44, 1251 }, 1252 { 1253 11, 1254 71, 1255 45, 1256 }, 1257 }, 1258 3, 1259 }, 1260 { 1261 19, 1262 High, 1263 dataEncoderType10To26, 1264 []block{ 1265 { 1266 17, 1267 47, 1268 21, 1269 }, 1270 { 1271 4, 1272 48, 1273 22, 1274 }, 1275 }, 1276 3, 1277 }, 1278 { 1279 19, 1280 Highest, 1281 dataEncoderType10To26, 1282 []block{ 1283 { 1284 9, 1285 39, 1286 13, 1287 }, 1288 { 1289 16, 1290 40, 1291 14, 1292 }, 1293 }, 1294 3, 1295 }, 1296 { 1297 20, 1298 Low, 1299 dataEncoderType10To26, 1300 []block{ 1301 { 1302 3, 1303 135, 1304 107, 1305 }, 1306 { 1307 5, 1308 136, 1309 108, 1310 }, 1311 }, 1312 3, 1313 }, 1314 { 1315 20, 1316 Medium, 1317 dataEncoderType10To26, 1318 []block{ 1319 { 1320 3, 1321 67, 1322 41, 1323 }, 1324 { 1325 13, 1326 68, 1327 42, 1328 }, 1329 }, 1330 3, 1331 }, 1332 { 1333 20, 1334 High, 1335 dataEncoderType10To26, 1336 []block{ 1337 { 1338 15, 1339 54, 1340 24, 1341 }, 1342 { 1343 5, 1344 55, 1345 25, 1346 }, 1347 }, 1348 3, 1349 }, 1350 { 1351 20, 1352 Highest, 1353 dataEncoderType10To26, 1354 []block{ 1355 { 1356 15, 1357 43, 1358 15, 1359 }, 1360 { 1361 10, 1362 44, 1363 16, 1364 }, 1365 }, 1366 3, 1367 }, 1368 { 1369 21, 1370 Low, 1371 dataEncoderType10To26, 1372 []block{ 1373 { 1374 4, 1375 144, 1376 116, 1377 }, 1378 { 1379 4, 1380 145, 1381 117, 1382 }, 1383 }, 1384 4, 1385 }, 1386 { 1387 21, 1388 Medium, 1389 dataEncoderType10To26, 1390 []block{ 1391 { 1392 17, 1393 68, 1394 42, 1395 }, 1396 }, 1397 4, 1398 }, 1399 { 1400 21, 1401 High, 1402 dataEncoderType10To26, 1403 []block{ 1404 { 1405 17, 1406 50, 1407 22, 1408 }, 1409 { 1410 6, 1411 51, 1412 23, 1413 }, 1414 }, 1415 4, 1416 }, 1417 { 1418 21, 1419 Highest, 1420 dataEncoderType10To26, 1421 []block{ 1422 { 1423 19, 1424 46, 1425 16, 1426 }, 1427 { 1428 6, 1429 47, 1430 17, 1431 }, 1432 }, 1433 4, 1434 }, 1435 { 1436 22, 1437 Low, 1438 dataEncoderType10To26, 1439 []block{ 1440 { 1441 2, 1442 139, 1443 111, 1444 }, 1445 { 1446 7, 1447 140, 1448 112, 1449 }, 1450 }, 1451 4, 1452 }, 1453 { 1454 22, 1455 Medium, 1456 dataEncoderType10To26, 1457 []block{ 1458 { 1459 17, 1460 74, 1461 46, 1462 }, 1463 }, 1464 4, 1465 }, 1466 { 1467 22, 1468 High, 1469 dataEncoderType10To26, 1470 []block{ 1471 { 1472 7, 1473 54, 1474 24, 1475 }, 1476 { 1477 16, 1478 55, 1479 25, 1480 }, 1481 }, 1482 4, 1483 }, 1484 { 1485 22, 1486 Highest, 1487 dataEncoderType10To26, 1488 []block{ 1489 { 1490 34, 1491 37, 1492 13, 1493 }, 1494 }, 1495 4, 1496 }, 1497 { 1498 23, 1499 Low, 1500 dataEncoderType10To26, 1501 []block{ 1502 { 1503 4, 1504 151, 1505 121, 1506 }, 1507 { 1508 5, 1509 152, 1510 122, 1511 }, 1512 }, 1513 4, 1514 }, 1515 { 1516 23, 1517 Medium, 1518 dataEncoderType10To26, 1519 []block{ 1520 { 1521 4, 1522 75, 1523 47, 1524 }, 1525 { 1526 14, 1527 76, 1528 48, 1529 }, 1530 }, 1531 4, 1532 }, 1533 { 1534 23, 1535 High, 1536 dataEncoderType10To26, 1537 []block{ 1538 { 1539 11, 1540 54, 1541 24, 1542 }, 1543 { 1544 14, 1545 55, 1546 25, 1547 }, 1548 }, 1549 4, 1550 }, 1551 { 1552 23, 1553 Highest, 1554 dataEncoderType10To26, 1555 []block{ 1556 { 1557 16, 1558 45, 1559 15, 1560 }, 1561 { 1562 14, 1563 46, 1564 16, 1565 }, 1566 }, 1567 4, 1568 }, 1569 { 1570 24, 1571 Low, 1572 dataEncoderType10To26, 1573 []block{ 1574 { 1575 6, 1576 147, 1577 117, 1578 }, 1579 { 1580 4, 1581 148, 1582 118, 1583 }, 1584 }, 1585 4, 1586 }, 1587 { 1588 24, 1589 Medium, 1590 dataEncoderType10To26, 1591 []block{ 1592 { 1593 6, 1594 73, 1595 45, 1596 }, 1597 { 1598 14, 1599 74, 1600 46, 1601 }, 1602 }, 1603 4, 1604 }, 1605 { 1606 24, 1607 High, 1608 dataEncoderType10To26, 1609 []block{ 1610 { 1611 11, 1612 54, 1613 24, 1614 }, 1615 { 1616 16, 1617 55, 1618 25, 1619 }, 1620 }, 1621 4, 1622 }, 1623 { 1624 24, 1625 Highest, 1626 dataEncoderType10To26, 1627 []block{ 1628 { 1629 30, 1630 46, 1631 16, 1632 }, 1633 { 1634 2, 1635 47, 1636 17, 1637 }, 1638 }, 1639 4, 1640 }, 1641 { 1642 25, 1643 Low, 1644 dataEncoderType10To26, 1645 []block{ 1646 { 1647 8, 1648 132, 1649 106, 1650 }, 1651 { 1652 4, 1653 133, 1654 107, 1655 }, 1656 }, 1657 4, 1658 }, 1659 { 1660 25, 1661 Medium, 1662 dataEncoderType10To26, 1663 []block{ 1664 { 1665 8, 1666 75, 1667 47, 1668 }, 1669 { 1670 13, 1671 76, 1672 48, 1673 }, 1674 }, 1675 4, 1676 }, 1677 { 1678 25, 1679 High, 1680 dataEncoderType10To26, 1681 []block{ 1682 { 1683 7, 1684 54, 1685 24, 1686 }, 1687 { 1688 22, 1689 55, 1690 25, 1691 }, 1692 }, 1693 4, 1694 }, 1695 { 1696 25, 1697 Highest, 1698 dataEncoderType10To26, 1699 []block{ 1700 { 1701 22, 1702 45, 1703 15, 1704 }, 1705 { 1706 13, 1707 46, 1708 16, 1709 }, 1710 }, 1711 4, 1712 }, 1713 { 1714 26, 1715 Low, 1716 dataEncoderType10To26, 1717 []block{ 1718 { 1719 10, 1720 142, 1721 114, 1722 }, 1723 { 1724 2, 1725 143, 1726 115, 1727 }, 1728 }, 1729 4, 1730 }, 1731 { 1732 26, 1733 Medium, 1734 dataEncoderType10To26, 1735 []block{ 1736 { 1737 19, 1738 74, 1739 46, 1740 }, 1741 { 1742 4, 1743 75, 1744 47, 1745 }, 1746 }, 1747 4, 1748 }, 1749 { 1750 26, 1751 High, 1752 dataEncoderType10To26, 1753 []block{ 1754 { 1755 28, 1756 50, 1757 22, 1758 }, 1759 { 1760 6, 1761 51, 1762 23, 1763 }, 1764 }, 1765 4, 1766 }, 1767 { 1768 26, 1769 Highest, 1770 dataEncoderType10To26, 1771 []block{ 1772 { 1773 33, 1774 46, 1775 16, 1776 }, 1777 { 1778 4, 1779 47, 1780 17, 1781 }, 1782 }, 1783 4, 1784 }, 1785 { 1786 27, 1787 Low, 1788 dataEncoderType27To40, 1789 []block{ 1790 { 1791 8, 1792 152, 1793 122, 1794 }, 1795 { 1796 4, 1797 153, 1798 123, 1799 }, 1800 }, 1801 4, 1802 }, 1803 { 1804 27, 1805 Medium, 1806 dataEncoderType27To40, 1807 []block{ 1808 { 1809 22, 1810 73, 1811 45, 1812 }, 1813 { 1814 3, 1815 74, 1816 46, 1817 }, 1818 }, 1819 4, 1820 }, 1821 { 1822 27, 1823 High, 1824 dataEncoderType27To40, 1825 []block{ 1826 { 1827 8, 1828 53, 1829 23, 1830 }, 1831 { 1832 26, 1833 54, 1834 24, 1835 }, 1836 }, 1837 4, 1838 }, 1839 { 1840 27, 1841 Highest, 1842 dataEncoderType27To40, 1843 []block{ 1844 { 1845 12, 1846 45, 1847 15, 1848 }, 1849 { 1850 28, 1851 46, 1852 16, 1853 }, 1854 }, 1855 4, 1856 }, 1857 { 1858 28, 1859 Low, 1860 dataEncoderType27To40, 1861 []block{ 1862 { 1863 3, 1864 147, 1865 117, 1866 }, 1867 { 1868 10, 1869 148, 1870 118, 1871 }, 1872 }, 1873 3, 1874 }, 1875 { 1876 28, 1877 Medium, 1878 dataEncoderType27To40, 1879 []block{ 1880 { 1881 3, 1882 73, 1883 45, 1884 }, 1885 { 1886 23, 1887 74, 1888 46, 1889 }, 1890 }, 1891 3, 1892 }, 1893 { 1894 28, 1895 High, 1896 dataEncoderType27To40, 1897 []block{ 1898 { 1899 4, 1900 54, 1901 24, 1902 }, 1903 { 1904 31, 1905 55, 1906 25, 1907 }, 1908 }, 1909 3, 1910 }, 1911 { 1912 28, 1913 Highest, 1914 dataEncoderType27To40, 1915 []block{ 1916 { 1917 11, 1918 45, 1919 15, 1920 }, 1921 { 1922 31, 1923 46, 1924 16, 1925 }, 1926 }, 1927 3, 1928 }, 1929 { 1930 29, 1931 Low, 1932 dataEncoderType27To40, 1933 []block{ 1934 { 1935 7, 1936 146, 1937 116, 1938 }, 1939 { 1940 7, 1941 147, 1942 117, 1943 }, 1944 }, 1945 3, 1946 }, 1947 { 1948 29, 1949 Medium, 1950 dataEncoderType27To40, 1951 []block{ 1952 { 1953 21, 1954 73, 1955 45, 1956 }, 1957 { 1958 7, 1959 74, 1960 46, 1961 }, 1962 }, 1963 3, 1964 }, 1965 { 1966 29, 1967 High, 1968 dataEncoderType27To40, 1969 []block{ 1970 { 1971 1, 1972 53, 1973 23, 1974 }, 1975 { 1976 37, 1977 54, 1978 24, 1979 }, 1980 }, 1981 3, 1982 }, 1983 { 1984 29, 1985 Highest, 1986 dataEncoderType27To40, 1987 []block{ 1988 { 1989 19, 1990 45, 1991 15, 1992 }, 1993 { 1994 26, 1995 46, 1996 16, 1997 }, 1998 }, 1999 3, 2000 }, 2001 { 2002 30, 2003 Low, 2004 dataEncoderType27To40, 2005 []block{ 2006 { 2007 5, 2008 145, 2009 115, 2010 }, 2011 { 2012 10, 2013 146, 2014 116, 2015 }, 2016 }, 2017 3, 2018 }, 2019 { 2020 30, 2021 Medium, 2022 dataEncoderType27To40, 2023 []block{ 2024 { 2025 19, 2026 75, 2027 47, 2028 }, 2029 { 2030 10, 2031 76, 2032 48, 2033 }, 2034 }, 2035 3, 2036 }, 2037 { 2038 30, 2039 High, 2040 dataEncoderType27To40, 2041 []block{ 2042 { 2043 15, 2044 54, 2045 24, 2046 }, 2047 { 2048 25, 2049 55, 2050 25, 2051 }, 2052 }, 2053 3, 2054 }, 2055 { 2056 30, 2057 Highest, 2058 dataEncoderType27To40, 2059 []block{ 2060 { 2061 23, 2062 45, 2063 15, 2064 }, 2065 { 2066 25, 2067 46, 2068 16, 2069 }, 2070 }, 2071 3, 2072 }, 2073 { 2074 31, 2075 Low, 2076 dataEncoderType27To40, 2077 []block{ 2078 { 2079 13, 2080 145, 2081 115, 2082 }, 2083 { 2084 3, 2085 146, 2086 116, 2087 }, 2088 }, 2089 3, 2090 }, 2091 { 2092 31, 2093 Medium, 2094 dataEncoderType27To40, 2095 []block{ 2096 { 2097 2, 2098 74, 2099 46, 2100 }, 2101 { 2102 29, 2103 75, 2104 47, 2105 }, 2106 }, 2107 3, 2108 }, 2109 { 2110 31, 2111 High, 2112 dataEncoderType27To40, 2113 []block{ 2114 { 2115 42, 2116 54, 2117 24, 2118 }, 2119 { 2120 1, 2121 55, 2122 25, 2123 }, 2124 }, 2125 3, 2126 }, 2127 { 2128 31, 2129 Highest, 2130 dataEncoderType27To40, 2131 []block{ 2132 { 2133 23, 2134 45, 2135 15, 2136 }, 2137 { 2138 28, 2139 46, 2140 16, 2141 }, 2142 }, 2143 3, 2144 }, 2145 { 2146 32, 2147 Low, 2148 dataEncoderType27To40, 2149 []block{ 2150 { 2151 17, 2152 145, 2153 115, 2154 }, 2155 }, 2156 3, 2157 }, 2158 { 2159 32, 2160 Medium, 2161 dataEncoderType27To40, 2162 []block{ 2163 { 2164 10, 2165 74, 2166 46, 2167 }, 2168 { 2169 23, 2170 75, 2171 47, 2172 }, 2173 }, 2174 3, 2175 }, 2176 { 2177 32, 2178 High, 2179 dataEncoderType27To40, 2180 []block{ 2181 { 2182 10, 2183 54, 2184 24, 2185 }, 2186 { 2187 35, 2188 55, 2189 25, 2190 }, 2191 }, 2192 3, 2193 }, 2194 { 2195 32, 2196 Highest, 2197 dataEncoderType27To40, 2198 []block{ 2199 { 2200 19, 2201 45, 2202 15, 2203 }, 2204 { 2205 35, 2206 46, 2207 16, 2208 }, 2209 }, 2210 3, 2211 }, 2212 { 2213 33, 2214 Low, 2215 dataEncoderType27To40, 2216 []block{ 2217 { 2218 17, 2219 145, 2220 115, 2221 }, 2222 { 2223 1, 2224 146, 2225 116, 2226 }, 2227 }, 2228 3, 2229 }, 2230 { 2231 33, 2232 Medium, 2233 dataEncoderType27To40, 2234 []block{ 2235 { 2236 14, 2237 74, 2238 46, 2239 }, 2240 { 2241 21, 2242 75, 2243 47, 2244 }, 2245 }, 2246 3, 2247 }, 2248 { 2249 33, 2250 High, 2251 dataEncoderType27To40, 2252 []block{ 2253 { 2254 29, 2255 54, 2256 24, 2257 }, 2258 { 2259 19, 2260 55, 2261 25, 2262 }, 2263 }, 2264 3, 2265 }, 2266 { 2267 33, 2268 Highest, 2269 dataEncoderType27To40, 2270 []block{ 2271 { 2272 11, 2273 45, 2274 15, 2275 }, 2276 { 2277 46, 2278 46, 2279 16, 2280 }, 2281 }, 2282 3, 2283 }, 2284 { 2285 34, 2286 Low, 2287 dataEncoderType27To40, 2288 []block{ 2289 { 2290 13, 2291 145, 2292 115, 2293 }, 2294 { 2295 6, 2296 146, 2297 116, 2298 }, 2299 }, 2300 3, 2301 }, 2302 { 2303 34, 2304 Medium, 2305 dataEncoderType27To40, 2306 []block{ 2307 { 2308 14, 2309 74, 2310 46, 2311 }, 2312 { 2313 23, 2314 75, 2315 47, 2316 }, 2317 }, 2318 3, 2319 }, 2320 { 2321 34, 2322 High, 2323 dataEncoderType27To40, 2324 []block{ 2325 { 2326 44, 2327 54, 2328 24, 2329 }, 2330 { 2331 7, 2332 55, 2333 25, 2334 }, 2335 }, 2336 3, 2337 }, 2338 { 2339 34, 2340 Highest, 2341 dataEncoderType27To40, 2342 []block{ 2343 { 2344 59, 2345 46, 2346 16, 2347 }, 2348 { 2349 1, 2350 47, 2351 17, 2352 }, 2353 }, 2354 3, 2355 }, 2356 { 2357 35, 2358 Low, 2359 dataEncoderType27To40, 2360 []block{ 2361 { 2362 12, 2363 151, 2364 121, 2365 }, 2366 { 2367 7, 2368 152, 2369 122, 2370 }, 2371 }, 2372 0, 2373 }, 2374 { 2375 35, 2376 Medium, 2377 dataEncoderType27To40, 2378 []block{ 2379 { 2380 12, 2381 75, 2382 47, 2383 }, 2384 { 2385 26, 2386 76, 2387 48, 2388 }, 2389 }, 2390 0, 2391 }, 2392 { 2393 35, 2394 High, 2395 dataEncoderType27To40, 2396 []block{ 2397 { 2398 39, 2399 54, 2400 24, 2401 }, 2402 { 2403 14, 2404 55, 2405 25, 2406 }, 2407 }, 2408 0, 2409 }, 2410 { 2411 35, 2412 Highest, 2413 dataEncoderType27To40, 2414 []block{ 2415 { 2416 22, 2417 45, 2418 15, 2419 }, 2420 { 2421 41, 2422 46, 2423 16, 2424 }, 2425 }, 2426 0, 2427 }, 2428 { 2429 36, 2430 Low, 2431 dataEncoderType27To40, 2432 []block{ 2433 { 2434 6, 2435 151, 2436 121, 2437 }, 2438 { 2439 14, 2440 152, 2441 122, 2442 }, 2443 }, 2444 0, 2445 }, 2446 { 2447 36, 2448 Medium, 2449 dataEncoderType27To40, 2450 []block{ 2451 { 2452 6, 2453 75, 2454 47, 2455 }, 2456 { 2457 34, 2458 76, 2459 48, 2460 }, 2461 }, 2462 0, 2463 }, 2464 { 2465 36, 2466 High, 2467 dataEncoderType27To40, 2468 []block{ 2469 { 2470 46, 2471 54, 2472 24, 2473 }, 2474 { 2475 10, 2476 55, 2477 25, 2478 }, 2479 }, 2480 0, 2481 }, 2482 { 2483 36, 2484 Highest, 2485 dataEncoderType27To40, 2486 []block{ 2487 { 2488 2, 2489 45, 2490 15, 2491 }, 2492 { 2493 64, 2494 46, 2495 16, 2496 }, 2497 }, 2498 0, 2499 }, 2500 { 2501 37, 2502 Low, 2503 dataEncoderType27To40, 2504 []block{ 2505 { 2506 17, 2507 152, 2508 122, 2509 }, 2510 { 2511 4, 2512 153, 2513 123, 2514 }, 2515 }, 2516 0, 2517 }, 2518 { 2519 37, 2520 Medium, 2521 dataEncoderType27To40, 2522 []block{ 2523 { 2524 29, 2525 74, 2526 46, 2527 }, 2528 { 2529 14, 2530 75, 2531 47, 2532 }, 2533 }, 2534 0, 2535 }, 2536 { 2537 37, 2538 High, 2539 dataEncoderType27To40, 2540 []block{ 2541 { 2542 49, 2543 54, 2544 24, 2545 }, 2546 { 2547 10, 2548 55, 2549 25, 2550 }, 2551 }, 2552 0, 2553 }, 2554 { 2555 37, 2556 Highest, 2557 dataEncoderType27To40, 2558 []block{ 2559 { 2560 24, 2561 45, 2562 15, 2563 }, 2564 { 2565 46, 2566 46, 2567 16, 2568 }, 2569 }, 2570 0, 2571 }, 2572 { 2573 38, 2574 Low, 2575 dataEncoderType27To40, 2576 []block{ 2577 { 2578 4, 2579 152, 2580 122, 2581 }, 2582 { 2583 18, 2584 153, 2585 123, 2586 }, 2587 }, 2588 0, 2589 }, 2590 { 2591 38, 2592 Medium, 2593 dataEncoderType27To40, 2594 []block{ 2595 { 2596 13, 2597 74, 2598 46, 2599 }, 2600 { 2601 32, 2602 75, 2603 47, 2604 }, 2605 }, 2606 0, 2607 }, 2608 { 2609 38, 2610 High, 2611 dataEncoderType27To40, 2612 []block{ 2613 { 2614 48, 2615 54, 2616 24, 2617 }, 2618 { 2619 14, 2620 55, 2621 25, 2622 }, 2623 }, 2624 0, 2625 }, 2626 { 2627 38, 2628 Highest, 2629 dataEncoderType27To40, 2630 []block{ 2631 { 2632 42, 2633 45, 2634 15, 2635 }, 2636 { 2637 32, 2638 46, 2639 16, 2640 }, 2641 }, 2642 0, 2643 }, 2644 { 2645 39, 2646 Low, 2647 dataEncoderType27To40, 2648 []block{ 2649 { 2650 20, 2651 147, 2652 117, 2653 }, 2654 { 2655 4, 2656 148, 2657 118, 2658 }, 2659 }, 2660 0, 2661 }, 2662 { 2663 39, 2664 Medium, 2665 dataEncoderType27To40, 2666 []block{ 2667 { 2668 40, 2669 75, 2670 47, 2671 }, 2672 { 2673 7, 2674 76, 2675 48, 2676 }, 2677 }, 2678 0, 2679 }, 2680 { 2681 39, 2682 High, 2683 dataEncoderType27To40, 2684 []block{ 2685 { 2686 43, 2687 54, 2688 24, 2689 }, 2690 { 2691 22, 2692 55, 2693 25, 2694 }, 2695 }, 2696 0, 2697 }, 2698 { 2699 39, 2700 Highest, 2701 dataEncoderType27To40, 2702 []block{ 2703 { 2704 10, 2705 45, 2706 15, 2707 }, 2708 { 2709 67, 2710 46, 2711 16, 2712 }, 2713 }, 2714 0, 2715 }, 2716 { 2717 40, 2718 Low, 2719 dataEncoderType27To40, 2720 []block{ 2721 { 2722 19, 2723 148, 2724 118, 2725 }, 2726 { 2727 6, 2728 149, 2729 119, 2730 }, 2731 }, 2732 0, 2733 }, 2734 { 2735 40, 2736 Medium, 2737 dataEncoderType27To40, 2738 []block{ 2739 { 2740 18, 2741 75, 2742 47, 2743 }, 2744 { 2745 31, 2746 76, 2747 48, 2748 }, 2749 }, 2750 0, 2751 }, 2752 { 2753 40, 2754 High, 2755 dataEncoderType27To40, 2756 []block{ 2757 { 2758 34, 2759 54, 2760 24, 2761 }, 2762 { 2763 34, 2764 55, 2765 25, 2766 }, 2767 }, 2768 0, 2769 }, 2770 { 2771 40, 2772 Highest, 2773 dataEncoderType27To40, 2774 []block{ 2775 { 2776 20, 2777 45, 2778 15, 2779 }, 2780 { 2781 61, 2782 46, 2783 16, 2784 }, 2785 }, 2786 0, 2787 }, 2788 } 2789) 2790 2791var ( 2792 // Each QR Code contains a 15-bit Format Information value. The 15 bits 2793 // consist of 5 data bits concatenated with 10 error correction bits. 2794 // 2795 // The 5 data bits consist of: 2796 // - 2 bits for the error correction level (L=01, M=00, G=11, H=10). 2797 // - 3 bits for the data mask pattern identifier. 2798 // 2799 // formatBitSequence is a mapping from the 5 data bits to the completed 15-bit 2800 // Format Information value. 2801 // 2802 // For example, a QR Code using error correction level L, and data mask 2803 // pattern identifier 001: 2804 // 2805 // 01 | 001 = 01001 = 0x9 2806 // formatBitSequence[0x9].qrCode = 0x72f3 = 111001011110011 2807 formatBitSequence = []struct { 2808 regular uint32 2809 micro uint32 2810 }{ 2811 {0x5412, 0x4445}, 2812 {0x5125, 0x4172}, 2813 {0x5e7c, 0x4e2b}, 2814 {0x5b4b, 0x4b1c}, 2815 {0x45f9, 0x55ae}, 2816 {0x40ce, 0x5099}, 2817 {0x4f97, 0x5fc0}, 2818 {0x4aa0, 0x5af7}, 2819 {0x77c4, 0x6793}, 2820 {0x72f3, 0x62a4}, 2821 {0x7daa, 0x6dfd}, 2822 {0x789d, 0x68ca}, 2823 {0x662f, 0x7678}, 2824 {0x6318, 0x734f}, 2825 {0x6c41, 0x7c16}, 2826 {0x6976, 0x7921}, 2827 {0x1689, 0x06de}, 2828 {0x13be, 0x03e9}, 2829 {0x1ce7, 0x0cb0}, 2830 {0x19d0, 0x0987}, 2831 {0x0762, 0x1735}, 2832 {0x0255, 0x1202}, 2833 {0x0d0c, 0x1d5b}, 2834 {0x083b, 0x186c}, 2835 {0x355f, 0x2508}, 2836 {0x3068, 0x203f}, 2837 {0x3f31, 0x2f66}, 2838 {0x3a06, 0x2a51}, 2839 {0x24b4, 0x34e3}, 2840 {0x2183, 0x31d4}, 2841 {0x2eda, 0x3e8d}, 2842 {0x2bed, 0x3bba}, 2843 } 2844 2845 // QR Codes version 7 and higher contain an 18-bit Version Information value, 2846 // consisting of a 6 data bits and 12 error correction bits. 2847 // 2848 // versionBitSequence is a mapping from QR Code version to the completed 2849 // 18-bit Version Information value. 2850 // 2851 // For example, a QR code of version 7: 2852 // versionBitSequence[0x7] = 0x07c94 = 000111110010010100 2853 versionBitSequence = []uint32{ 2854 0x00000, 2855 0x00000, 2856 0x00000, 2857 0x00000, 2858 0x00000, 2859 0x00000, 2860 0x00000, 2861 0x07c94, 2862 0x085bc, 2863 0x09a99, 2864 0x0a4d3, 2865 0x0bbf6, 2866 0x0c762, 2867 0x0d847, 2868 0x0e60d, 2869 0x0f928, 2870 0x10b78, 2871 0x1145d, 2872 0x12a17, 2873 0x13532, 2874 0x149a6, 2875 0x15683, 2876 0x168c9, 2877 0x177ec, 2878 0x18ec4, 2879 0x191e1, 2880 0x1afab, 2881 0x1b08e, 2882 0x1cc1a, 2883 0x1d33f, 2884 0x1ed75, 2885 0x1f250, 2886 0x209d5, 2887 0x216f0, 2888 0x228ba, 2889 0x2379f, 2890 0x24b0b, 2891 0x2542e, 2892 0x26a64, 2893 0x27541, 2894 0x28c69, 2895 } 2896) 2897 2898const ( 2899 formatInfoLengthBits = 15 2900 versionInfoLengthBits = 18 2901) 2902 2903// formatInfo returns the 15-bit Format Information value for a QR 2904// code. 2905func (v qrCodeVersion) formatInfo(maskPattern int) *bitset.Bitset { 2906 formatID := 0 2907 2908 switch v.level { 2909 case Low: 2910 formatID = 0x08 // 0b01000 2911 case Medium: 2912 formatID = 0x00 // 0b00000 2913 case High: 2914 formatID = 0x18 // 0b11000 2915 case Highest: 2916 formatID = 0x10 // 0b10000 2917 default: 2918 log.Panicf("Invalid level %d", v.level) 2919 } 2920 2921 if maskPattern < 0 || maskPattern > 7 { 2922 log.Panicf("Invalid maskPattern %d", maskPattern) 2923 } 2924 2925 formatID |= maskPattern & 0x7 2926 2927 result := bitset.New() 2928 2929 result.AppendUint32(formatBitSequence[formatID].regular, formatInfoLengthBits) 2930 2931 return result 2932} 2933 2934// versionInfo returns the 18-bit Version Information value for a QR Code. 2935// 2936// Version Information is applicable only to QR Codes versions 7-40 inclusive. 2937// nil is returned if Version Information is not required. 2938func (v qrCodeVersion) versionInfo() *bitset.Bitset { 2939 if v.version < 7 { 2940 return nil 2941 } 2942 2943 result := bitset.New() 2944 result.AppendUint32(versionBitSequence[v.version], 18) 2945 2946 return result 2947} 2948 2949// numDataBits returns the data capacity in bits. 2950func (v qrCodeVersion) numDataBits() int { 2951 numDataBits := 0 2952 for _, b := range v.block { 2953 numDataBits += 8 * b.numBlocks * b.numDataCodewords // 8 bits in a byte 2954 } 2955 2956 return numDataBits 2957} 2958 2959// chooseQRCodeVersion chooses the most suitable QR Code version for a stated 2960// data length in bits, the error recovery level required, and the data encoder 2961// used. 2962// 2963// The chosen QR Code version is the smallest version able to fit numDataBits 2964// and the optional terminator bits required by the specified encoder. 2965// 2966// On success the chosen QR Code version is returned. 2967func chooseQRCodeVersion(level RecoveryLevel, encoder *dataEncoder, numDataBits int) *qrCodeVersion { 2968 var chosenVersion *qrCodeVersion 2969 2970 for _, v := range versions { 2971 if v.level != level { 2972 continue 2973 } else if v.version < encoder.minVersion { 2974 continue 2975 } else if v.version > encoder.maxVersion { 2976 break 2977 } 2978 2979 numFreeBits := v.numDataBits() - numDataBits 2980 2981 if numFreeBits >= 0 { 2982 chosenVersion = &v 2983 break 2984 } 2985 } 2986 2987 return chosenVersion 2988} 2989 2990func (v qrCodeVersion) numTerminatorBitsRequired(numDataBits int) int { 2991 numFreeBits := v.numDataBits() - numDataBits 2992 2993 var numTerminatorBits int 2994 2995 switch { 2996 case numFreeBits >= 4: 2997 numTerminatorBits = 4 2998 default: 2999 numTerminatorBits = numFreeBits 3000 } 3001 3002 return numTerminatorBits 3003} 3004 3005// numBlocks returns the number of blocks. 3006func (v qrCodeVersion) numBlocks() int { 3007 numBlocks := 0 3008 3009 for _, b := range v.block { 3010 numBlocks += b.numBlocks 3011 } 3012 3013 return numBlocks 3014} 3015 3016// numBitsToPadToCodeword returns the number of bits required to pad data of 3017// length numDataBits upto the nearest codeword size. 3018func (v qrCodeVersion) numBitsToPadToCodeword(numDataBits int) int { 3019 if numDataBits == v.numDataBits() { 3020 return 0 3021 } 3022 3023 return (8 - numDataBits%8) % 8 3024} 3025 3026// symbolSize returns the size of the QR Code symbol in number of modules (which 3027// is both the width and height, since QR codes are square). The QR Code has 3028// size symbolSize() x symbolSize() pixels. This does not include the quiet 3029// zone. 3030func (v qrCodeVersion) symbolSize() int { 3031 return 21 + (v.version-1)*4 3032} 3033 3034// quietZoneSize returns the number of pixels of border space on each side of 3035// the QR Code. The quiet space assists with decoding. 3036func (v qrCodeVersion) quietZoneSize() int { 3037 return 4 3038} 3039 3040// getQRCodeVersion returns the QR Code version by version number and recovery 3041// level. Returns nil if the requested combination is not defined. 3042func getQRCodeVersion(level RecoveryLevel, version int) *qrCodeVersion { 3043 for _, v := range versions { 3044 if v.level == level && v.version == version { 3045 return &v 3046 } 3047 } 3048 3049 return nil 3050} 3051