diff --git a/backend/emf.c b/backend/emf.c
index 384ea42f..2a023374 100644
--- a/backend/emf.c
+++ b/backend/emf.c
@@ -91,29 +91,29 @@ static int emf_count_hexagons(const struct zint_symbol *symbol) {
static int emf_count_strings(const struct zint_symbol *symbol, float *fsize, float *fsize2, int *halign_left,
int *halign_right) {
int strings = 0;
- const struct zint_vector_string *str;
+ const struct zint_vector_string *string;
*fsize = *fsize2 = 0.0f;
*halign_left = *halign_right = 0;
- str = symbol->vector->strings;
- while (str) {
+ string = symbol->vector->strings;
+ while (string) {
/* Allow 2 font sizes */
if (*fsize == 0.0f) {
- *fsize = str->fsize;
- } else if (str->fsize != *fsize && *fsize2 == 0.0f) {
- *fsize2 = str->fsize;
+ *fsize = string->fsize;
+ } else if (string->fsize != *fsize && *fsize2 == 0.0f) {
+ *fsize2 = string->fsize;
}
/* Only 3 haligns possible and centre align always assumed used */
- if (str->halign) { /* Left or right align */
- if (str->halign == 1) { /* Left align */
- *halign_left = str->halign;
+ if (string->halign) { /* Left or right align */
+ if (string->halign == 1) { /* Left align */
+ *halign_left = string->halign;
} else { /* Right align */
- *halign_right = str->halign;
+ *halign_right = string->halign;
}
}
strings++;
- str = str->next;
+ string = string->next;
}
return strings;
@@ -190,12 +190,13 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) {
int draw_background = 1;
int bold;
+ const int upcean = is_upcean(symbol->symbology);
const int output_to_stdout = symbol->output_options & BARCODE_STDOUT;
struct zint_vector_rect *rect;
struct zint_vector_circle *circ;
struct zint_vector_hexagon *hex;
- struct zint_vector_string *str;
+ struct zint_vector_string *string;
/* Allow for up to 6 strings (current max 3 for UPC/EAN) */
unsigned char *this_string[6];
@@ -617,24 +618,24 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) {
this_text = 0;
/* Loop over font sizes so that they're grouped together, so only have to select font twice at most */
for (i = 0, current_fsize = fsize; i < 2 && current_fsize; i++, current_fsize = fsize2) {
- str = symbol->vector->strings;
+ string = symbol->vector->strings;
current_halign = -1;
- while (str) {
+ while (string) {
int utfle_len;
int bumped_len;
- if (str->fsize != current_fsize) {
- str = str->next;
+ if (string->fsize != current_fsize) {
+ string = string->next;
continue;
}
- text_fsizes[this_text] = str->fsize;
- text_haligns[this_text] = str->halign;
+ text_fsizes[this_text] = string->fsize;
+ text_haligns[this_text] = string->halign;
if (text_haligns[this_text] != current_halign) {
current_halign = text_haligns[this_text];
bytecount += 12;
recordcount++;
}
- assert(str->length > 0);
- utfle_len = emf_utfle_length(str->text, str->length);
+ assert(string->length > 0);
+ utfle_len = emf_utfle_length(string->text, string->length);
bumped_len = emf_bump_up(utfle_len);
if (!(this_string[this_text] = (unsigned char *) malloc(bumped_len))) {
for (i = 0; i < this_text; i++) {
@@ -653,8 +654,15 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) {
text[this_text].i_graphics_mode = 0x00000002; /* GM_ADVANCED */
text[this_text].ex_scale = 1.0f;
text[this_text].ey_scale = 1.0f;
- text[this_text].w_emr_text.reference.x = (int32_t) str->x;
- text[this_text].w_emr_text.reference.y = (int32_t) str->y;
+ /* Unhack the guard whitespace `gws_left_fudge`/`gws_right_fudge` hack */
+ if (upcean && string->halign == 1 && string->text[0] == '<') {
+ text[this_text].w_emr_text.reference.x = 0;
+ } else if (upcean && string->halign == 2 && string->text[0] == '>') {
+ text[this_text].w_emr_text.reference.x = (int32_t) (symbol->vector->width - 1);
+ } else {
+ text[this_text].w_emr_text.reference.x = (int32_t) string->x;
+ }
+ text[this_text].w_emr_text.reference.y = (int32_t) string->y;
text[this_text].w_emr_text.chars = utfle_len;
text[this_text].w_emr_text.off_string = 76;
text[this_text].w_emr_text.options = 0;
@@ -663,12 +671,12 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) {
text[this_text].w_emr_text.rectangle.right = 0xffffffff;
text[this_text].w_emr_text.rectangle.bottom = 0xffffffff;
text[this_text].w_emr_text.off_dx = 0;
- emf_utfle_copy(this_string[this_text], str->text, str->length);
+ emf_utfle_copy(this_string[this_text], string->text, string->length);
bytecount += 76 + bumped_len;
recordcount++;
this_text++;
- str = str->next;
+ string = string->next;
}
}
/* Suppress clang-tidy clang-analyzer-core.UndefinedBinaryOperatorResult warning */
diff --git a/backend/output.c b/backend/output.c
index 665dcf56..79ef9309 100644
--- a/backend/output.c
+++ b/backend/output.c
@@ -706,7 +706,7 @@ INTERNAL void out_set_whitespace_offsets(const struct zint_symbol *symbol, const
*p_boffset = symbol->whitespace_height + qz_bottom;
if (symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP)) {
*p_yoffset += symbol->border_width;
- if (symbol->output_options & (BARCODE_BOX | BARCODE_BIND)) {
+ if (!(symbol->output_options & BARCODE_BIND_TOP)) { /* Trumps BARCODE_BOX & BARCODE_BIND */
*p_boffset += symbol->border_width;
}
}
diff --git a/backend/ps.c b/backend/ps.c
index 8e9ac42d..be67d3d7 100644
--- a/backend/ps.c
+++ b/backend/ps.c
@@ -483,7 +483,14 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) {
fputs(" scalefont setfont\n", feps);
previous_fsize = string->fsize;
}
- out_putsf(" ", 2, string->x, feps);
+ /* Unhack the guard whitespace `gws_left_fudge`/`gws_right_fudge` hack */
+ if (upcean && string->halign == 1 && string->text[0] == '<') {
+ out_putsf(" ", 2, 0, feps);
+ } else if (upcean && string->halign == 2 && string->text[0] == '>') {
+ out_putsf(" ", 2, symbol->vector->width, feps);
+ } else {
+ out_putsf(" ", 2, string->x, feps);
+ }
out_putsf(" ", 2, symbol->vector->height - string->y, feps);
fputs(" moveto\n", feps);
if (string->rotation != 0) {
diff --git a/backend/raster.c b/backend/raster.c
index 9c1f0681..6017b123 100644
--- a/backend/raster.c
+++ b/backend/raster.c
@@ -1176,8 +1176,9 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl
const int upcea_height_adj = ((UPCEAN_FONT_HEIGHT - UPCEAN_SMALL_FONT_HEIGHT) * si + 1) / 2;
int text_yposn = yoffset_si + symbol_height_si + (int) (symbol->text_gap * si);
- if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) {
- text_yposn += symbol->border_width * si; /* Note not needed for BARCODE_BIND_TOP */
+ if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))
+ && !(symbol->output_options & BARCODE_BIND_TOP)) { /* Trumps BARCODE_BOX & BARCODE_BIND */
+ text_yposn += symbol->border_width * si;
}
if (upceanflag == 6) { /* UPC-E */
@@ -1297,8 +1298,9 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl
unsigned char local_text[sizeof(symbol->text)] = {0};
int text_xposn = (int) ((main_width / 2.0f) * si) + xoffset_si;
int text_yposn = yoffset_si + symbol_height_si + (int) (symbol->text_gap * si);
- if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) {
- text_yposn += symbol->border_width * si; /* Note not needed for BARCODE_BIND_TOP */
+ if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))
+ && !(symbol->output_options & BARCODE_BIND_TOP)) { /* Trumps BARCODE_BOX & BARCODE_BIND */
+ text_yposn += symbol->border_width * si;
}
to_iso8859_1(symbol->text, local_text);
/* Put the human readable text at the bottom */
diff --git a/backend/tests/data/emf/ean13_5addon_ggs_5.2.2.5.2-2_gws.emf b/backend/tests/data/emf/ean13_5addon_ggs_5.2.2.5.2-2_gws.emf
index 49bcca7d..5eaada75 100644
Binary files a/backend/tests/data/emf/ean13_5addon_ggs_5.2.2.5.2-2_gws.emf and b/backend/tests/data/emf/ean13_5addon_ggs_5.2.2.5.2-2_gws.emf differ
diff --git a/backend/tests/data/emf/ean13_ggs_5.2.2.1-1_gws.emf b/backend/tests/data/emf/ean13_ggs_5.2.2.1-1_gws.emf
index bc1d961e..016de806 100644
Binary files a/backend/tests/data/emf/ean13_ggs_5.2.2.1-1_gws.emf and b/backend/tests/data/emf/ean13_ggs_5.2.2.1-1_gws.emf differ
diff --git a/backend/tests/data/emf/ean8_gss_5.2.2.2-1_gws.emf b/backend/tests/data/emf/ean8_gss_5.2.2.2-1_gws.emf
index 453269df..febb44cd 100644
Binary files a/backend/tests/data/emf/ean8_gss_5.2.2.2-1_gws.emf and b/backend/tests/data/emf/ean8_gss_5.2.2.2-1_gws.emf differ
diff --git a/backend/tests/data/emf/upca_2addon_ggs_5.2.6.6-5_gws.emf b/backend/tests/data/emf/upca_2addon_ggs_5.2.6.6-5_gws.emf
index 78aaae1f..f55ef801 100644
Binary files a/backend/tests/data/emf/upca_2addon_ggs_5.2.6.6-5_gws.emf and b/backend/tests/data/emf/upca_2addon_ggs_5.2.6.6-5_gws.emf differ
diff --git a/backend/tests/data/emf/upce_2addon_gws.emf b/backend/tests/data/emf/upce_2addon_gws.emf
index 73868357..cf6fe28a 100644
Binary files a/backend/tests/data/emf/upce_2addon_gws.emf and b/backend/tests/data/emf/upce_2addon_gws.emf differ
diff --git a/backend/tests/data/emf/upce_2addon_small_bold_gws.emf b/backend/tests/data/emf/upce_2addon_small_bold_gws.emf
index cda40e47..ebe907a7 100644
Binary files a/backend/tests/data/emf/upce_2addon_small_bold_gws.emf and b/backend/tests/data/emf/upce_2addon_small_bold_gws.emf differ
diff --git a/backend/tests/data/eps/ean13_2addon_ggs_5.2.2.5.1-2_gws.eps b/backend/tests/data/eps/ean13_2addon_ggs_5.2.2.5.1-2_gws.eps
index 3de837b0..fa8340b8 100644
--- a/backend/tests/data/eps/ean13_2addon_ggs_5.2.2.5.1-2_gws.eps
+++ b/backend/tests/data/eps/ean13_2addon_ggs_5.2.2.5.1-2_gws.eps
@@ -59,5 +59,6 @@ I 256 2 R
246 102.4 moveto
(12) stringwidth pop -2 div 0 rmoveto
(12) show
- 264 102.4 moveto
+ 276 102.4 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/eps/ean13_ggs_5.2.2.1-1_gws.eps b/backend/tests/data/eps/ean13_ggs_5.2.2.1-1_gws.eps
index 22986c54..3c3f3d37 100644
--- a/backend/tests/data/eps/ean13_ggs_5.2.2.1-1_gws.eps
+++ b/backend/tests/data/eps/ean13_ggs_5.2.2.1-1_gws.eps
@@ -49,5 +49,6 @@ I 192 6 R
163 0.8 moveto
(531000) stringwidth pop -2 div 0 rmoveto
(531000) show
- 214 0.8 moveto
+ 226 0.8 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/eps/ean5_gws.eps b/backend/tests/data/eps/ean5_gws.eps
index 3e57ec9c..9ca68721 100644
--- a/backend/tests/data/eps/ean5_gws.eps
+++ b/backend/tests/data/eps/ean5_gws.eps
@@ -29,5 +29,6 @@ I 82 6 R
47 102.4 moveto
(98765) stringwidth pop -2 div 0 rmoveto
(98765) show
- 91.5 102.4 moveto
+ 104 102.4 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/eps/ean8_gss_5.2.2.2-1_gws.eps b/backend/tests/data/eps/ean8_gss_5.2.2.2-1_gws.eps
index aaeab4fb..49e20c09 100644
--- a/backend/tests/data/eps/ean8_gss_5.2.2.2-1_gws.eps
+++ b/backend/tests/data/eps/ean8_gss_5.2.2.2-1_gws.eps
@@ -32,8 +32,7 @@ I 128 2 R
110 8 I 142 2 R
146 2 R
/Helvetica findfont 21.4 scalefont setfont
- 12.5 0.8 moveto
- (<) stringwidth pop neg 0 rmoveto
+ 0 0.8 moveto
(<) show
49 0.8 moveto
(9501) stringwidth pop -2 div 0 rmoveto
@@ -41,5 +40,6 @@ I 128 2 R
113 0.8 moveto
(2346) stringwidth pop -2 div 0 rmoveto
(2346) show
- 149.6 0.8 moveto
+ 162 0.8 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws.eps b/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws.eps
index f7b0f2f2..cff1e696 100644
--- a/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws.eps
+++ b/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws.eps
@@ -64,5 +64,6 @@ I 254 2 R
246 102.4 moveto
(24) stringwidth pop -2 div 0 rmoveto
(24) show
- 263.6 102.4 moveto
+ 276 102.4 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws_rotate_180.eps b/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws_rotate_180.eps
index fa38e521..5569dd13 100644
--- a/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws_rotate_180.eps
+++ b/backend/tests/data/eps/upca_2addon_ggs_5.2.6.6-5_gws_rotate_180.eps
@@ -79,8 +79,9 @@ I 20 2 R
(24) stringwidth pop -2 div 0 rmoveto
(24) show
grestore
- 12.4 15.6 moveto
+ 276 15.6 moveto
gsave
180 rotate
+ (>) stringwidth pop neg 0 rmoveto
(>) show
grestore
diff --git a/backend/tests/data/eps/upce_5addon_gws.eps b/backend/tests/data/eps/upce_5addon_gws.eps
index c1d10dc3..23a1ce8a 100644
--- a/backend/tests/data/eps/upce_5addon_gws.eps
+++ b/backend/tests/data/eps/upce_5addon_gws.eps
@@ -57,5 +57,6 @@ I 216 4 R
182 102.4 moveto
(12345) stringwidth pop -2 div 0 rmoveto
(12345) show
- 225.6 102.4 moveto
+ 238 102.4 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/eps/upce_5addon_small_bold_gws.eps b/backend/tests/data/eps/upce_5addon_small_bold_gws.eps
index aafd299d..e21133dc 100644
--- a/backend/tests/data/eps/upce_5addon_small_bold_gws.eps
+++ b/backend/tests/data/eps/upce_5addon_small_bold_gws.eps
@@ -57,5 +57,6 @@ I 216 4 R
182 102.28 moveto
(12345) stringwidth pop -2 div 0 rmoveto
(12345) show
- 225.6 102.28 moveto
+ 238 102.28 moveto
+ (>) stringwidth pop neg 0 rmoveto
(>) show
diff --git a/backend/tests/data/svg/ean13_2addon_ggs_5.2.2.5.1-2_gws.svg b/backend/tests/data/svg/ean13_2addon_ggs_5.2.2.5.1-2_gws.svg
index 1f0c2984..e7fbfff5 100644
--- a/backend/tests/data/svg/ean13_2addon_ggs_5.2.2.5.1-2_gws.svg
+++ b/backend/tests/data/svg/ean13_2addon_ggs_5.2.2.5.1-2_gws.svg
@@ -17,7 +17,7 @@
12
-
+
>
diff --git a/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2_gws.svg b/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2_gws.svg
index 4f73eeb1..24218ef5 100644
--- a/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2_gws.svg
+++ b/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2_gws.svg
@@ -17,7 +17,7 @@
54321
-
+
>
diff --git a/backend/tests/data/svg/ean13_cc_2addon_cca_4x4_gws.svg b/backend/tests/data/svg/ean13_cc_2addon_cca_4x4_gws.svg
index 39e6bceb..f70f89d7 100644
--- a/backend/tests/data/svg/ean13_cc_2addon_cca_4x4_gws.svg
+++ b/backend/tests/data/svg/ean13_cc_2addon_cca_4x4_gws.svg
@@ -17,7 +17,7 @@
12
-
+
>
diff --git a/backend/tests/data/svg/ean13_cc_5addon_ccb_3x4_gws.svg b/backend/tests/data/svg/ean13_cc_5addon_ccb_3x4_gws.svg
index 5abcbe29..b04aef50 100644
--- a/backend/tests/data/svg/ean13_cc_5addon_ccb_3x4_gws.svg
+++ b/backend/tests/data/svg/ean13_cc_5addon_ccb_3x4_gws.svg
@@ -17,7 +17,7 @@
54321
-
+
>
diff --git a/backend/tests/data/svg/ean13_cc_cca_5x4_gws.svg b/backend/tests/data/svg/ean13_cc_cca_5x4_gws.svg
index f21c9ad5..45881799 100644
--- a/backend/tests/data/svg/ean13_cc_cca_5x4_gws.svg
+++ b/backend/tests/data/svg/ean13_cc_cca_5x4_gws.svg
@@ -14,7 +14,7 @@
890128
-
+
>
diff --git a/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws.svg b/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws.svg
index 128706c0..ae0a4ab1 100644
--- a/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws.svg
+++ b/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws.svg
@@ -14,7 +14,7 @@
531000
-
+
>
diff --git a/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws_embed.svg b/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws_embed.svg
index 972686d4..7dd18875 100644
--- a/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws_embed.svg
+++ b/backend/tests/data/svg/ean13_ggs_5.2.2.1-1_gws_embed.svg
@@ -15,7 +15,7 @@
531000
-
+
>
diff --git a/backend/tests/data/svg/ean2_gws.svg b/backend/tests/data/svg/ean2_gws.svg
index c794352f..7b290553 100644
--- a/backend/tests/data/svg/ean2_gws.svg
+++ b/backend/tests/data/svg/ean2_gws.svg
@@ -8,7 +8,7 @@
12
-
+
>
diff --git a/backend/tests/data/svg/ean5_gws.svg b/backend/tests/data/svg/ean5_gws.svg
index b0b972b4..493516e7 100644
--- a/backend/tests/data/svg/ean5_gws.svg
+++ b/backend/tests/data/svg/ean5_gws.svg
@@ -8,7 +8,7 @@
12345
-
+
>
diff --git a/backend/tests/data/svg/ean8_2addon_gws.svg b/backend/tests/data/svg/ean8_2addon_gws.svg
index fa8af465..bff67e31 100644
--- a/backend/tests/data/svg/ean8_2addon_gws.svg
+++ b/backend/tests/data/svg/ean8_2addon_gws.svg
@@ -5,7 +5,7 @@
-
+
<
@@ -17,7 +17,7 @@
12
-
+
>
diff --git a/backend/tests/data/svg/ean8_5addon_gws.svg b/backend/tests/data/svg/ean8_5addon_gws.svg
index df953cfd..993fdc6e 100644
--- a/backend/tests/data/svg/ean8_5addon_gws.svg
+++ b/backend/tests/data/svg/ean8_5addon_gws.svg
@@ -5,7 +5,7 @@
-
+
<
@@ -17,7 +17,7 @@
12345
-
+
>
diff --git a/backend/tests/data/svg/ean8_cc_2addon_cca_4x3_gws.svg b/backend/tests/data/svg/ean8_cc_2addon_cca_4x3_gws.svg
index 13b76fc4..ab1d61f1 100644
--- a/backend/tests/data/svg/ean8_cc_2addon_cca_4x3_gws.svg
+++ b/backend/tests/data/svg/ean8_cc_2addon_cca_4x3_gws.svg
@@ -5,7 +5,7 @@
-
+
<
@@ -17,7 +17,7 @@
65
-
+
>
diff --git a/backend/tests/data/svg/ean8_cc_5addon_ccb_8x3_gws.svg b/backend/tests/data/svg/ean8_cc_5addon_ccb_8x3_gws.svg
index 83d23ee8..508307c6 100644
--- a/backend/tests/data/svg/ean8_cc_5addon_ccb_8x3_gws.svg
+++ b/backend/tests/data/svg/ean8_cc_5addon_ccb_8x3_gws.svg
@@ -5,7 +5,7 @@
-
+
<
@@ -17,7 +17,7 @@
74083
-
+
>
diff --git a/backend/tests/data/svg/ean8_gss_5.2.2.2-1_gws.svg b/backend/tests/data/svg/ean8_gss_5.2.2.2-1_gws.svg
index d54d669a..f57932df 100644
--- a/backend/tests/data/svg/ean8_gss_5.2.2.2-1_gws.svg
+++ b/backend/tests/data/svg/ean8_gss_5.2.2.2-1_gws.svg
@@ -5,7 +5,7 @@
-
+
<
@@ -14,7 +14,7 @@
2346
-
+
>
diff --git a/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5_gws.svg b/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5_gws.svg
index e9f34f08..905ed9ec 100644
--- a/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5_gws.svg
+++ b/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5_gws.svg
@@ -20,7 +20,7 @@
24
-
+
>
diff --git a/backend/tests/data/svg/upca_5addon_gws.svg b/backend/tests/data/svg/upca_5addon_gws.svg
index f87a5b04..062d8574 100644
--- a/backend/tests/data/svg/upca_5addon_gws.svg
+++ b/backend/tests/data/svg/upca_5addon_gws.svg
@@ -20,7 +20,7 @@
12345
-
+
>
diff --git a/backend/tests/data/svg/upca_cc_2addon_cca_3x4_gws.svg b/backend/tests/data/svg/upca_cc_2addon_cca_3x4_gws.svg
index d49f5a6d..f232c73a 100644
--- a/backend/tests/data/svg/upca_cc_2addon_cca_3x4_gws.svg
+++ b/backend/tests/data/svg/upca_cc_2addon_cca_3x4_gws.svg
@@ -20,7 +20,7 @@
12
-
+
>
diff --git a/backend/tests/data/svg/upca_cc_5addon_ccb_4x4_gws.svg b/backend/tests/data/svg/upca_cc_5addon_ccb_4x4_gws.svg
index fc1e6b40..fcbcb392 100644
--- a/backend/tests/data/svg/upca_cc_5addon_ccb_4x4_gws.svg
+++ b/backend/tests/data/svg/upca_cc_5addon_ccb_4x4_gws.svg
@@ -20,7 +20,7 @@
12121
-
+
>
diff --git a/backend/tests/data/svg/upce_2addon_gws.svg b/backend/tests/data/svg/upce_2addon_gws.svg
index cbcc01bd..26cedf27 100644
--- a/backend/tests/data/svg/upce_2addon_gws.svg
+++ b/backend/tests/data/svg/upce_2addon_gws.svg
@@ -17,7 +17,7 @@
12
-
+
>
diff --git a/backend/tests/data/svg/upce_5addon_small_gws.svg b/backend/tests/data/svg/upce_5addon_small_gws.svg
index f6950890..79769d7b 100644
--- a/backend/tests/data/svg/upce_5addon_small_gws.svg
+++ b/backend/tests/data/svg/upce_5addon_small_gws.svg
@@ -17,7 +17,7 @@
12345
-
+
>
diff --git a/backend/tests/data/svg/upce_cc_2addon_cca_5x2_gws.svg b/backend/tests/data/svg/upce_cc_2addon_cca_5x2_gws.svg
index ea987f93..1f30dd92 100644
--- a/backend/tests/data/svg/upce_cc_2addon_cca_5x2_gws.svg
+++ b/backend/tests/data/svg/upce_cc_2addon_cca_5x2_gws.svg
@@ -17,7 +17,7 @@
89
-
+
>
diff --git a/backend/tests/data/svg/upce_cc_5addon_ccb_8x2_gws.svg b/backend/tests/data/svg/upce_cc_5addon_ccb_8x2_gws.svg
index ce08ca2b..6d3cf104 100644
--- a/backend/tests/data/svg/upce_cc_5addon_ccb_8x2_gws.svg
+++ b/backend/tests/data/svg/upce_cc_5addon_ccb_8x2_gws.svg
@@ -17,7 +17,7 @@
56789
-
+
>
diff --git a/backend/tests/test_output.c b/backend/tests/test_output.c
index 42fe3e12..0e855e85 100644
--- a/backend/tests/test_output.c
+++ b/backend/tests/test_output.c
@@ -231,6 +231,89 @@ static void test_quiet_zones(const testCtx *const p_ctx) {
testFinish();
}
+static void test_set_whitespace_offsets(const testCtx *const p_ctx) {
+
+ struct item {
+ int symbology;
+ int whitespace_width;
+ int whitespace_height;
+ int border_width;
+ int output_options;
+ int hide_text;
+ int comp_xoffset;
+ float scaler;
+
+ float expected_xoffset;
+ float expected_yoffset;
+ float expected_roffset;
+ float expected_boffset;
+ float expected_qz_right;
+ };
+ /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */
+ struct item data[] = {
+ /* 0*/ { BARCODE_CODE128, 1, 0, 0, 0, 0, 0, 0.0f, /*expected*/ 1.0f, 0.0f, 1.0f, 0.0f, 0.0f },
+ /* 1*/ { BARCODE_CODE128, 2, 0, 0, 0, 0, 0, 1.0f, /*expected*/ 2.0f, 0.0f, 2.0f, 0.0f, 0.0f },
+ /* 2*/ { BARCODE_CODE128, 2, 3, 0, 0, 0, 0, 1.0f, /*expected*/ 2.0f, 3.0f, 2.0f, 3.0f, 0.0f },
+ /* 3*/ { BARCODE_CODE128, 2, 3, 1, 0, 0, 0, 1.0f, /*expected*/ 2.0f, 3.0f, 2.0f, 3.0f, 0.0f },
+ /* 4*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 4.0f, 0.0f },
+ /* 5*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 3.0f, 0.0f },
+ /* 6*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 2.0f, 4.0f, 2.0f, 3.0f, 0.0f }, /* BIND_TOP wins */
+ /* 7*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BOX, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 4.0f, 0.0f },
+ /* 8*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BOX, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 3.0f, 0.0f }, /* BIND_TOP wins */
+ /* 9*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BOX | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 4.0f, 0.0f }, /* BIND_BOX wins */
+ /* 10*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BIND_TOP | BARCODE_BOX | BARCODE_BIND, 0, 0, 1.0f, /*expected*/ 3.0f, 4.0f, 3.0f, 3.0f, 0.0f }, /* BIND_TOP wins */
+ /* 11*/ { BARCODE_CODE128, 2, 3, 1, BARCODE_BOX | BARCODE_QUIET_ZONES, 0, 0, 1.0f, /*expected*/ 13.0f, 4.0f, 13.0f, 4.0f, 10.0f },
+ };
+ int data_size = ARRAY_SIZE(data);
+ int i;
+ struct zint_symbol symbol = {0};
+ float xoffset, yoffset, roffset, boffset, qz_right;
+ int xoffset_si, yoffset_si, roffset_si, boffset_si, qz_right_si;
+
+ testStart("test_set_whitespace_offsets");
+
+ for (i = 0; i < data_size; i++) {
+ if (testContinue(p_ctx, i)) continue;
+
+ xoffset = yoffset = roffset = boffset = qz_right = 0.0f;
+ xoffset_si = yoffset_si = roffset_si = boffset_si = qz_right_si = 0;
+
+ symbol.symbology = data[i].symbology;
+ symbol.whitespace_width = data[i].whitespace_width;
+ symbol.whitespace_height = data[i].whitespace_height;
+ symbol.border_width = data[i].border_width;
+ symbol.output_options = data[i].output_options;
+ out_set_whitespace_offsets(&symbol, data[i].hide_text, data[i].comp_xoffset,
+ &xoffset, &yoffset, &roffset, &boffset, &qz_right, data[i].scaler,
+ &xoffset_si, &yoffset_si, &roffset_si, &boffset_si, &qz_right_si);
+ assert_equal(xoffset, data[i].expected_xoffset, "i:%d xoffset %g != %g\n", i, xoffset, data[i].expected_xoffset);
+ assert_equal(yoffset, data[i].expected_yoffset, "i:%d yoffset %g != %g\n", i, yoffset, data[i].expected_yoffset);
+ assert_equal(roffset, data[i].expected_roffset, "i:%d roffset %g != %g\n", i, roffset, data[i].expected_roffset);
+ assert_equal(boffset, data[i].expected_boffset, "i:%d boffset %g != %g\n", i, boffset, data[i].expected_boffset);
+ assert_equal(qz_right, data[i].expected_qz_right, "i:%d qz_right %g != %g\n", i, qz_right, data[i].expected_qz_right);
+ if (data[i].scaler) {
+ int expected_xoffset_si = (int) (data[i].expected_xoffset * data[i].scaler);
+ int expected_yoffset_si = (int) (data[i].expected_yoffset * data[i].scaler);
+ int expected_roffset_si = (int) (data[i].expected_roffset * data[i].scaler);
+ int expected_boffset_si = (int) (data[i].expected_boffset * data[i].scaler);
+ int expected_qz_right_si = (int) (data[i].expected_qz_right * data[i].scaler);
+ assert_equal(xoffset_si, expected_xoffset_si, "i:%d xoffset_si %d != %d\n", i, xoffset_si, expected_xoffset_si);
+ assert_equal(yoffset_si, expected_yoffset_si, "i:%d yoffset_si %d != %d\n", i, yoffset_si, expected_yoffset_si);
+ assert_equal(roffset_si, expected_roffset_si, "i:%d roffset_si %d != %d\n", i, roffset_si, expected_roffset_si);
+ assert_equal(boffset_si, expected_boffset_si, "i:%d boffset_si %d != %d\n", i, boffset_si, expected_boffset_si);
+ assert_equal(qz_right_si, expected_qz_right_si, "i:%d qz_right_si %d != %d\n", i, qz_right_si, expected_qz_right_si);
+ } else {
+ assert_zero(xoffset_si, "i:%d xoffset_si %d non-zero\n", i, xoffset_si);
+ assert_zero(yoffset_si, "i:%d yoffset_si %d non-zero\n", i, yoffset_si);
+ assert_zero(roffset_si, "i:%d roffset_si %d non-zero\n", i, roffset_si);
+ assert_zero(boffset_si, "i:%d boffset_si %d non-zero\n", i, boffset_si);
+ assert_zero(qz_right_si, "i:%d qz_right_si %d non-zero\n", i, qz_right_si);
+ }
+ }
+
+ testFinish();
+}
+
#ifdef _WIN32
#define TEST_OUT_SEP '\\'
#define TEST_OUT_SEP_STR "\\"
@@ -411,6 +494,7 @@ int main(int argc, char *argv[]) {
{ "test_colour_get_rgb", test_colour_get_rgb },
{ "test_colour_get_cmyk", test_colour_get_cmyk },
{ "test_quiet_zones", test_quiet_zones },
+ { "test_set_whitespace_offsets", test_set_whitespace_offsets },
{ "test_fopen", test_fopen },
{ "test_out_putsf", test_out_putsf },
};
diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c
index d22856ea..7c84d7d2 100644
--- a/backend/tests/test_raster.c
+++ b/backend/tests/test_raster.c
@@ -936,6 +936,12 @@ static void test_output_options(const testCtx *const p_ctx) {
/* 87*/ { BARCODE_ITF14, -1, -1, 0, BARCODE_BOX, 0, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 },
/* 88*/ { BARCODE_ITF14, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 },
/* 89*/ { BARCODE_ITF14, -1, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, 0, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 },
+ /* 90*/ { BARCODE_CODABLOCKF, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 101, 242, 44, 1, 43, 24 },
+ /* 91*/ { BARCODE_CODABLOCKF, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 101, 242, 42, 0, 41, 24 },
+ /* 92*/ { BARCODE_CODE16K, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 70, 162, 44, 1, 43, 0 },
+ /* 93*/ { BARCODE_CODE16K, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 70, 162, 42, 0, 41, 0 },
+ /* 94*/ { BARCODE_CODE49, -1, -1, -1, -1, 0, 0, "A123", 0, 20, 2, 70, 162, 44, 1, 43, 0 },
+ /* 95*/ { BARCODE_CODE49, -1, -1, -1, BARCODE_BIND_TOP, 0, 0, "A123", 0, 20, 2, 70, 162, 42, 0, 41, 0 },
};
int data_size = ARRAY_SIZE(data);
int i, length, ret;
diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c
index 9ad6365a..e70909c3 100644
--- a/backend/tests/test_vector.c
+++ b/backend/tests/test_vector.c
@@ -919,22 +919,22 @@ static void test_upcean_hrt(const testCtx *const p_ctx) {
struct item data[] = {
/* 0*/ { BARCODE_EANX, -1, -1, "123456789012", 0, 50, 1, 95, 226, 118, 12.2, 117.2, -1, -1, 3 }, /* EAN-13 */
/* 1*/ { BARCODE_EANX, 0, -1, "123456789012", 0, 50, 1, 95, 226, 110, -1, -1, -1, -1, 0 }, /* EAN-13 */
- /* 2*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456789012", 0, 50, 1, 95, 226, 118, 12.2, 117.2, 214, 117.2, 4 }, /* EAN-13 */
+ /* 2*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456789012", 0, 50, 1, 95, 226, 118, 12.2, 117.2, 227, 117.2, 4 }, /* EAN-13 */
/* 3*/ { BARCODE_EANX_CHK, -1, -1, "1234567890128", 0, 50, 1, 95, 226, 118, 12.2, 117.2, -1, -1, 3 }, /* EAN-13 */
/* 4*/ { BARCODE_EANX_CHK, 0, -1, "1234567890128", 0, 50, 1, 95, 226, 110, -1, -1, -1, -1, 0 }, /* EAN-13 */
- /* 5*/ { BARCODE_EANX_CHK, -1, EANUPC_GUARD_WHITESPACE, "1234567890128", 0, 50, 1, 95, 226, 118, 12.2, 117.2, 214, 117.2, 4 }, /* EAN-13 */
+ /* 5*/ { BARCODE_EANX_CHK, -1, EANUPC_GUARD_WHITESPACE, "1234567890128", 0, 50, 1, 95, 226, 118, 12.2, 117.2, 227, 117.2, 4 }, /* EAN-13 */
/* 6*/ { BARCODE_ISBNX, -1, -1, "9784567890120", 0, 50, 1, 95, 226, 118, 12.2, 117.2, -1, -1, 3 },
/* 7*/ { BARCODE_ISBNX, 0, -1, "9784567890120", 0, 50, 1, 95, 226, 110, -1, -1, -1, -1, 0 },
- /* 8*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120", 0, 50, 1, 95, 226, 118, 12.2, 117.2, 214, 117.2, 4 },
+ /* 8*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120", 0, 50, 1, 95, 226, 118, 12.2, 117.2, 227, 117.2, 4 },
/* 9*/ { BARCODE_EANX, -1, -1, "1234567", 0, 50, 1, 67, 162, 118, 49, 117.2, -1, -1, 2 }, /* EAN-8 */
/* 10*/ { BARCODE_EANX, 0, -1, "1234567", 0, 50, 1, 67, 162, 110, -1, -1, -1, -1, 0 }, /* EAN-8 */
- /* 11*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567", 0, 50, 1, 67, 162, 118, 49, 117.2, 12.5, 117.2, 4 }, /* EAN-8 */
+ /* 11*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567", 0, 50, 1, 67, 162, 118, 49, 117.2, -1, 117.2, 4 }, /* EAN-8 */
/* 12*/ { BARCODE_EANX, -1, -1, "1234", 0, 50, 1, 47, 104, 118, 47, 15.6, -1, -1, 1 }, /* EAN-5 */
/* 13*/ { BARCODE_EANX, 0, -1, "1234", 0, 50, 1, 47, 104, 100, -1, -1, -1, -1, 0 }, /* EAN-5 */
- /* 14*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234", 0, 50, 1, 47, 104, 118, 47, 15.6, 91.5, 15.6, 2 }, /* EAN-5 */
+ /* 14*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234", 0, 50, 1, 47, 104, 118, 47, 15.6, 105, 15.6, 2 }, /* EAN-5 */
/* 15*/ { BARCODE_EANX, -1, -1, "12", 0, 50, 1, 20, 50, 118, 20, 15.6, -1, -1, 1 }, /* EAN-2 */
/* 16*/ { BARCODE_EANX, 0, -1, "12", 0, 50, 1, 20, 50, 100, -1, -1, -1, -1, 0 }, /* EAN-2 */
- /* 17*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "12", 0, 50, 1, 20, 50, 118, 20, 15.6, -1, -1, 2 }, /* EAN-2 */
+ /* 17*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "12", 0, 50, 1, 20, 50, 118, 20, 15.6, 51, 15.6, 2 }, /* EAN-2 */
/* 18*/ { BARCODE_UPCA, -1, -1, "12345678901", 0, 50, 1, 95, 226, 118, 8.7, 117.2, -1, -1, 4 },
/* 19*/ { BARCODE_UPCA, 0, -1, "12345678901", 0, 50, 1, 95, 226, 110, -1, -1, -1, -1, 0 },
/* 20*/ { BARCODE_UPCA, -1, EANUPC_GUARD_WHITESPACE, "12345678901", 0, 50, 1, 95, 226, 118, 8.7, 117.2, -1, -1, 4 },
@@ -952,31 +952,31 @@ static void test_upcean_hrt(const testCtx *const p_ctx) {
/* 32*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456789012+12", 0, 50, 1, 122, 276.0, 118, 12.2, 117.2, 246, 15.6, 5 }, /* EAN-13 + EAN-2 */
/* 33*/ { BARCODE_ISBNX, -1, -1, "9784567890120+12", 0, 50, 1, 122, 276.0, 118, 12.2, 117.2, 246, 15.6, 4 }, /* ISBN + EAN-2 */
/* 34*/ { BARCODE_ISBNX, 0, -1, "9784567890120+12", 0, 50, 1, 122, 276.0, 110, -1, -1, -1, -1, 0 }, /* ISBN + EAN-2 */
- /* 35*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120+12", 0, 50, 1, 122, 276.0, 118, 246, 15.6, 264, 15.6, 5 }, /* ISBN + EAN-2 */
+ /* 35*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120+12", 0, 50, 1, 122, 276.0, 118, 246, 15.6, 277, 15.6, 5 }, /* ISBN + EAN-2 */
/* 36*/ { BARCODE_EANX, -1, -1, "123456789012+12345", 0, 50, 1, 149, 330.0, 118, 12.2, 117.2, 274, 15.6, 4 }, /* EAN-13 + EAN-5 */
/* 37*/ { BARCODE_EANX, 0, -1, "123456789012+12345", 0, 50, 1, 149, 330.0, 110, -1, -1, -1, -1, 0 }, /* EAN-13 + EAN-5 */
/* 38*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456789012+12345", 0, 50, 1, 149, 330.0, 118, 12.2, 117.2, 274, 15.6, 5 }, /* EAN-13 + EAN-5 */
/* 39*/ { BARCODE_ISBNX, -1, -1, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118, 12.2, 117.2, 274, 15.6, 4 }, /* ISBN + EAN-5 */
/* 40*/ { BARCODE_ISBNX, 0, -1, "9784567890120+12345", 0, 50, 1, 149, 330.0, 110, -1, -1, -1, -1, 0 }, /* ISBN + EAN-5 */
- /* 41*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118, 274, 15.6, 318, 15.6, 5 }, /* ISBN + EAN-5 */
+ /* 41*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118, 274, 15.6, 331, 15.6, 5 }, /* ISBN + EAN-5 */
/* 42*/ { BARCODE_EANX, -1, -1, "1234567+12", 0, 50, 1, 94, 212, 118, 49, 117.2, 182, 15.6, 3 }, /* EAN-8 + EAN-2 */
/* 43*/ { BARCODE_EANX, 0, -1, "1234567+12", 0, 50, 1, 94, 212, 110, -1, -1, -1, -1, 0 }, /* EAN-8 + EAN-2 */
- /* 44*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12", 0, 50, 1, 94, 212, 118, 182, 15.6, 199.6, 15.6, 5 }, /* EAN-8 + EAN-2 */
+ /* 44*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12", 0, 50, 1, 94, 212, 118, 182, 15.6, 213, 15.6, 5 }, /* EAN-8 + EAN-2 */
/* 45*/ { BARCODE_EANX, -1, -1, "1234567+12345", 0, 50, 1, 121, 266, 118, 49, 117.2, 210, 15.6, 3 }, /* EAN-8 + EAN-5 */
/* 46*/ { BARCODE_EANX, 0, -1, "1234567+12345", 0, 50, 1, 121, 266, 110, -1, -1, -1, -1, 0 }, /* EAN-8 + EAN-5 */
/* 47*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12345", 0, 50, 1, 121, 266, 118, 210, 15.6, 210, 15.6, 5 }, /* EAN-8 + EAN-5 */
/* 48*/ { BARCODE_UPCA, -1, -1, "12345678901+12", 0, 50, 1, 124, 276, 118, 8.7, 117.2, 246, 15.6, 5 },
/* 49*/ { BARCODE_UPCA, 0, -1, "12345678901+12", 0, 50, 1, 124, 276, 110, -1, -1, -1, -1, 0 },
- /* 50*/ { BARCODE_UPCA, -1, EANUPC_GUARD_WHITESPACE, "12345678901+12", 0, 50, 1, 124, 276, 118, 8.7, 117.2, 263.6, 15.6, 6 },
+ /* 50*/ { BARCODE_UPCA, -1, EANUPC_GUARD_WHITESPACE, "12345678901+12", 0, 50, 1, 124, 276, 118, 8.7, 117.2, 277, 15.6, 6 },
/* 51*/ { BARCODE_UPCA, -1, -1, "12345678901+12345", 0, 50, 1, 151, 330, 118, 8.7, 117.2, 274, 15.6, 5 },
/* 52*/ { BARCODE_UPCA, 0, -1, "12345678901+12345", 0, 50, 1, 151, 330, 110, -1, -1, -1, -1, 0 },
- /* 53*/ { BARCODE_UPCA, -1, EANUPC_GUARD_WHITESPACE, "12345678901+12345", 0, 50, 1, 151, 330, 118, 274, 15.6, 317.6, 15.6, 6 },
+ /* 53*/ { BARCODE_UPCA, -1, EANUPC_GUARD_WHITESPACE, "12345678901+12345", 0, 50, 1, 151, 330, 118, 274, 15.6, 331, 15.6, 6 },
/* 54*/ { BARCODE_UPCE, -1, -1, "1234567+12", 0, 50, 1, 78, 184.0, 118, 8.7, 117.2, 154, 15.6, 4 },
/* 55*/ { BARCODE_UPCE, 0, -1, "1234567+12", 0, 50, 1, 78, 184.0, 110, -1, -1, -1, -1, 0 },
- /* 56*/ { BARCODE_UPCE, -1, EANUPC_GUARD_WHITESPACE, "1234567+12", 0, 50, 1, 78, 184.0, 118, 8.7, 117.2, 171.6, 15.6, 5 },
+ /* 56*/ { BARCODE_UPCE, -1, EANUPC_GUARD_WHITESPACE, "1234567+12", 0, 50, 1, 78, 184.0, 118, 8.7, 117.2, 185, 15.6, 5 },
/* 57*/ { BARCODE_UPCE, -1, -1, "1234567+12345", 0, 50, 1, 105, 238.0, 118, 8.7, 117.2, 182, 15.6, 4 },
/* 58*/ { BARCODE_UPCE, 0, -1, "1234567+12345", 0, 50, 1, 105, 238.0, 110, -1, -1, -1, -1, 0 },
- /* 59*/ { BARCODE_UPCE, -1, EANUPC_GUARD_WHITESPACE, "1234567+12345", 0, 50, 1, 105, 238.0, 118, 182, 15.6, 225.6, 15.6, 5 },
+ /* 59*/ { BARCODE_UPCE, -1, EANUPC_GUARD_WHITESPACE, "1234567+12345", 0, 50, 1, 105, 238.0, 118, 182, 15.6, 239, 15.6, 5 },
};
int data_size = ARRAY_SIZE(data);
int i, length, ret;
@@ -1278,6 +1278,12 @@ static void test_output_options(const testCtx *const p_ctx) {
/* 48*/ { BARCODE_ITF14, -1, -1, -1, -1, "123", 0, 50, 1, 135, 330, 136.28, 1, 320, 10 },
/* 49*/ { BARCODE_ITF14, -1, -1, 0, -1, "123", 0, 50, 1, 135, 330, 136.28, 1, 320, 10 },
/* 50*/ { BARCODE_ITF14, -1, -1, 0, BARCODE_BOX, "123", 0, 50, 1, 135, 310, 116.28, 0, 300, 0 }, /* No zero-width/height rectangles */
+ /* 51*/ { BARCODE_CODABLOCKF, -1, -1, -1, -1, "A123", 0, 20, 2, 101, 242, 44, 1, 20, 42 },
+ /* 52*/ { BARCODE_CODABLOCKF, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 101, 242, 42, 0, 20, 42 },
+ /* 53*/ { BARCODE_CODE16K, -1, -1, -1, -1, "A123", 0, 20, 2, 70, 162, 44, 1, 0, 42 },
+ /* 54*/ { BARCODE_CODE16K, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 70, 162, 42, 0, 0, 42 },
+ /* 55*/ { BARCODE_CODE49, -1, -1, -1, -1, "A123", 0, 20, 2, 70, 162, 44, 1, 0, 42 },
+ /* 56*/ { BARCODE_CODE49, -1, -1, -1, BARCODE_BIND_TOP, "A123", 0, 20, 2, 70, 162, 42, 0, 0, 42 },
};
int data_size = ARRAY_SIZE(data);
int i, length, ret;
diff --git a/backend/vector.c b/backend/vector.c
index c9d3eb56..71396d12 100644
--- a/backend/vector.c
+++ b/backend/vector.c
@@ -388,7 +388,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
int addon_len = 0;
int addon_gap = 0;
float addon_text_yposn = 0.0f;
- float xoffset, yoffset, roffset, boffset;
+ float xoffset, yoffset, roffset, boffset, qz_right;
float textoffset;
int upceanflag = 0;
int addon_latch = 0;
@@ -412,6 +412,8 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
float addon_row_yposn;
float addon_row_height;
int upcae_outside_font_height = 0; /* UPC-A/E outside digits font size */
+ const float gws_left_fudge = 0.5f; /* These make the guard whitespaces appear closer to the edge for SVG/qzint */
+ const float gws_right_fudge = 0.5f; /* (undone by EMF/EPS) */
/* Note using "ascender" to mean height above digits as "ascent" usually measured from baseline */
const float digit_ascender_factor = 0.22f; /* Assuming digit ascender height roughly 22% of font size */
float digit_ascender = 0.0f; /* Avoid gcc -Wmaybe-uninitialized */
@@ -473,7 +475,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
hide_text = ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0));
- out_set_whitespace_offsets(symbol, hide_text, comp_xoffset, &xoffset, &yoffset, &roffset, &boffset, NULL,
+ out_set_whitespace_offsets(symbol, hide_text, comp_xoffset, &xoffset, &yoffset, &roffset, &boffset, &qz_right,
0 /*scaler*/, NULL, NULL, NULL, NULL, NULL);
xoffset_comp = xoffset + comp_xoffset;
@@ -740,8 +742,9 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
if (upceanflag >= 6) { /* UPC-E, EAN-8, UPC-A, EAN-13 */
float text_yposn = yoffset + symbol->height + font_height + text_gap - antialias_fudge; /* Baseline */
- if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) {
- text_yposn += symbol->border_width; /* Note not needed for BARCODE_BIND_TOP */
+ if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))
+ && !(symbol->output_options & BARCODE_BIND_TOP)) { /* Trumps BARCODE_BOX & BARCODE_BIND */
+ text_yposn += symbol->border_width;
}
if (upceanflag == 6) { /* UPC-E */
@@ -763,20 +766,20 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height,
textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY;
if (upcean_guard_whitespace) {
- text_xposn = (addon_len == 2 ? 70.0f : 97.0f) - 0.2f + xoffset_comp + addon_gap;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
}
} else if (upceanflag == 8) { /* EAN-8 */
float text_xposn;
if (upcean_guard_whitespace) {
- text_xposn = -0.75f + xoffset_comp;
+ text_xposn = -7.0f - gws_left_fudge + xoffset_comp;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) "<", 1, text_xposn, text_yposn,
- font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
text_xposn = (17.0f + 0.5f) + xoffset_comp;
textwidth = 4.0f * 8.5f;
@@ -791,16 +794,16 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height,
textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY;
if (upcean_guard_whitespace) {
- text_xposn = (addon_len == 2 ? 86.0f : 113.0f) - 0.2f + xoffset_comp + addon_gap;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
} else if (upcean_guard_whitespace) {
- text_xposn = (68.0f - 0.2f) + xoffset_comp;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
} else if (upceanflag == 12) { /* UPC-A */
@@ -827,10 +830,10 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height,
textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY;
if (upcean_guard_whitespace) {
- text_xposn = (addon_len == 2 ? 114.0f : 141.0f) - 0.2f + xoffset_comp + addon_gap;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
}
@@ -852,16 +855,16 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height,
textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY;
if (upcean_guard_whitespace) {
- text_xposn = (addon_len == 2 ? 114.0f : 141.0f) + xoffset_comp + addon_gap;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
} else if (upcean_guard_whitespace) {
- text_xposn = 96.0f + xoffset_comp;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
}
@@ -881,10 +884,10 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
if (!vector_add_string(symbol, symbol->text, addon_len, text_xposn, text_yposn, font_height,
textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY;
if (upcean_guard_whitespace) {
- text_xposn = (addon_len == 2 ? 18.75f : 45.75f) + xoffset + addon_gap;
+ text_xposn = symbol->width + gws_right_fudge + qz_right + xoffset;
textwidth = 8.5f;
if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, text_yposn,
- font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY;
+ font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY;
}
} else {
@@ -892,8 +895,9 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_
float text_xposn = main_width / 2.0f + xoffset_comp;
float text_yposn = yoffset + symbol->height + font_height + text_gap; /* Calculated to bottom of text */
text_yposn -= symbol->output_options & SMALL_TEXT ? descent_small : descent;
- if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) {
- text_yposn += symbol->border_width; /* Note not needed for BARCODE_BIND_TOP */
+ if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))
+ && !(symbol->output_options & BARCODE_BIND_TOP)) { /* Trumps BARCODE_BOX & BARCODE_BIND */
+ text_yposn += symbol->border_width;
}
if (!vector_add_string(symbol, symbol->text, -1, text_xposn, text_yposn, font_height, symbol->width, 0,
&last_string)) return ZINT_ERROR_MEMORY;
diff --git a/docs/images/eanx8_gws.svg b/docs/images/eanx8_gws.svg
index d78722d6..1b1b7da9 100644
--- a/docs/images/eanx8_gws.svg
+++ b/docs/images/eanx8_gws.svg
@@ -5,7 +5,7 @@
-
+
<
@@ -14,7 +14,7 @@
3654
-
+
>
diff --git a/docs/images/isbnx_gws.svg b/docs/images/isbnx_gws.svg
index 1419b358..cd5d3b38 100644
--- a/docs/images/isbnx_gws.svg
+++ b/docs/images/isbnx_gws.svg
@@ -14,7 +14,7 @@
055124
-
+
>
diff --git a/docs/images/upca_5_gws.svg b/docs/images/upca_5_gws.svg
index bd183bb6..7faa2e67 100644
--- a/docs/images/upca_5_gws.svg
+++ b/docs/images/upca_5_gws.svg
@@ -20,7 +20,7 @@
12345
-
+
>
diff --git a/docs/images/upce_2_gws.svg b/docs/images/upce_2_gws.svg
index fa6a12c5..025ce734 100644
--- a/docs/images/upce_2_gws.svg
+++ b/docs/images/upce_2_gws.svg
@@ -17,7 +17,7 @@
12
-
+
>