git.sr.ht/~pingoo/stdx@v0.0.0-20240218134121-094174641f6e/barcode/pdf417/errorcorrection.go (about)

     1  package pdf417
     2  
     3  type securitylevel byte
     4  
     5  func (level securitylevel) ErrorCorrectionWordCount() int {
     6  	return 1 << (uint(level) + 1)
     7  }
     8  
     9  var correctionFactors = [][]int{
    10  	// Level 0
    11  	[]int{27, 917},
    12  
    13  	// Level 1
    14  	[]int{522, 568, 723, 809},
    15  
    16  	// Level 2
    17  	[]int{237, 308, 436, 284, 646, 653, 428, 379},
    18  
    19  	// Level 3
    20  	[]int{
    21  		274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42,
    22  		176, 65,
    23  	},
    24  
    25  	// Level 4
    26  	[]int{
    27  		361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687,
    28  		284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, 133,
    29  		231, 390, 685, 330, 63, 410,
    30  	},
    31  
    32  	// Level 5
    33  	[]int{
    34  		539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877,
    35  		381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511,
    36  		400, 672, 762, 283, 184, 440, 35, 519, 31, 460, 594, 225, 535, 517,
    37  		352, 605, 158, 651, 201, 488, 502, 648, 733, 717, 83, 404, 97, 280,
    38  		771, 840, 629, 4, 381, 843, 623, 264, 543,
    39  	},
    40  
    41  	// Level 6
    42  	[]int{
    43  		521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925,
    44  		749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631,
    45  		292, 908, 490, 704, 516, 258, 457, 907, 594, 723, 674, 292, 272, 96,
    46  		684, 432, 686, 606, 860, 569, 193, 219, 129, 186, 236, 287, 192,
    47  		775, 278, 173, 40, 379, 712, 463, 646, 776, 171, 491, 297, 763, 156,
    48  		732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898, 784, 663, 627,
    49  		378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157,
    50  		374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587,
    51  		804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86,
    52  		801, 4, 108, 539,
    53  	},
    54  
    55  	// Level 7
    56  	[]int{
    57  		524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786,
    58  		138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194,
    59  		280, 201, 280, 828, 757, 710, 814, 919, 89, 68, 569, 11, 204, 796,
    60  		605, 540, 913, 801, 700, 799, 137, 439, 418, 592, 668, 353, 859,
    61  		370, 694, 325, 240, 216, 257, 284, 549, 209, 884, 315, 70, 329, 793,
    62  		490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521, 307,
    63  		291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289,
    64  		470, 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136,
    65  		538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355,
    66  		588, 188, 462, 10, 134, 628, 320, 479, 130, 739, 71, 263, 318, 374,
    67  		601, 192, 605, 142, 673, 687, 234, 722, 384, 177, 752, 607, 640,
    68  		455, 193, 689, 707, 805, 641, 48, 60, 732, 621, 895, 544, 261, 852,
    69  		655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528, 503, 118,
    70  		49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550,
    71  		73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791,
    72  		893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299,
    73  		922, 191, 910, 532, 609, 829, 189, 20, 167, 29, 872, 449, 83, 402,
    74  		41, 656, 505, 579, 481, 173, 404, 251, 688, 95, 497, 555, 642, 543,
    75  		307, 159, 924, 558, 648, 55, 497, 10,
    76  	},
    77  
    78  	// Level 8
    79  	[]int{
    80  		352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380,
    81  		350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88,
    82  		87, 193, 352, 781, 846, 75, 327, 520, 435, 543, 203, 666, 249, 346,
    83  		781, 621, 640, 268, 794, 534, 539, 781, 408, 390, 644, 102, 476,
    84  		499, 290, 632, 545, 37, 858, 916, 552, 41, 542, 289, 122, 272, 383,
    85  		800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741, 290, 204, 681,
    86  		407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808,
    87  		684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516,
    88  		258, 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328,
    89  		596, 786, 303, 570, 381, 415, 641, 156, 237, 151, 429, 531, 207,
    90  		676, 710, 89, 168, 304, 402, 40, 708, 575, 162, 864, 229, 65, 861,
    91  		841, 512, 164, 477, 221, 92, 358, 785, 288, 357, 850, 836, 827, 736,
    92  		707, 94, 8, 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248,
    93  		361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, 45, 902,
    94  		452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, 37,
    95  		124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578,
    96  		911, 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777,
    97  		699, 688, 43, 408, 842, 383, 721, 521, 560, 644, 714, 559, 62, 145,
    98  		873, 663, 713, 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564,
    99  		343, 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708,
   100  		410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, 586, 424,
   101  		833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45, 787,
   102  		680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644,
   103  		905, 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662,
   104  		513, 56, 252, 341, 242, 797, 838, 837, 720, 224, 307, 631, 61, 87,
   105  		560, 310, 756, 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915,
   106  		459, 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673,
   107  		782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, 162, 498,
   108  		308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437, 375,
   109  		273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687,
   110  		842, 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321,
   111  		54, 669, 316, 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316,
   112  		486, 721, 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762,
   113  		752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, 284, 736,
   114  		138, 646, 411, 877, 669, 141, 919, 45, 780, 407, 164, 332, 899, 165,
   115  		726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647, 63, 310, 863,
   116  		251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263,
   117  	},
   118  }
   119  
   120  func (level securitylevel) Compute(data []int) []int {
   121  	// Correction factors for the given level
   122  	factors := correctionFactors[int(level)]
   123  
   124  	// Number of correction code words
   125  	count := level.ErrorCorrectionWordCount()
   126  
   127  	// Correction code words array, prepopulated with zeros
   128  	ecWords := make([]int, count)
   129  
   130  	for _, value := range data {
   131  		temp := (value + ecWords[0]) % 929
   132  
   133  		for i := count - 1; i >= 0; i-- {
   134  			add := 0
   135  
   136  			if i > 0 {
   137  				add = ecWords[count-i]
   138  			}
   139  
   140  			ecWords[count-1-i] = (add + 929 - (temp*factors[i])%929) % 929
   141  		}
   142  	}
   143  
   144  	for key, word := range ecWords {
   145  		if word > 0 {
   146  			ecWords[key] = 929 - word
   147  		}
   148  	}
   149  
   150  	return ecWords
   151  }