mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
Improved handling of partial row data
Bug reported by Edgard Lima and fixed by Milton Neal
This commit is contained in:
parent
dd80371b17
commit
cfda2067b1
@ -2061,7 +2061,7 @@ int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_str
|
|||||||
|
|
||||||
/* GS1 DataBar Expanded */
|
/* GS1 DataBar Expanded */
|
||||||
int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) {
|
int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) {
|
||||||
int i, j, k, l, p, data_chars, vs[21], group[21], v_odd[21], v_even[21];
|
int i, j, k, p, data_chars, vs[21], group[21], v_odd[21], v_even[21];
|
||||||
char substring[21][14], latch;
|
char substring[21][14], latch;
|
||||||
int char_widths[21][8], checksum, check_widths[8], c_group;
|
int char_widths[21][8], checksum, check_widths[8], c_group;
|
||||||
int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer;
|
int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer;
|
||||||
@ -2205,11 +2205,6 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len)
|
|||||||
elements[i] = 0;
|
elements[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
elements[0] = 1;
|
|
||||||
elements[1] = 1;
|
|
||||||
elements[pattern_width - 2] = 1;
|
|
||||||
elements[pattern_width - 1] = 1;
|
|
||||||
|
|
||||||
/* Put finder patterns in element array */
|
/* Put finder patterns in element array */
|
||||||
for (i = 0; i < (((data_chars + 1) / 2) + ((data_chars + 1) & 1)); i++) {
|
for (i = 0; i < (((data_chars + 1) / 2) + ((data_chars + 1) & 1)); i++) {
|
||||||
k = ((((((data_chars + 1) - 2) / 2) + ((data_chars + 1) & 1)) - 1) * 11) + i;
|
k = ((((((data_chars + 1) - 2) / 2) + ((data_chars + 1) & 1)) - 1) * 11) + i;
|
||||||
@ -2239,6 +2234,13 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len)
|
|||||||
|
|
||||||
if ((symbol->symbology == BARCODE_RSS_EXP) || (symbol->symbology == BARCODE_RSS_EXP_CC)) {
|
if ((symbol->symbology == BARCODE_RSS_EXP) || (symbol->symbology == BARCODE_RSS_EXP_CC)) {
|
||||||
/* Copy elements into symbol */
|
/* Copy elements into symbol */
|
||||||
|
|
||||||
|
elements[0] = 1; // left guard
|
||||||
|
elements[1] = 1;
|
||||||
|
|
||||||
|
elements[pattern_width - 2] = 1; // right guard
|
||||||
|
elements[pattern_width - 1] = 1;
|
||||||
|
|
||||||
writer = 0;
|
writer = 0;
|
||||||
latch = '0';
|
latch = '0';
|
||||||
for (i = 0; i < pattern_width; i++) {
|
for (i = 0; i < pattern_width; i++) {
|
||||||
@ -2328,7 +2330,7 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len)
|
|||||||
special_case_row = 0;
|
special_case_row = 0;
|
||||||
|
|
||||||
/* Row Start */
|
/* Row Start */
|
||||||
sub_elements[0] = 1;
|
sub_elements[0] = 1; // left guard
|
||||||
sub_elements[1] = 1;
|
sub_elements[1] = 1;
|
||||||
elements_in_sub = 2;
|
elements_in_sub = 2;
|
||||||
|
|
||||||
@ -2344,40 +2346,26 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len)
|
|||||||
for (j = 0; j < 21; j++) {
|
for (j = 0; j < 21; j++) {
|
||||||
if ((i + j) < pattern_width) {
|
if ((i + j) < pattern_width) {
|
||||||
sub_elements[j + (reader * 21) + 2] = elements[i + j];
|
sub_elements[j + (reader * 21) + 2] = elements[i + j];
|
||||||
elements_in_sub++;
|
|
||||||
}
|
}
|
||||||
|
elements_in_sub++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* right to left */
|
/* right to left */
|
||||||
left_to_right = 0;
|
left_to_right = 0;
|
||||||
if ((current_row * symbol->option_2) < codeblocks) {
|
|
||||||
/* a full row */
|
|
||||||
i = 2 + (((current_row * symbol->option_2) - reader - 1) * 21);
|
i = 2 + (((current_row * symbol->option_2) - reader - 1) * 21);
|
||||||
for (j = 0; j < 21; j++) {
|
for (j = 0; j < 21; j++) {
|
||||||
if ((i + j) < pattern_width) {
|
if ((i + j) < pattern_width) {
|
||||||
sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j];
|
sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j];
|
||||||
|
}
|
||||||
elements_in_sub++;
|
elements_in_sub++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* a partial row */
|
|
||||||
k = ((current_row * symbol->option_2) - codeblocks);
|
|
||||||
l = (current_row * symbol->option_2) - reader - 1;
|
|
||||||
i = 2 + ((l - k) * 21);
|
|
||||||
for (j = 0; j < 21; j++) {
|
|
||||||
if ((i + j) < pattern_width) {
|
|
||||||
sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j];
|
|
||||||
elements_in_sub++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reader++;
|
reader++;
|
||||||
current_block++;
|
current_block++;
|
||||||
} while ((reader < symbol->option_2) && (current_block < codeblocks));
|
} while ((reader < symbol->option_2) && (current_block < codeblocks));
|
||||||
|
|
||||||
/* Row Stop */
|
/* Row Stop */
|
||||||
sub_elements[elements_in_sub] = 1;
|
sub_elements[elements_in_sub] = 1; // right guard
|
||||||
sub_elements[elements_in_sub + 1] = 1;
|
sub_elements[elements_in_sub + 1] = 1;
|
||||||
elements_in_sub += 2;
|
elements_in_sub += 2;
|
||||||
|
|
||||||
@ -2428,7 +2416,7 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len)
|
|||||||
symbol->row_height[symbol->rows - 1] = 1;
|
symbol->row_height[symbol->rows - 1] = 1;
|
||||||
/* finder bar adjustment */
|
/* finder bar adjustment */
|
||||||
for (j = 0; j < reader; j++) {
|
for (j = 0; j < reader; j++) {
|
||||||
k = (49 * j) + (special_case_row ? 19 : 18);
|
k = (49 * j) + 18 + special_case_row;
|
||||||
if (left_to_right) {
|
if (left_to_right) {
|
||||||
for (i = 0; i < 15; i++) {
|
for (i = 0; i < 15; i++) {
|
||||||
if ((!(module_is_set(symbol, symbol->rows, i + k - 1))) &&
|
if ((!(module_is_set(symbol, symbol->rows, i + k - 1))) &&
|
||||||
@ -2438,6 +2426,9 @@ int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if ((current_row == stack_rows) && (data_chars % 2 == 0)) {
|
||||||
|
k -= 18;
|
||||||
|
}
|
||||||
for (i = 14; i >= 0; i--) {
|
for (i = 14; i >= 0; i--) {
|
||||||
if ((!(module_is_set(symbol, symbol->rows, i + k + 1))) &&
|
if ((!(module_is_set(symbol, symbol->rows, i + k + 1))) &&
|
||||||
(!(module_is_set(symbol, symbol->rows, i + k))) &&
|
(!(module_is_set(symbol, symbol->rows, i + k))) &&
|
||||||
|
Loading…
Reference in New Issue
Block a user