mirror of
https://git.code.sf.net/p/zint/code
synced 2025-05-28 05:54:19 -04:00
code cleanup and minor fixes
This commit is contained in:
parent
8c78216dc1
commit
1d241cca05
26 changed files with 1048 additions and 1092 deletions
282
backend/qr.c
282
backend/qr.c
|
@ -33,7 +33,7 @@ int in_alpha(int glyph) {
|
|||
/* Returns true if input glyph is in the Alphanumeric set */
|
||||
int retval = 0;
|
||||
char cglyph = (char) glyph;
|
||||
|
||||
|
||||
if((cglyph >= '0') && (cglyph <= '9')) {
|
||||
retval = 1;
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ int in_alpha(int glyph) {
|
|||
retval = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -61,9 +61,9 @@ void define_mode(char mode[], int jisdata[], int length, int gs1)
|
|||
{
|
||||
/* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */
|
||||
int i, mlen, j;
|
||||
|
||||
|
||||
for(i = 0; i < length; i++) {
|
||||
if(jisdata[i] > 0xff) {
|
||||
if(jisdata[i] > 0xff) {
|
||||
mode[i] = 'K';
|
||||
} else {
|
||||
mode[i] = 'B';
|
||||
|
@ -72,7 +72,7 @@ void define_mode(char mode[], int jisdata[], int length, int gs1)
|
|||
if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { mode[i] = 'N'; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* If less than 6 numeric digits together then don't use numeric mode */
|
||||
for(i = 0; i < length; i++) {
|
||||
if(mode[i] == 'N') {
|
||||
|
@ -89,7 +89,7 @@ void define_mode(char mode[], int jisdata[], int length, int gs1)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* If less than 4 alphanumeric characters together then don't use alphanumeric mode */
|
||||
for(i = 0; i < length; i++) {
|
||||
if(mode[i] == 'A') {
|
||||
|
@ -117,7 +117,7 @@ int estimate_binary_length(char mode[], int length, int gs1)
|
|||
int n_count = 0;
|
||||
|
||||
if(gs1) { count += 4; }
|
||||
|
||||
|
||||
for(i = 0; i < length; i++) {
|
||||
if(mode[i] != current) {
|
||||
switch(mode[i]) {
|
||||
|
@ -157,7 +157,7 @@ int estimate_binary_length(char mode[], int length, int gs1)
|
|||
return count;
|
||||
}
|
||||
|
||||
static inline void qr_bscan(char *binary, int data, int h)
|
||||
static void qr_bscan(char *binary, int data, int h)
|
||||
{
|
||||
for (; h; h>>=1) {
|
||||
concat(binary, data & h ? "1" : "0");
|
||||
|
@ -179,11 +179,11 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
char* binary = (char *)_alloca(est_binlen + 12);
|
||||
#endif
|
||||
strcpy(binary, "");
|
||||
|
||||
|
||||
if(gs1) {
|
||||
concat(binary, "0101"); /* FNC1 */
|
||||
}
|
||||
|
||||
|
||||
if(version <= 9) {
|
||||
scheme = 1;
|
||||
} else if((version >= 10) && (version <= 26)) {
|
||||
|
@ -191,39 +191,39 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
} else if(version >= 27) {
|
||||
scheme = 3;
|
||||
}
|
||||
|
||||
if(debug) {
|
||||
|
||||
if(debug) {
|
||||
for(i = 0; i < length; i++) {
|
||||
printf("%c", mode[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
percent = 0;
|
||||
|
||||
|
||||
do {
|
||||
data_block = mode[position];
|
||||
short_data_block_length = 0;
|
||||
do {
|
||||
short_data_block_length++;
|
||||
} while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block));
|
||||
|
||||
|
||||
switch(data_block) {
|
||||
case 'K':
|
||||
/* Kanji mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "1000");
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
qr_bscan(binary, short_data_block_length, 0x20 << (scheme*2)); /* scheme = 1..3 */
|
||||
|
||||
if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
for(i = 0; i < short_data_block_length; i++) {
|
||||
int jis = jisdata[position + i];
|
||||
int msb, lsb, prod;
|
||||
|
||||
|
||||
if(jis > 0x9fff) { jis -= 0xc140; }
|
||||
msb = (jis & 0xff00) >> 4;
|
||||
lsb = (jis & 0xff);
|
||||
|
@ -233,24 +233,24 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
|
||||
if(debug) { printf("0x%4X ", prod); }
|
||||
}
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
case 'B':
|
||||
/* Byte mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "0100");
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
qr_bscan(binary, short_data_block_length, scheme > 1 ? 0x8000 : 0x80); /* scheme = 1..3 */
|
||||
|
||||
if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
for(i = 0; i < short_data_block_length; i++) {
|
||||
int byte = jisdata[position + i];
|
||||
|
||||
|
||||
if(gs1 && (byte == '[')) {
|
||||
byte = 0x1d; /* FNC1 */
|
||||
}
|
||||
|
@ -259,26 +259,26 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
|
||||
if(debug) { printf("0x%2X(%d) ", byte, byte); }
|
||||
}
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
case 'A':
|
||||
/* Alphanumeric mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "0010");
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
qr_bscan(binary, short_data_block_length, 0x40 << (2 * scheme)); /* scheme = 1..3 */
|
||||
|
||||
if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
i = 0;
|
||||
i = 0;
|
||||
while ( i < short_data_block_length ) {
|
||||
int count;
|
||||
int first = 0, second = 0, prod;
|
||||
|
||||
|
||||
if(percent == 0) {
|
||||
if(gs1 && (jisdata[position + i] == '%')) {
|
||||
first = posn(RHODIUM, '%');
|
||||
|
@ -295,7 +295,7 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
count = 1;
|
||||
i++;
|
||||
prod = first;
|
||||
|
||||
|
||||
if(mode[position + i] == 'A') {
|
||||
if(gs1 && (jisdata[position + i] == '%')) {
|
||||
second = posn(RHODIUM, '%');
|
||||
|
@ -320,7 +320,7 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
i++;
|
||||
prod = first;
|
||||
percent = 0;
|
||||
|
||||
|
||||
if(mode[position + i] == 'A') {
|
||||
if(gs1 && (jisdata[position + i] == '%')) {
|
||||
second = posn(RHODIUM, '%');
|
||||
|
@ -344,35 +344,35 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
|
||||
if(debug) { printf("0x%4X ", prod); }
|
||||
};
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
case 'N':
|
||||
/* Numeric mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "0001");
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
qr_bscan(binary, short_data_block_length, 0x80 << (2 * scheme)); /* scheme = 1..3 */
|
||||
|
||||
if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
i = 0;
|
||||
i = 0;
|
||||
while ( i < short_data_block_length ) {
|
||||
int count;
|
||||
int first = 0, second = 0, third = 0, prod;
|
||||
|
||||
|
||||
first = posn(NEON, (char) jisdata[position + i]);
|
||||
count = 1;
|
||||
prod = first;
|
||||
|
||||
|
||||
if(mode[position + i + 1] == 'N') {
|
||||
second = posn(NEON, (char) jisdata[position + i + 1]);
|
||||
count = 2;
|
||||
prod = (prod * 10) + second;
|
||||
|
||||
|
||||
if(mode[position + i + 2] == 'N') {
|
||||
third = posn(NEON, (char) jisdata[position + i + 2]);
|
||||
count = 3;
|
||||
|
@ -383,18 +383,18 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */
|
||||
|
||||
if(debug) { printf("0x%4X (%d)", prod, prod); }
|
||||
|
||||
|
||||
i += count;
|
||||
};
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
position += short_data_block_length;
|
||||
} while (position < length) ;
|
||||
|
||||
|
||||
/* Terminator */
|
||||
concat(binary, "0000");
|
||||
|
||||
|
@ -402,7 +402,7 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
padbits = 8 - (current_binlen % 8);
|
||||
if(padbits == 8) { padbits = 0; }
|
||||
current_bytes = (current_binlen + padbits) / 8;
|
||||
|
||||
|
||||
/* Padding bits */
|
||||
for(i = 0; i < padbits; i++) {
|
||||
concat(binary, "0");
|
||||
|
@ -420,7 +420,7 @@ void qr_binary(int datastream[], int version, int target_binlen, char mode[], in
|
|||
if(binary[i * 8 + 6] == '1') { datastream[i] += 0x02; }
|
||||
if(binary[i * 8 + 7] == '1') { datastream[i] += 0x01; }
|
||||
}
|
||||
|
||||
|
||||
/* Add pad codewords */
|
||||
toggle = 0;
|
||||
for(i = current_bytes; i < target_binlen; i++) {
|
||||
|
@ -466,23 +466,23 @@ void add_ecc(int fullstream[], int datastream[], int version, int data_cw, int b
|
|||
#endif
|
||||
|
||||
posn = 0;
|
||||
|
||||
|
||||
for(i = 0; i < blocks; i++) {
|
||||
if(i < qty_short_blocks) { length_this_block = short_data_block_length; } else { length_this_block = short_data_block_length + 1; }
|
||||
|
||||
|
||||
for(j = 0; j < ecc_block_length; j++) {
|
||||
ecc_block[j] = 0;
|
||||
}
|
||||
|
||||
|
||||
for(j = 0; j < length_this_block; j++) {
|
||||
data_block[j] = (unsigned char) datastream[posn + j];
|
||||
}
|
||||
|
||||
|
||||
rs_init_gf(0x11d);
|
||||
rs_init_code(ecc_block_length, 0);
|
||||
rs_encode(length_this_block, data_block, ecc_block);
|
||||
rs_free();
|
||||
|
||||
|
||||
if(debug) {
|
||||
printf("Block %d: ", i + 1);
|
||||
for(j = 0; j < length_this_block; j++) {
|
||||
|
@ -497,29 +497,29 @@ void add_ecc(int fullstream[], int datastream[], int version, int data_cw, int b
|
|||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
for(j = 0; j < short_data_block_length; j++) {
|
||||
interleaved_data[(j * blocks) + i] = (int) data_block[j];
|
||||
}
|
||||
|
||||
|
||||
if(i >= qty_short_blocks){
|
||||
interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length];
|
||||
}
|
||||
|
||||
|
||||
for(j = 0; j < ecc_block_length; j++) {
|
||||
interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1];
|
||||
}
|
||||
|
||||
|
||||
posn += length_this_block;
|
||||
}
|
||||
|
||||
|
||||
for(j = 0; j < data_cw; j++) {
|
||||
fullstream[j] = interleaved_data[j];
|
||||
}
|
||||
for(j = 0; j < ecc_cw; j++) {
|
||||
fullstream[j + data_cw] = interleaved_ecc[j];
|
||||
}
|
||||
|
||||
|
||||
if(debug) {
|
||||
printf("\nData Stream: \n");
|
||||
for(j = 0; j < (data_cw + ecc_cw); j++) {
|
||||
|
@ -532,7 +532,7 @@ void add_ecc(int fullstream[], int datastream[], int version, int data_cw, int b
|
|||
void place_finder(unsigned char grid[], int size, int x, int y)
|
||||
{
|
||||
int xp, yp;
|
||||
|
||||
|
||||
int finder[] = {
|
||||
1, 1, 1, 1, 1, 1, 1,
|
||||
1, 0, 0, 0, 0, 0, 1,
|
||||
|
@ -542,7 +542,7 @@ void place_finder(unsigned char grid[], int size, int x, int y)
|
|||
1, 0, 0, 0, 0, 0, 1,
|
||||
1, 1, 1, 1, 1, 1, 1
|
||||
};
|
||||
|
||||
|
||||
for(xp = 0; xp < 7; xp++) {
|
||||
for(yp = 0; yp < 7; yp++) {
|
||||
if (finder[xp + (7 * yp)] == 1) {
|
||||
|
@ -557,7 +557,7 @@ void place_finder(unsigned char grid[], int size, int x, int y)
|
|||
void place_align(unsigned char grid[], int size, int x, int y)
|
||||
{
|
||||
int xp, yp;
|
||||
|
||||
|
||||
int alignment[] = {
|
||||
1, 1, 1, 1, 1,
|
||||
1, 0, 0, 0, 1,
|
||||
|
@ -565,10 +565,10 @@ void place_align(unsigned char grid[], int size, int x, int y)
|
|||
1, 0, 0, 0, 1,
|
||||
1, 1, 1, 1, 1
|
||||
};
|
||||
|
||||
|
||||
x -= 2;
|
||||
y -= 2; /* Input values represent centre of pattern */
|
||||
|
||||
|
||||
for(xp = 0; xp < 5; xp++) {
|
||||
for(yp = 0; yp < 5; yp++) {
|
||||
if (alignment[xp + (5 * yp)] == 1) {
|
||||
|
@ -597,12 +597,12 @@ void setup_grid(unsigned char* grid, int size, int version)
|
|||
toggle = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Add finder patterns */
|
||||
place_finder(grid, size, 0, 0);
|
||||
place_finder(grid, size, 0, size - 7);
|
||||
place_finder(grid, size, size - 7, 0);
|
||||
|
||||
|
||||
/* Add separators */
|
||||
for(i = 0; i < 7; i++) {
|
||||
grid[(7 * size) + i] = 0x10;
|
||||
|
@ -615,24 +615,24 @@ void setup_grid(unsigned char* grid, int size, int version)
|
|||
grid[(7 * size) + 7] = 0x10;
|
||||
grid[(7 * size) + (size - 8)] = 0x10;
|
||||
grid[((size - 8) * size) + 7] = 0x10;
|
||||
|
||||
|
||||
/* Add alignment patterns */
|
||||
if(version != 1) {
|
||||
/* Version 1 does not have alignment patterns */
|
||||
|
||||
|
||||
loopsize = qr_align_loopsize[version - 1];
|
||||
for(x = 0; x < loopsize; x++) {
|
||||
for(y = 0; y < loopsize; y++) {
|
||||
xcoord = qr_table_e1[((version - 2) * 7) + x];
|
||||
ycoord = qr_table_e1[((version - 2) * 7) + y];
|
||||
|
||||
|
||||
if(!(grid[(ycoord * size) + xcoord] & 0x10)) {
|
||||
place_align(grid, size, xcoord, ycoord);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Reserve space for format information */
|
||||
for(i = 0; i < 8; i++) {
|
||||
grid[(8 * size) + i] += 0x20;
|
||||
|
@ -642,7 +642,7 @@ void setup_grid(unsigned char* grid, int size, int version)
|
|||
}
|
||||
grid[(8 * size) + 8] += 20;
|
||||
grid[((size - 1 - 7) * size) + 8] = 0x21; /* Dark Module from Figure 25 */
|
||||
|
||||
|
||||
/* Reserve space for version information */
|
||||
if(version >= 7) {
|
||||
for(i = 0; i < 6; i++) {
|
||||
|
@ -679,9 +679,9 @@ void populate_grid(unsigned char* grid, int size, int* datastream, int cw)
|
|||
{
|
||||
int direction = 1; /* up */
|
||||
int row = 0; /* right hand side */
|
||||
|
||||
|
||||
int i, n, x, y;
|
||||
|
||||
|
||||
n = cw * 8;
|
||||
y = size - 1;
|
||||
i = 0;
|
||||
|
@ -698,7 +698,7 @@ void populate_grid(unsigned char* grid, int size, int* datastream, int cw)
|
|||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
if(i < n) {
|
||||
if(!(grid[(y * size) + x] & 0xf0)) {
|
||||
if (cwbit(datastream, i)) {
|
||||
|
@ -709,7 +709,7 @@ void populate_grid(unsigned char* grid, int size, int* datastream, int cw)
|
|||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(direction) { y--; } else { y++; }
|
||||
if(y == -1) {
|
||||
/* reached the top */
|
||||
|
@ -755,7 +755,7 @@ int evaluate(unsigned char *grid, int size, int pattern)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Test 1: Adjacent modules in row/column in same colour */
|
||||
/* Vertical */
|
||||
for(x = 0; x < size; x++) {
|
||||
|
@ -776,7 +776,7 @@ int evaluate(unsigned char *grid, int size, int pattern)
|
|||
result += (3 + block);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Horizontal */
|
||||
for(y = 0; y < size; y++) {
|
||||
state = local[y * size];
|
||||
|
@ -796,9 +796,9 @@ int evaluate(unsigned char *grid, int size, int pattern)
|
|||
result += (3 + block);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Test 2 is not implimented */
|
||||
|
||||
|
||||
/* Test 3: 1:1:3:1:1 ratio pattern in row/column */
|
||||
/* Vertical */
|
||||
for(x = 0; x < size; x++) {
|
||||
|
@ -816,7 +816,7 @@ int evaluate(unsigned char *grid, int size, int pattern)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Horizontal */
|
||||
for(y = 0; y < size; y++) {
|
||||
for(x = 0; x < (size - 7); x++) {
|
||||
|
@ -833,7 +833,7 @@ int evaluate(unsigned char *grid, int size, int pattern)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Test 4: Proportion of dark modules in entire symbol */
|
||||
dark_mods = 0;
|
||||
for(x = 0; x < size; x++) {
|
||||
|
@ -849,9 +849,9 @@ int evaluate(unsigned char *grid, int size, int pattern)
|
|||
} else {
|
||||
k = (percentage - 50) / 5;
|
||||
}
|
||||
|
||||
|
||||
result += 10 * k;
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -876,7 +876,7 @@ int apply_bitmask(unsigned char *grid, int size)
|
|||
for(x = 0; x < size; x++) {
|
||||
for(y = 0; y < size; y++) {
|
||||
mask[(y * size) + x] = 0x00;
|
||||
|
||||
|
||||
if (!(grid[(y * size) + x] & 0xf0)) {
|
||||
if(((y + x) & 1) == 0) { mask[(y * size) + x] += 0x01; }
|
||||
if((y & 1) == 0) { mask[(y * size) + x] += 0x02; }
|
||||
|
@ -889,21 +889,21 @@ int apply_bitmask(unsigned char *grid, int size)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(x = 0; x < size; x++) {
|
||||
for(y = 0; y < size; y++) {
|
||||
if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; }
|
||||
|
||||
|
||||
eval[(y * size) + x] = mask[(y * size) + x] ^ p;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Evaluate result */
|
||||
for(pattern = 0; pattern < 8; pattern++) {
|
||||
penalty[pattern] = evaluate(eval, size, pattern);
|
||||
}
|
||||
|
||||
|
||||
best_pattern = 0;
|
||||
best_val = penalty[0];
|
||||
for(pattern = 1; pattern < 8; pattern++) {
|
||||
|
@ -912,7 +912,7 @@ int apply_bitmask(unsigned char *grid, int size)
|
|||
best_val = penalty[pattern];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Apply mask */
|
||||
for(x = 0; x < size; x++) {
|
||||
for(y = 0; y < size; y++) {
|
||||
|
@ -936,18 +936,18 @@ int apply_bitmask(unsigned char *grid, int size)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return best_pattern;
|
||||
}
|
||||
|
||||
void add_format_info(unsigned char *grid, int size, int ecc_level, int pattern)
|
||||
{
|
||||
/* Add format information to grid */
|
||||
|
||||
|
||||
int format = pattern;
|
||||
unsigned int seq;
|
||||
int i;
|
||||
|
||||
|
||||
switch(ecc_level) {
|
||||
case LEVEL_L: format += 0x08; break;
|
||||
case LEVEL_Q: format += 0x18; break;
|
||||
|
@ -955,23 +955,23 @@ void add_format_info(unsigned char *grid, int size, int ecc_level, int pattern)
|
|||
}
|
||||
|
||||
seq = qr_annex_c[format];
|
||||
|
||||
|
||||
for(i = 0; i < 6; i++) {
|
||||
grid[(i * size) + 8] += (seq >> i) & 0x01;
|
||||
}
|
||||
|
||||
|
||||
for(i = 0; i < 8; i++) {
|
||||
grid[(8 * size) + (size - i - 1)] += (seq >> i) & 0x01;
|
||||
}
|
||||
|
||||
|
||||
for(i = 0; i < 6; i++) {
|
||||
grid[(8 * size) + (5 - i)] += (seq >> (i + 9)) & 0x01;
|
||||
}
|
||||
|
||||
|
||||
for(i = 0; i < 7; i++) {
|
||||
grid[(((size - 7) + i) * size) + 8] += (seq >> (i + 8)) & 0x01;
|
||||
}
|
||||
|
||||
|
||||
grid[(7 * size) + 8] += (seq >> 6) & 0x01;
|
||||
grid[(8 * size) + 8] += (seq >> 7) & 0x01;
|
||||
grid[(8 * size) + 7] += (seq >> 8) & 0x01;
|
||||
|
@ -981,7 +981,7 @@ void add_version_info(unsigned char *grid, int size, int version)
|
|||
{
|
||||
/* Add version information */
|
||||
int i;
|
||||
|
||||
|
||||
long int version_data = qr_annex_d[version - 7];
|
||||
for(i = 0; i < 6; i++) {
|
||||
grid[((size - 11) * size) + i] += (version_data >> (i * 3)) & 0x01;
|
||||
|
@ -1010,7 +1010,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
#endif
|
||||
|
||||
gs1 = (symbol->input_mode == GS1_MODE);
|
||||
|
||||
|
||||
switch(symbol->input_mode) {
|
||||
case DATA_MODE:
|
||||
for(i = 0; i < length; i++) {
|
||||
|
@ -1043,10 +1043,10 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
define_mode(mode, jisdata, length, gs1);
|
||||
est_binlen = estimate_binary_length(mode, length, gs1);
|
||||
|
||||
|
||||
ecc_level = LEVEL_L;
|
||||
max_cw = 2956;
|
||||
if((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) {
|
||||
|
@ -1057,12 +1057,12 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
case 4: ecc_level = LEVEL_H; max_cw = 1276; break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(est_binlen > (8 * max_cw)) {
|
||||
strcpy(symbol->errtxt, "Input too long for selected error correction level");
|
||||
return ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
|
||||
autosize = 40;
|
||||
for(i = 39; i >= 0; i--) {
|
||||
switch(ecc_level) {
|
||||
|
@ -1088,7 +1088,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) {
|
||||
if (symbol->option_2 > autosize) {
|
||||
version = symbol->option_2;
|
||||
|
@ -1098,7 +1098,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
} else {
|
||||
version = autosize;
|
||||
}
|
||||
|
||||
|
||||
/* Ensure maxium error correction capacity */
|
||||
if(est_binlen <= qr_data_codewords_M[version - 1]) { ecc_level = LEVEL_M; }
|
||||
if(est_binlen <= qr_data_codewords_Q[version - 1]) { ecc_level = LEVEL_Q; }
|
||||
|
@ -1121,7 +1121,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
|
||||
qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, est_binlen);
|
||||
add_ecc(fullstream, datastream, version, target_binlen, blocks);
|
||||
|
||||
|
||||
size = qr_sizes[version - 1];
|
||||
#ifndef _MSC_VER
|
||||
unsigned char grid[size * size];
|
||||
|
@ -1134,7 +1134,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
grid[(i * size) + j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
setup_grid(grid, size, version);
|
||||
populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]);
|
||||
bitmask = apply_bitmask(grid, size);
|
||||
|
@ -1142,7 +1142,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
if(version >= 7) {
|
||||
add_version_info(grid, size, version);
|
||||
}
|
||||
|
||||
|
||||
symbol->width = size;
|
||||
symbol->rows = size;
|
||||
|
||||
|
@ -1154,7 +1154,7 @@ int qr_code(struct zint_symbol *symbol, unsigned char source[], int length)
|
|||
}
|
||||
symbol->row_height[i] = 1;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1168,7 +1168,7 @@ int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length,
|
|||
int short_data_block_length, i;
|
||||
char data_block;
|
||||
char buffer[2];
|
||||
|
||||
|
||||
strcpy(binary, "");
|
||||
|
||||
if(debug) {
|
||||
|
@ -1177,37 +1177,37 @@ int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length,
|
|||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
do {
|
||||
if(strlen(binary) > 128) {
|
||||
return ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
|
||||
data_block = mode[position];
|
||||
short_data_block_length = 0;
|
||||
do {
|
||||
short_data_block_length++;
|
||||
} while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block));
|
||||
|
||||
|
||||
switch(data_block) {
|
||||
case 'K':
|
||||
/* Kanji mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "K");
|
||||
*kanji_used = 1;
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
buffer[0] = short_data_block_length;
|
||||
buffer[1] = '\0';
|
||||
concat(binary, buffer);
|
||||
|
||||
|
||||
if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
for(i = 0; i < short_data_block_length; i++) {
|
||||
int jis = jisdata[position + i];
|
||||
int msb, lsb, prod;
|
||||
|
||||
|
||||
if(jis > 0x9fff) { jis -= 0xc140; }
|
||||
msb = (jis & 0xff00) >> 4;
|
||||
lsb = (jis & 0xff);
|
||||
|
@ -1216,28 +1216,28 @@ int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length,
|
|||
qr_bscan(binary, prod, 0x1000);
|
||||
|
||||
if(debug) { printf("0x%4X ", prod); }
|
||||
|
||||
|
||||
if(strlen(binary) > 128) {
|
||||
return ERROR_TOO_LONG;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
case 'B':
|
||||
/* Byte mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "B");
|
||||
*byte_used = 1;
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
buffer[0] = short_data_block_length;
|
||||
buffer[1] = '\0';
|
||||
concat(binary, buffer);
|
||||
|
||||
|
||||
if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
for(i = 0; i < short_data_block_length; i++) {
|
||||
int byte = jisdata[position + i];
|
||||
|
@ -1245,38 +1245,38 @@ int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length,
|
|||
qr_bscan(binary, byte, 0x80);
|
||||
|
||||
if(debug) { printf("0x%4X ", byte); }
|
||||
|
||||
|
||||
if(strlen(binary) > 128) {
|
||||
return ERROR_TOO_LONG;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
case 'A':
|
||||
/* Alphanumeric mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "A");
|
||||
*alphanum_used = 1;
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
buffer[0] = short_data_block_length;
|
||||
buffer[1] = '\0';
|
||||
concat(binary, buffer);
|
||||
|
||||
|
||||
if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
i = 0;
|
||||
while ( i < short_data_block_length ) {
|
||||
int count;
|
||||
int first = 0, second = 0, prod;
|
||||
|
||||
|
||||
first = posn(RHODIUM, (char) jisdata[position + i]);
|
||||
count = 1;
|
||||
prod = first;
|
||||
|
||||
|
||||
if(mode[position + i + 1] == 'A') {
|
||||
second = posn(RHODIUM, (char) jisdata[position + i + 1]);
|
||||
count = 2;
|
||||
|
@ -1286,45 +1286,45 @@ int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length,
|
|||
qr_bscan(binary, prod, 1 << (5 * count)); /* count = 1..2 */
|
||||
|
||||
if(debug) { printf("0x%4X ", prod); }
|
||||
|
||||
|
||||
if(strlen(binary) > 128) {
|
||||
return ERROR_TOO_LONG;
|
||||
}
|
||||
|
||||
|
||||
i += 2;
|
||||
};
|
||||
|
||||
|
||||
if(debug) { printf("\n"); }
|
||||
|
||||
|
||||
break;
|
||||
case 'N':
|
||||
/* Numeric mode */
|
||||
/* Mode indicator */
|
||||
concat(binary, "N");
|
||||
|
||||
|
||||
/* Character count indicator */
|
||||
buffer[0] = short_data_block_length;
|
||||
buffer[1] = '\0';
|
||||
concat(binary, buffer);
|
||||
|
||||
|
||||
if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); }
|
||||
|
||||
|
||||
/* Character representation */
|
||||
i = 0;
|
||||
i = 0;
|
||||
while ( i < short_data_block_length ) {
|
||||
int count;
|
||||
int first = 0, second = 0, third = 0, prod;
|
||||
|
||||
|
||||
first = posn(NEON, (char) jisdata[position + i]);
|
||||
count = 1;
|
||||
prod = first;
|
||||
|
||||
|
||||
if(mode[position + i + 1] == 'N') {
|
||||
second = posn(NEON, (char) jisdata[position + i + 1]);
|
||||
count = 2;
|
||||
prod = (prod * 10) + second;
|
||||
}
|
||||
|
||||
|
||||
if(mode[position + i + 2] == 'N') {
|
||||
third = posn(NEON, (char) jisdata[position + i + 2]);
|
||||
count = 3;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue