1
0
mirror of https://git.code.sf.net/p/zint/code synced 2026-01-24 20:36:03 +00:00
Files
zint/backend/tools/gen_aztec_data_sizes.php
2026-01-21 12:01:00 +00:00

91 lines
2.7 KiB
PHP

<?php
/* Generate minimum data bits per ECC level for tables `AztecDataSizes` & `AztecCompactDataSizes` in "aztec.h" */
/*
libzint - the open source barcode library
Copyright (C) 2026 Robin Stuart <rstuart114@gmail.com>
*/
/* SPDX-License-Identifier: BSD-3-Clause */
$percents = array(0.10, 0.23, 0.36, 0.50);
$full_sizes = array(
21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588,
652, 720, 790, 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664
);
$compact_sizes = array(17, 40, 51, 76 /* 64 data blocks (Mode Message max) but 76 altogether */ );
function codeword_size($layers) {
if ($layers <= 2) {
return 6;
}
if ($layers <= 8) {
return 8;
}
if ($layers <= 22) {
return 10;
}
return 12;
}
function data_size($size, $bits, $percent) {
$size_bits = $size * $bits;
$ecc_bits = (int) ceil($size_bits * $percent);
$ret = $size_bits - ($ecc_bits + 3 * $bits);
return $ret;
}
function full_data_size($i, $j) {
global $percents, $full_sizes;
return data_size($full_sizes[$j], codeword_size($j + 1), $percents[$i]);
}
function compact_data_size($i, $j, &$msg) {
global $percents, $compact_sizes;
$msg = '';
$bits = codeword_size($j + 1);
$data_size = data_size($compact_sizes[$j], $bits, $percents[$i]);
if ($data_size > 64 * $bits) {
$data_size = 64 * $bits;
$msg = ' /* Max 64 * 8 */';
}
return $data_size;
}
print <<<EOD
/* Tables `AztecDataSizes` and `AztecCompactDataSizes` generated by "backend/tools/gen_aztec_data_sizes.php" */
static const short AztecDataSizes[4][32] = { {
EOD;
for ($i = 0; $i < 4; $i++) {
printf(" /* Data bits per symbol maximum with %d%% error correction */\n", (int) ($percents[$i] * 100));
printf(" ");
for ($j = 0; $j < 16; $j++) {
printf($j <= 6 ? "%4d, " : ($j === 15 ? "%5d," : "%5d, "), full_data_size($i, $j));
}
printf("\n ");
for (; $j < 32; $j++) {
printf($j <= 22 ? "%4d, " : ($j === 31 ? "%5d" : "%5d, "), full_data_size($i, $j));
}
printf($i === 3 ? "\n }\n" : "\n }, {\n");
}
printf("};\n");
print <<<EOD
static const short AztecCompactDataSizes[4][4] = { {
EOD;
for ($i = 0; $i < 4; $i++) {
printf(" /* Data bits per symbol maximum with %d%% error correction */\n", (int) ($percents[$i] * 100));
printf(" ");
for ($j = 0; $j < 4; $j++) {
$compact_data_size = compact_data_size($i, $j, $msg);
printf($j === 3 ? "%d%s" : "%d%s, ", $compact_data_size, $msg);
}
printf($i === 3 ? "\n }\n" : "\n }, {\n");
}
printf("};\n");
/* vim: set ts=4 sw=4 et : */