From cf04ac15b0e7b6b47f13288eb1c31655f8ff2275 Mon Sep 17 00:00:00 2001 From: gitlost Date: Tue, 9 Jan 2024 18:38:21 +0000 Subject: [PATCH] general: use explicit float consts rather than calced ones manual: remove extra tags from "manual.txt" and clean up table captions --- backend/2of5.c | 8 +-- backend/bc412.c | 11 ++-- backend/code.c | 13 +++-- backend/code128.c | 14 ++--- backend/emf.c | 12 ++--- backend/imail.c | 10 ++-- backend/library.c | 4 +- backend/mailmark.c | 10 ++-- backend/medical.c | 4 +- backend/output.c | 20 +++---- backend/postal.c | 39 ++++++++------ backend/raster.c | 6 ++- backend/tests/fuzz/gen_corpora.c | 10 ++++ backend/tests/test_vector.c | 12 ++--- backend/upcean.c | 12 ++--- backend_qt/tests/test_qzint.cpp | 2 +- docs/Makefile | 5 +- docs/README | 10 ++-- docs/manual.txt | 90 ++++++++++++++++---------------- docs/zint.1 | 2 +- frontend/main.c | 16 +++--- 21 files changed, 174 insertions(+), 136 deletions(-) diff --git a/backend/2of5.c b/backend/2of5.c index ce3665c1..7026c63e 100644 --- a/backend/2of5.c +++ b/backend/2of5.c @@ -1,7 +1,7 @@ /* 2of5.c - Handles Code 2 of 5 barcodes */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -213,7 +213,7 @@ static int c25_inter_common(struct zint_symbol *symbol, unsigned char source[], (P = character pairs, N = wide/narrow ratio = 3) width = (P(4N + 6) + N + 6)X = (length / 2) * 18 + 9 */ /* Taking min X = 0.330mm from Annex D.3.1 (application specification) */ - const float min_height_min = stripf(5.0f / 0.33f); + const float min_height_min = 15.151515f; /* 5.0 / 0.33 */ float min_height = stripf((18.0f * (length / 2) + 9.0f) * 0.15f); if (min_height < min_height_min) { min_height = min_height_min; @@ -276,7 +276,9 @@ INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int lengt /* GS1 General Specifications 21.0.1 5.12.3.2 table 2, including footnote (**): (note bind/box additional to symbol->height), same as GS1-128: "in case of further space constraints" height 5.8mm / 1.016mm (X max) ~ 5.7; default 31.75mm / 0.495mm ~ 64.14 */ - error_number = set_height(symbol, stripf(5.8f / 1.016f), stripf(31.75f / 0.495f), 0.0f, 0 /*no_errtxt*/); + const float min_height = 5.70866156f; /* 5.8 / 1.016 */ + const float default_height = 64.1414108f; /* 31.75 / 0.495 */ + error_number = set_height(symbol, min_height, default_height, 0.0f, 0 /*no_errtxt*/); } else { (void) set_height(symbol, 0.0f, 50.0f, 0.0f, 1 /*no_errtxt*/); } diff --git a/backend/bc412.c b/backend/bc412.c index 8bf694f9..0f41e090 100644 --- a/backend/bc412.c +++ b/backend/bc412.c @@ -1,7 +1,7 @@ /* bc412.c - Handles IBM BC412 (SEMI T1-95) symbology */ /* libzint - the open source barcode library - Copyright (C) 2022 Robin Stuart + Copyright (C) 2022-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -134,11 +134,14 @@ INTERNAL int bc412(struct zint_symbol *symbol, unsigned char source[], int lengt if (symbol->output_options & COMPLIANT_HEIGHT) { /* SEMI T1-95 Table 1 "Module" (Character) Height 2mm ± 0.025mm, using Module Spacing 0.12mm ± 0.025mm as X-dimension */ - error_number = set_height(symbol, stripf(1.975f / 0.145f), stripf(2.0f / 0.12f), stripf(2.025f / 0.095f), - 0 /*no_errtxt*/); + const float min_height = 13.6206894f; /* 1.975 / 0.145 */ + const float default_height = 16.666666f; /* 2.0 / 0.12 */ + const float max_height = 21.3157902f; /* 2.025 / 0.095 */ + error_number = set_height(symbol, min_height, default_height, max_height, 0 /*no_errtxt*/); } else { /* Using compliant height as default as no backwards compatibility to consider */ - (void) set_height(symbol, 0.0f, stripf(2.0f / 0.12f), 0.0f, 1 /*no_errtxt*/); + const float default_height = 16.666666f; /* 2.0 / 0.12 */ + (void) set_height(symbol, 0.0f, default_height, 0.0f, 1 /*no_errtxt*/); } return error_number; diff --git a/backend/code.c b/backend/code.c index cfc40e4c..635871f7 100644 --- a/backend/code.c +++ b/backend/code.c @@ -1,7 +1,7 @@ /* code.c - Handles Code 11, 39, 39+, 93, PZN, Channel and VIN */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -327,8 +327,9 @@ INTERNAL int code39(struct zint_symbol *symbol, unsigned char source[], int leng /* MIL-STD-1189 Rev. B Section 5.2 Min height 0.25" / 0.04" (X max) = 6.25 Default height 0.625" (average of 0.375" - 0.875") / 0.01375" (average of 0.0075" - 0.02") ~ 45.45 */ - error_number = set_height(symbol, 6.25f, stripf(0.625f / 0.01375f), stripf(0.875f / 0.0075f), - 0 /*no_errtxt*/); + const float default_height = 45.4545441f; /* 0.625 / 0.01375 */ + const float max_height = 116.666664f; /* 0.875 / 0.0075 */ + error_number = set_height(symbol, 6.25f, default_height, max_height, 0 /*no_errtxt*/); } else if (symbol->symbology == BARCODE_CODE39 || symbol->symbology == BARCODE_EXCODE39 || symbol->symbology == BARCODE_HIBC_39) { /* ISO/IEC 16388:2007 4.4 (e) recommended min height 5.0mm or 15% of width excluding quiet zones; @@ -429,7 +430,9 @@ INTERNAL int pzn(struct zint_symbol *symbol, unsigned char source[], int length) "normal" X 0.25mm (0.187mm - 0.45mm), height 8mm - 20mm for 0.25mm X, 10mm mentioned so use that as default, 10mm / 0.25mm = 40 */ if (error_number < ZINT_ERROR) { - error_number = set_height(symbol, stripf(8.0f / 0.45f), 40.0f, stripf(20.0f / 0.187f), 0 /*no_errtxt*/); + const float min_height = 17.7777786f; /* 8.0 / 0.45 */ + const float max_height = 106.951874f; /* 20.0 / 0.187 */ + error_number = set_height(symbol, min_height, 40.0f, max_height, 0 /*no_errtxt*/); } } else { if (error_number < ZINT_ERROR) { @@ -588,7 +591,7 @@ INTERNAL int code93(struct zint_symbol *symbol, unsigned char source[], int leng /* ANSI/AIM BC5-1995 Section 2.6 minimum height 0.2" or 15% of symbol length, whichever is greater no max X given so for min height use symbol length = (9 * (C + 4) + 1) * X + 2 * Q = symbol->width + 20; use 40 as default height based on figures in spec */ - float min_height = stripf((symbol->width + 20) * 0.15f); + const float min_height = stripf((symbol->width + 20) * 0.15f); error_number = set_height(symbol, min_height, min_height > 40.0f ? min_height : 40.0f, 0.0f, 0 /*no_errtxt*/); } else { (void) set_height(symbol, 0.0f, 50.0f, 0.0f, 1 /*no_errtxt*/); diff --git a/backend/code128.c b/backend/code128.c index f4cc3284..0b2803c1 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -1,7 +1,7 @@ /* code128.c - Handles Code 128 and derivatives */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Bugfixes thanks to Christian Sakowski and BogDan Vatra Redistribution and use in source and binary forms, with or without @@ -989,8 +989,8 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int /* GS1 General Specifications 21.0.1 5.12.3.2 table 2, including footnote (**): same as ITF-14: "in case of further space constraints" height 5.8mm / 1.016mm (X max) ~ 5.7; default 31.75mm / 0.495mm ~ 64.14 */ - const float min_height = stripf(5.8f / 1.016f); - const float default_height = stripf(31.75f / 0.495f); + const float min_height = 5.70866156f; /* 5.8 / 1.016 */ + const float default_height = 64.1414108f; /* 31.75 / 0.495 */ if (symbol->symbology == BARCODE_GS1_128_CC) { /* Pass back via temporary linear structure */ symbol->height = symbol->height ? min_height : default_height; @@ -1153,9 +1153,11 @@ INTERNAL int dpd(struct zint_symbol *symbol, unsigned char source[], int length) /* DPD Parcel Label Specification Version 2.4.1 (19.01.2021) Section 4.6.1.2 25mm / 0.4mm (X max) = 62.5 min, 25mm / 0.375 (X) ~ 66.66 default */ if (relabel) { /* If relabel then half-size */ - error_number = set_height(symbol, 31.25f, stripf(12.5f / 0.375f), 0.0f, 0 /*no_errtxt*/); + const float default_height = 33.3333321f; /* 12.5 / 0.375 */ + error_number = set_height(symbol, 31.25f, default_height, 0.0f, 0 /*no_errtxt*/); } else { - error_number = set_height(symbol, 62.5f, stripf(25.0f / 0.375f), 0.0f, 0 /*no_errtxt*/); + const float default_height = 66.6666641f; /* 25.0 / 0.375 */ + error_number = set_height(symbol, 62.5f, default_height, 0.0f, 0 /*no_errtxt*/); } } else { (void) set_height(symbol, 0.0f, relabel ? 25.0f : 50.0f, 0.0f, 1 /*no_errtxt*/); @@ -1299,7 +1301,7 @@ INTERNAL int upu_s10(struct zint_symbol *symbol, unsigned char source[], int len if (symbol->output_options & COMPLIANT_HEIGHT) { /* Universal Postal Union S10 Section 8, using max X 0.51mm & minimum height 12.5mm or 15% of width */ - const float min_height_min = stripf(12.5f / 0.51f); + const float min_height_min = 24.5098038f; /* 12.5 / 0.51 */ float min_height = stripf(symbol->width * 0.15f); if (min_height < min_height_min) { min_height = min_height_min; diff --git a/backend/emf.c b/backend/emf.c index 3551c6af..a40b9b18 100644 --- a/backend/emf.c +++ b/backend/emf.c @@ -1,7 +1,7 @@ /* emf.c - Support for Microsoft Enhanced Metafile Format */ /* libzint - the open source barcode library - Copyright (C) 2016-2023 Robin Stuart + Copyright (C) 2016-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -43,7 +43,7 @@ #include "emf.h" /* Multiply truncating to 3 decimal places (avoids rounding differences on various platforms) */ -#define mul3dpf(m, arg) stripf(roundf((m) * (arg) * 1000.0f) / 1000.0f) +#define emf_mul3dpf(m, arg) stripf(roundf((m) * (arg) * 1000.0f) / 1000.0f) static int emf_count_rectangles(const struct zint_symbol *symbol) { int rectangles = 0; @@ -479,7 +479,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { causes various different rendering issues for LibreOffice Draw and Inkscape, so using following hack */ if (previous_diameter != circ->diameter + circ->width) { /* Drawing MaxiCode bullseye using overlayed discs */ previous_diameter = circ->diameter + circ->width; - radius = mul3dpf(0.5f, previous_diameter); + radius = emf_mul3dpf(0.5f, previous_diameter); } circle[this_circle].type = 0x0000002a; /* EMR_ELLIPSE */ circle[this_circle].size = 24; @@ -518,9 +518,9 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { if (previous_diameter != hex->diameter) { previous_diameter = hex->diameter; - radius = mul3dpf(0.5f, previous_diameter); - half_radius = mul3dpf(0.25f, previous_diameter); - half_sqrt3_radius = mul3dpf(0.43301270189221932338f, previous_diameter); + radius = emf_mul3dpf(0.5f, previous_diameter); + half_radius = emf_mul3dpf(0.25f, previous_diameter); + half_sqrt3_radius = emf_mul3dpf(0.43301270189221932338f, previous_diameter); } /* Note rotation done via world transform */ diff --git a/backend/imail.c b/backend/imail.c index f2bee1ce..64be5718 100644 --- a/backend/imail.c +++ b/backend/imail.c @@ -1,7 +1,7 @@ /* imail.c - Handles Intelligent Mail (aka OneCode) for USPS */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -437,10 +437,12 @@ INTERNAL int usps_imail(struct zint_symbol *symbol, unsigned char source[], int Tracker 0.048" (average of 0.039" - 0.057") Ascender/descender 0.0965" (average of 0.082" - 0.111") less T = 0.0485" */ - symbol->row_height[0] = stripf(0.0485f * 43); /* 2.0855 */ - symbol->row_height[1] = stripf(0.048f * 43); /* 2.064 */ + const float min_height = 4.875f; /* 0.125 * 39 */ + const float max_height = 7.75500011f; /* 0.165 * 47 */ + symbol->row_height[0] = 2.0855f; /* 0.0485 * 43 */ + symbol->row_height[1] = 2.06399989f; /* 0.048 * 43 */ /* Note using max X for minimum and min X for maximum */ - error_number = daft_set_height(symbol, stripf(0.125f * 39) /*4.875*/, stripf(0.165f * 47) /*7.755*/); + error_number = daft_set_height(symbol, min_height, max_height); } else { symbol->row_height[0] = 3.0f; symbol->row_height[1] = 2.0f; diff --git a/backend/library.c b/backend/library.c index c4283c40..a6101ee9 100644 --- a/backend/library.c +++ b/backend/library.c @@ -1,7 +1,7 @@ /* library.c - external functions of libzint */ /* libzint - the open source barcode library - Copyright (C) 2009-2023 Robin Stuart + Copyright (C) 2009-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -68,7 +68,7 @@ static void set_symbol_defaults(struct zint_symbol *symbol) { symbol->show_hrt = 1; /* Show human readable text */ symbol->input_mode = DATA_MODE; symbol->eci = 0; /* Default 0 uses ECI 3 */ - symbol->dot_size = 4.0f / 5.0f; + symbol->dot_size = 0.8f; /* 0.4 / 0.5 */ symbol->text_gap = 1.0f; symbol->guard_descent = 5.0f; symbol->warn_level = WARN_DEFAULT; diff --git a/backend/mailmark.c b/backend/mailmark.c index 683b152e..b952282b 100644 --- a/backend/mailmark.c +++ b/backend/mailmark.c @@ -1,7 +1,7 @@ /* mailmark.c - Royal Mail 4-state and 2D Mailmark barcodes */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -497,10 +497,12 @@ INTERNAL int mailmark_4s(struct zint_symbol *symbol, unsigned char source[], int Using recommended 1.9mm and 1.3mm heights for Ascender/Descenders and Trackers resp. as defaults Min height 4.22mm * 39 (max pitch) / 25.4mm ~ 6.47, max height 5.84mm * 47 (min pitch) / 25.4mm ~ 10.8 */ - symbol->row_height[0] = stripf((1.9f * 42.3f) / 25.4f); /* ~3.16 */ - symbol->row_height[1] = stripf((1.3f * 42.3f) / 25.4f); /* ~2.16 */ + const float min_height = 6.47952747f; /* (4.22 * 39) / 25.4 */ + const float max_height = 10.8062992f; /* (5.84 * 47) / 25.4 */ + symbol->row_height[0] = 3.16417313f; /* (1.9 * 42.3) / 25.4 */ + symbol->row_height[1] = 2.16496062f; /* (1.3 * 42.3) / 25.4 */ /* Note using max X for minimum and min X for maximum */ - error_number = daft_set_height(symbol, stripf((4.22f * 39) / 25.4f), stripf((5.84f * 47) / 25.4f)); + error_number = daft_set_height(symbol, min_height, max_height); } else { symbol->row_height[0] = 4.0f; symbol->row_height[1] = 2.0f; diff --git a/backend/medical.c b/backend/medical.c index 73361956..b00a2294 100644 --- a/backend/medical.c +++ b/backend/medical.c @@ -1,7 +1,7 @@ /* medical.c - Handles 1 track and 2 track pharmacode and Codabar */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -275,7 +275,7 @@ INTERNAL int codabar(struct zint_symbol *symbol, unsigned char source[], int len narrow/wide ratio as 2 and I = X) width = ((2 * N + 5) * C + (N – 1) * (D + 2)) * X + I * (C – 1) + 2Q = ((4 + 5) * C + (D + 2) + C - 1 + 2 * 10) * X = (10 * C + D + 21) * X Length (C) includes start/stop chars */ - const float min_height_min = stripf(5.0f / 0.43f); + const float min_height_min = 11.6279068f; /* 5.0 / 0.43 */ float min_height = stripf((10.0f * ((add_checksum ? length + 1 : length) + 2.0f) + d_chars + 21.0f) * 0.15f); if (min_height < min_height_min) { min_height = min_height_min; diff --git a/backend/output.c b/backend/output.c index 3f7c80b0..d30749ae 100644 --- a/backend/output.c +++ b/backend/output.c @@ -1,7 +1,7 @@ /* output.c - Common routines for raster/vector libzint - the open source barcode library - Copyright (C) 2020-2023 Robin Stuart + Copyright (C) 2020-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -504,8 +504,8 @@ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text /* USPS DMM 300 2006 (2011) 708.9.3 (top/bottom zero) right 0.125" (min) / 0.03925" (X max) ~ 3.18, left 1.25" - 0.66725" (max width of barcode) - 0.375 (max right) = 0.20775" / 0.03925" (X max) ~ 5.29 */ - *right = (float) (0.125 / 0.03925); - *left = (float) (0.20775 / 0.03925); + *right = 3.18471336f; /* 0.125 / 0.03925 */ + *left = 5.29299355f; /* 0.20775 / 0.03925 */ done = 1; break; case BARCODE_PHARMA: @@ -561,13 +561,13 @@ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text /* Customer Barcode Technical Specifications (2012) left/right 6mm / 0.6mm = 10, top/bottom 2mm / 0.6mm ~ 3.33 (X max) */ *left = *right = 10.0f; - *top = *bottom = (float) (2.0 / 0.6); + *top = *bottom = 3.33333325f; /* 2.0 / 0.6 */ done = 1; break; case BARCODE_RM4SCC: /* Royal Mail Know How User's Manual Appendix C: using CBC, same as MAILMARK_4S, 2mm all round, use X max (25.4mm / 39) i.e. 20 bars per 25.4mm */ - *left = *right = *top = *bottom = (float) ((2.0 * 39.0) / 25.4); /* ~ 3.07 */ + *left = *right = *top = *bottom = 3.07086611f; /* (2.0 * 39.0) / 25.4 */ done = 1; break; case BARCODE_DATAMATRIX: @@ -578,7 +578,7 @@ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text break; case BARCODE_JAPANPOST: /* Japan Post Zip/Barcode Manual p.13 2mm all round, X 0.6mm, 2mm / 0.6mm ~ 3.33 */ - *left = *right = *top = *bottom = (float) (2.0 / 0.6); + *left = *right = *top = *bottom = 3.33333325f; /* 2.0 / 0.6 */ done = 1; break; @@ -591,8 +591,8 @@ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text case BARCODE_USPS_IMAIL: /* USPS-B-3200 (2015) Section 2.3.2 left/right 0.125", top/bottom 0.026", use X max (1 / 39) i.e. 20 bars per inch */ - *left = *right = 0.125f * 39.0f; /* 4.875 */ - *top = *bottom = 0.026f * 39.0f; /* 1.014 */ + *left = *right = 4.875f; /* 0.125 * 39.0 */ + *top = *bottom = 1.01400006f; /* 0.026 * 39.0 */ done = 1; break; @@ -604,7 +604,7 @@ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text case BARCODE_KIX: /* Handleiding KIX code brochure - same as RM4SCC/MAILMARK_4S */ - *left = *right = *top = *bottom = (float) ((2.0 * 39.0) / 25.4); /* ~ 3.07 */ + *left = *right = *top = *bottom = 3.07086611f; /* (2.0 * 39.0) / 25.4 */ done = 1; break; case BARCODE_AZTEC: @@ -630,7 +630,7 @@ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text case BARCODE_MAILMARK_4S: /* Royal Mail Mailmark Barcode Definition Document Section 3.5.2, 2mm all round, use X max (25.4mm / 39) i.e. 20 bars per 25.4mm */ - *left = *right = *top = *bottom = (float) ((2.0 * 39.0) / 25.4); /* ~ 3.07 */ + *left = *right = *top = *bottom = 3.07086611f; /* (2.0 * 39.0) / 25.4 */ done = 1; break; case BARCODE_UPU_S10: diff --git a/backend/postal.c b/backend/postal.c index a53fccf4..0c551b8b 100644 --- a/backend/postal.c +++ b/backend/postal.c @@ -99,18 +99,18 @@ static int usps_set_height(struct zint_symbol *symbol, const int no_errtxt) { */ /* CEPNet e Código Bidimensional Datamatrix 2D (26/05/2021) 3.3.2 Arquitetura das barras - same as POSTNET */ int error_number = 0; - float h_ratio; /* Half ratio */ /* No legacy for CEPNet as new */ if ((symbol->output_options & COMPLIANT_HEIGHT) || symbol->symbology == BARCODE_CEPNET) { - symbol->row_height[0] = stripf(0.075f * 43); /* 3.225 */ - symbol->row_height[1] = stripf(0.05f * 43); /* 2.15 */ + symbol->row_height[0] = 3.2249999f; /* 0.075 * 43 */ + symbol->row_height[1] = 2.1500001f; /* 0.05 * 43 */ } else { symbol->row_height[0] = 6.0f; symbol->row_height[1] = 6.0f; } if (symbol->height) { - h_ratio = symbol->row_height[1] / (symbol->row_height[0] + symbol->row_height[1]); /* 0.4 */ + /* Half ratio */ + const float h_ratio = symbol->row_height[1] / (symbol->row_height[0] + symbol->row_height[1]); /* 0.4 */ symbol->row_height[1] = stripf(symbol->height * h_ratio); if (symbol->row_height[1] < 0.5f) { /* Absolute minimum */ symbol->row_height[1] = 0.5f; @@ -369,8 +369,10 @@ INTERNAL int fim(struct zint_symbol *symbol, unsigned char source[], int length) if (symbol->output_options & COMPLIANT_HEIGHT) { /* USPS Domestic Mail Manual (USPS DMM 300) Jan 8, 2006 (updated 2011) 708.9.3 X 0.03125" (1/32) +- 0.008" so X max 0.03925", height 0.625" (5/8) +- 0.125" (1/8) */ - error_number = set_height(symbol, stripf(0.5f / 0.03925f), 20.0f /*0.625 / 0.03125*/, - stripf(0.75f / 0.02415f), 0 /*no_errtxt*/); + const float min_height = 12.7388535f; /* 0.5 / 0.03925 */ + const float default_height = 20.0f; /* 0.625 / 0.03125 */ + const float max_height = 31.0559006f; /* 0.75 / 0.02415 */ + error_number = set_height(symbol, min_height, default_height, max_height, 0 /*no_errtxt*/); } else { (void) set_height(symbol, 0.0f, 50.0f, 0.0f, 1 /*no_errtxt*/); } @@ -382,10 +384,11 @@ INTERNAL int fim(struct zint_symbol *symbol, unsigned char source[], int length) /* Used by auspost.c also */ INTERNAL int daft_set_height(struct zint_symbol *symbol, const float min_height, const float max_height) { int error_number = 0; - float t_ratio; /* Tracker ratio */ if (symbol->height) { - t_ratio = stripf(symbol->row_height[1] / stripf(symbol->row_height[0] * 2 + symbol->row_height[1])); + /* Tracker ratio */ + const float t_ratio = stripf(symbol->row_height[1] / stripf(symbol->row_height[0] * 2 + + symbol->row_height[1])); symbol->row_height[1] = stripf(symbol->height * t_ratio); if (symbol->row_height[1] < 0.5f) { /* Absolute minimum */ symbol->row_height[1] = 0.5f; @@ -487,10 +490,12 @@ INTERNAL int rm4scc(struct zint_symbol *symbol, unsigned char source[], int leng Bar pitch and min/maxes same as Mailmark, so using recommendations from Royal Mail Mailmark Barcode Definition Document (15 Sept 2015) Section 3.5.1 */ - symbol->row_height[0] = stripf((1.9f * 42.3f) / 25.4f); /* ~3.16 */ - symbol->row_height[1] = stripf((1.3f * 42.3f) / 25.4f); /* ~2.16 */ + const float min_height = 6.47952747f; /* (4.22 * 39) / 25.4 */ + const float max_height = 10.8062992f; /* (5.84 * 47) / 25.4 */ + symbol->row_height[0] = 3.16417313f; /* (1.9 * 42.3) / 25.4 */ + symbol->row_height[1] = 2.16496062f; /* (1.3 * 42.3) / 25.4 */ /* Note using max X for minimum and min X for maximum */ - error_number = daft_set_height(symbol, stripf((4.22f * 39) / 25.4f), stripf((5.84f * 47) / 25.4f)); + error_number = daft_set_height(symbol, min_height, max_height); } else { symbol->row_height[0] = 3.0f; symbol->row_height[1] = 2.0f; @@ -543,10 +548,12 @@ INTERNAL int kix(struct zint_symbol *symbol, unsigned char source[], int length) if (symbol->output_options & COMPLIANT_HEIGHT) { /* Dimensions same as RM4SCC */ - symbol->row_height[0] = stripf((1.9f * 42.3f) / 25.4f); /* ~3.16 */ - symbol->row_height[1] = stripf((1.3f * 42.3f) / 25.4f); /* ~2.16 */ + const float min_height = 6.47952747f; /* (4.22 * 39) / 25.4 */ + const float max_height = 10.8062992f; /* (5.84 * 47) / 25.4 */ + symbol->row_height[0] = 3.16417313f; /* (1.9 * 42.3) / 25.4 */ + symbol->row_height[1] = 2.16496062f; /* (1.3 * 42.3) / 25.4 */ /* Note using max X for minimum and min X for maximum */ - error_number = daft_set_height(symbol, stripf((4.22f * 39) / 25.4f), stripf((5.84f * 47) / 25.4f)); + error_number = daft_set_height(symbol, min_height, max_height); } else { symbol->row_height[0] = 3.0f; symbol->row_height[1] = 2.0f; @@ -737,9 +744,11 @@ INTERNAL int japanpost(struct zint_symbol *symbol, unsigned char source[], int l X 0.6mm (0.5mm - 0.7mm) Tracker height 1.2mm (1.05mm - 1.35mm) / 0.6mm = 2, Ascender/descender = 1.2mm (Full 3.6mm (3.4mm - 3.6mm, max preferred) less T divided by 2) / 0.6mm = 2 */ + const float min_height = 4.85714293f; /* 3.4 / 0.7 */ + const float max_height = 7.19999981f; /* 3.6 / 0.5 */ symbol->row_height[0] = 2.0f; symbol->row_height[1] = 2.0f; - error_number = daft_set_height(symbol, stripf(3.4f / 0.7f) /*~4.857*/, stripf(3.6f / 0.5f) /*7.2*/); + error_number = daft_set_height(symbol, min_height, max_height); } else { symbol->row_height[0] = 3.0f; symbol->row_height[1] = 2.0f; diff --git a/backend/raster.c b/backend/raster.c index 74f4ba18..4eebe26c 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -1,7 +1,7 @@ /* raster.c - Handles output to raster files */ /* libzint - the open source barcode library - Copyright (C) 2009-2023 Robin Stuart + Copyright (C) 2009-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -825,8 +825,10 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, const int rotate_ang } if (error_number == 0) { /* Check whether size is compliant */ + const float min_ratio = 0.92993629f; /* 24.82 / 26.69 */ + const float max_ratio = 1.177984f; /* 27.93 / 23.71 */ const float size_ratio = (float) hex_image_width / hex_image_height; - if (size_ratio < 24.82f / 26.69f || size_ratio > 27.93f / 23.71f) { + if (size_ratio < min_ratio || size_ratio > max_ratio) { strcpy(symbol->errtxt, "663: Size not within the minimum/maximum ranges"); error_number = ZINT_WARN_NONCOMPLIANT; } diff --git a/backend/tests/fuzz/gen_corpora.c b/backend/tests/fuzz/gen_corpora.c index 40fe5124..1778584d 100644 --- a/backend/tests/fuzz/gen_corpora.c +++ b/backend/tests/fuzz/gen_corpora.c @@ -1,5 +1,15 @@ /* gen_corpora.c - write out initial fuzz data for zint, allowing for how `set_symbol()` in "fuzz.h" uses first X bytes to set various `zint_symbol` members (namely `input_mode`, `option_1`, `option_2`, `eci`, `option_3`) */ +/* + From "backend/tests/fuzz" directory: + + rm -rf fuzz_data_corpus fuzz_gs1_corpus + rm -f fuzz_data_seed_corpus.zip fuzz_gs1_seed_corpus.zip + gcc gen_corpora.c -o gen_corpora -lzint -fsanitize=address + ./gen_corpora + zip -j fuzz_data_seed_corpus.zip fuzz_data_corpus/* + zip -j fuzz_gs1_seed_corpus.zip fuzz_gs1_corpus/* +*/ /* libzint - the open source barcode library Copyright (C) 2024 Robin Stuart diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index e70909c3..9c04d184 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019-2023 Robin Stuart + Copyright (C) 2019-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -682,7 +682,7 @@ static void test_buffer_vector(const testCtx *const p_ctx) { /*128*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154, 154 }, /*129*/ { BARCODE_ULTRA, "1234567890", "", 13, 13, 18, 36, 26 }, /*130*/ { BARCODE_RMQR, "12345", "", 11, 11, 27, 54, 22 }, - /*131*/ { BARCODE_BC412, "1234567", "", 16.666668, 1, 102, 204, 49.613335 }, + /*131*/ { BARCODE_BC412, "1234567", "", 16.666666, 1, 102, 204, 49.613335 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -2012,8 +2012,8 @@ static void test_quiet_zones(const testCtx *const p_ctx) { /*292*/ { BARCODE_ULTRA, BARCODE_QUIET_ZONES, -1, -1, -1, "1234", "", 0, 13, 13, 15, 34, 30, 2, 2, 30, 2 }, /*293*/ { BARCODE_RMQR, -1, -1, -1, -1, "1234", "", 0, 11, 11, 27, 54, 22, 0, 0, 14, 2 }, /*294*/ { BARCODE_RMQR, BARCODE_QUIET_ZONES, -1, -1, -1, "1234", "", 0, 11, 11, 27, 62, 30, 4, 4, 14, 2 }, - /*295*/ { BARCODE_BC412, -1, -1, -1, -1, "1234567", "", 0, 16.666668, 1, 102, 204, 49.613335, 0, 0, 2, 33.333336 }, - /*296*/ { BARCODE_BC412, BARCODE_QUIET_ZONES, -1, -1, -1, "1234567", "", 0, 16.666668, 1, 102, 244, 49.613335, 20, 0, 2, 33.333336 }, + /*295*/ { BARCODE_BC412, -1, -1, -1, -1, "1234567", "", 0, 16.666666, 1, 102, 204, 49.613335, 0, 0, 2, 33.333336 }, + /*296*/ { BARCODE_BC412, BARCODE_QUIET_ZONES, -1, -1, -1, "1234567", "", 0, 16.666666, 1, 102, 244, 49.613335, 20, 0, 2, 33.333336 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -2590,8 +2590,8 @@ static void test_height(const testCtx *const p_ctx) { /*316*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, 4.8, "12345678901234567890", "", ZINT_WARN_NONCOMPLIANT, 4.8000002, 3, 129, 258, 9.6000004, "" }, /*317*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, 4.9, "12345678901234567890", "", 0, 4.9000001, 3, 129, 258, 9.8000002, "" }, /*318*/ { BARCODE_USPS_IMAIL, -1, 7.7, "12345678901234567890", "", 0, 7.6999998, 3, 129, 258, 15.4, "" }, - /*319*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, 7.7, "12345678901234567890", "", 0, 7.7000003, 3, 129, 258, 15.400001, "" }, - /*320*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, 7.8, "12345678901234567890", "", ZINT_WARN_NONCOMPLIANT, 7.7999997, 3, 129, 258, 15.599999, "" }, + /*319*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, 7.7, "12345678901234567890", "", 0, 7.69999981, 3, 129, 258, 15.3999996, "" }, + /*320*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, 7.8, "12345678901234567890", "", ZINT_WARN_NONCOMPLIANT, 7.80000019, 3, 129, 258, 15.6000004, "" }, /*321*/ { BARCODE_PLESSEY, -1, 1, "1234567890", "", 0, 1, 1, 227, 454, 2, "" }, /*322*/ { BARCODE_PLESSEY, COMPLIANT_HEIGHT, 1, "1234567890", "", 0, 1, 1, 227, 454, 2, "TODO: Find doc" }, /*323*/ { BARCODE_PLESSEY, -1, 4, "1234567890", "", 0, 4, 1, 227, 454, 8, "" }, diff --git a/backend/upcean.c b/backend/upcean.c index 67beb0f9..627d66c4 100644 --- a/backend/upcean.c +++ b/backend/upcean.c @@ -1,7 +1,7 @@ /* upcean.c - Handles UPC, EAN and ISBN */ /* libzint - the open source barcode library - Copyright (C) 2008-2022 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -135,7 +135,7 @@ static int upca_cc(struct zint_symbol *symbol, const unsigned char source[], int if (symbol->output_options & COMPLIANT_HEIGHT) { /* BS EN 797:1996 4.5.1 Nominal dimensions 22.85mm / 0.33mm (X) ~ 69.24, same as minimum GS1 General Specifications 21.0.1 5.12.3.1 */ - const float height = stripf(22.85f / 0.33f); + const float height = 69.242424f; /* 22.85 / 0.33 */ if (symbol->symbology == BARCODE_UPCA_CC) { symbol->height = height; /* Pass back min row == default height */ } else { @@ -307,7 +307,7 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt if (symbol->output_options & COMPLIANT_HEIGHT) { /* BS EN 797:1996 4.5.1 Nominal dimensions 22.85mm / 0.33mm (X) ~ 69.24, same as minimum GS1 General Specifications 21.0.1 5.12.3.1 */ - const float height = stripf(22.85f / 0.33f); + const float height = 69.242424f; /* 22.85 / 0.33 */ if (symbol->symbology == BARCODE_UPCE_CC) { symbol->height = height; /* Pass back min row == default height */ } else { @@ -443,7 +443,7 @@ static int ean13_cc(struct zint_symbol *symbol, const unsigned char source[], in if (symbol->output_options & COMPLIANT_HEIGHT) { /* BS EN 797:1996 4.5.1 Nominal dimensions 22.85mm / 0.33mm (X) ~ 69.24, same as minimum GS1 General Specifications 21.0.1 5.12.3.1 */ - const float height = stripf(22.85f / 0.33f); + const float height = 69.242424f; /* 22.85 / 0.33 */ if (symbol->symbology == BARCODE_EANX_CC) { symbol->height = height; /* Pass back min row == default height */ } else { @@ -492,7 +492,7 @@ static int ean8_cc(struct zint_symbol *symbol, const unsigned char source[], int if (symbol->output_options & COMPLIANT_HEIGHT) { /* BS EN 797:1996 4.5.1 Nominal dimensions 18.23mm / 0.33mm (X) ~ 55.24, same as minimum GS1 General Specifications 21.0.1 5.12.3.1 */ - const float height = stripf(18.23f / 0.33f); + const float height = 55.242424f; /* 18.23 / 0.33 */ if (symbol->symbology == BARCODE_EANX_CC) { symbol->height = height; /* Pass back min row == default height */ } else { @@ -817,7 +817,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int src ustrcpy(symbol->text, first_part); if (symbol->output_options & COMPLIANT_HEIGHT) { /* 21.9mm from GS1 General Specifications 5.2.6.6, Figure 5.2.6.6-6 */ - const float height = stripf(21.9f / 0.33f); /* 21.9mm / 0.33mm ~ 66.36 */ + const float height = 66.3636398f; /* 21.9 / 0.33 */ error_number = set_height(symbol, height, height, 0.0f, 0 /*no_errtxt*/); } else { (void) set_height(symbol, 0.0f, 50.0f, 0.0f, 1 /*no_errtxt*/); diff --git a/backend_qt/tests/test_qzint.cpp b/backend_qt/tests/test_qzint.cpp index af0bfe4d..25b5825b 100644 --- a/backend_qt/tests/test_qzint.cpp +++ b/backend_qt/tests/test_qzint.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2021-2023 by Robin Stuart * + * Copyright (C) 2021-2024 by Robin Stuart * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * diff --git a/docs/Makefile b/docs/Makefile index 71574388..58d1c9b8 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -167,11 +167,14 @@ $(OUT_TXT) : $(SOURCE) $(SOURCE_MAN_PAGE) $(INCLUDES_TXT) Makefile -V $(MAIN_FONT) -V $(MONO_FONT) -V $(CJK_FONT) \ $(TXT_OPTS) \ -o $(OUT_TXT) - # Indent Man Page sections in TOC, remove trailing spaces and echoed image tags + # Indent Man Page sections in TOC, remove trailing spaces, echoed image tags, tbl: hashes + # & clean up Table captions sed -i \ -e 's/^\(- [A-Z][A-Z ]*\)$$/ \1/' \ -e 's/ *$$//' \ -e '/^\[.*\]$$/{N;N;s/\[\(.*\)\]\n\n\1/[\1]/;p;d}' \ + -e 's/ *{#tbl:[^}]*}//' \ + -e 's/: Table\xC2\xA0: \([^:]*\):/Table : \1/' \ $(OUT_TXT) # Wrap sed -i '/.\{81\}/{s/.\{80\}/&\n/}' $(OUT_TXT) diff --git a/docs/README b/docs/README index c57fece3..d0788bda 100644 --- a/docs/README +++ b/docs/README @@ -2,8 +2,8 @@ For generation of "docs/manual.pdf" and "docs/manual.txt" from "manual.pmd" usin On Ubuntu/Debian (tested on Ubuntu 22.04) - wget https://github.com/jgm/pandoc/releases/download/3.1.11/pandoc-3.1.11-1-amd64.deb - sudo dpkg -i pandoc-3.1.11-1-amd64.deb + wget https://github.com/jgm/pandoc/releases/download/3.1.11.1/pandoc-3.1.11.1-1-amd64.deb + sudo dpkg -i pandoc-3.1.11.1-1-amd64.deb sudo apt install python3-pip pip install pandoc-tablenos --user export PATH=~/.local/bin:"$PATH" @@ -18,9 +18,9 @@ On Ubuntu/Debian (tested on Ubuntu 22.04) On Fedora (tested on Fedora Linux 38 (Workstation Edition)) - wget https://github.com/jgm/pandoc/releases/download/3.1.11/pandoc-3.1.11-linux-amd64.tar.gz - tar xf pandoc-3.1.11-linux-amd64.tar.gz - sudo mv -i pandoc-3.1.11/bin/pandoc /usr/local/bin + wget https://github.com/jgm/pandoc/releases/download/3.1.11.1/pandoc-3.1.11.1-linux-amd64.tar.gz + tar xf pandoc-3.1.11.1-linux-amd64.tar.gz + sudo mv -i pandoc-3.1.11.1/bin/pandoc /usr/local/bin sudo dnf install python3-pip pip install pandoc-tablenos --user export PATH=~/.local/bin:"$PATH" diff --git a/docs/manual.txt b/docs/manual.txt index 6217cad3..b134384d 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -593,7 +593,7 @@ meanings as given below: * Insert leading asterisks Any other character Interpreted literally - : Table : Sequence Format Characters: + Table : Sequence Format Characters Once you’re happy with the Sequence Data, click the "Export..." button to bring up the Export Dialog, discussed next. @@ -717,7 +717,7 @@ sequences are shown in the table below. is hexadecimal (000000-10FFFF) ---------------------------------------------------------------------------- - : Table : Escape Sequences: + Table : Escape Sequences (Special escape sequences are available for Code 128 only to manually switch Code Sets - see 6.1.10.1 Standard Code 128 (ISO 15417) for details.) @@ -761,7 +761,7 @@ The currently supported output file formats are shown in the following table. tif Tagged Image File Format txt Text file (see 4.19 Other Options) - : Table : Output File Formats: + Table : Output File Formats The filename can contain directories and sub-directories also, which will be created if they don’t already exist: @@ -999,7 +999,7 @@ underscores are optional. 146 BARCODE_BC412 IBM BC412 (SEMI T1-95) ------------------------------------------------------------------------------ - : Table : Barcode Types (Symbologies): + Table : Barcode Types (Symbologies) 4.4 Adjusting Height @@ -1206,7 +1206,7 @@ To summarize the more intricate details: Yes EMF 40 0.1 N/A ------------------------------------------------------------------- - : Table : Scaling Multipliers and Minima: + Table : Scaling Multipliers and Minima 4.9.1 Scaling by X-dimension and Resolution @@ -1325,7 +1325,7 @@ Latin-2 (ISO/IEC 8859-2 plus ASCII). UPNQR Latin-2 N/A All others ASCII N/A - : Table : Default Character Sets: + Table : Default Character Sets If Zint encounters characters which can not be encoded using the default character encoding then it will take advantage of the ECI (Extended Channel @@ -1375,7 +1375,7 @@ data. The symbologies that support ECI are DotCode MicroPDF417 Ultracode ------------- -------------- ----------- - : Table : ECI-Aware Symbologies: + Table : ECI-Aware Symbologies Be aware that not all barcode readers support ECI mode, so this can sometimes lead to unreadable barcodes. If you are using characters beyond those supported @@ -1422,7 +1422,7 @@ formatted. Zint automatically translates the data into the target encoding. 170 ISO/IEC 646 Invariant[6] 899 8-bit binary data - : Table : ECI Codes: + Table : ECI Codes An ECI value of 0 does not encode any ECI information in the code symbol (unless the data contains non-default character set characters). In this case, the @@ -1525,7 +1525,7 @@ characters in the output filename as shown in the table below: @ Insert a number or * (or + on Windows) Any other Insert literally - : Table : Batch Filename Formatting: + Table : Batch Filename Formatting For instance @@ -1541,7 +1541,7 @@ The following table shows some examples to clarify this method: -o my~~~bar.eps "my001bar.eps", "my002bar.eps", "my003bar.eps" -o t#es~t~.png "t es0t1.png", "t es0t2.png", "t es0t3.png" - : Table : Batch Filename Examples: + Table : Batch Filename Examples The special characters can span directories also, which is useful when creating a large number of barcodes: @@ -1551,7 +1551,7 @@ a large number of barcodes: -o dir~/file~~~.svg "dir0/file001.svg", "dir0/file002.svg", … , "dir0/file999.svg", "dir1/file000.svg", … - : Table : Batch Directory Examples: + Table : Batch Directory Examples For an alternative method of naming output files see the --mirror option in 4.14 Automatic Filenames below. @@ -2204,7 +2204,7 @@ the nature of the error. The errors generated by Zint are: ZINT_WARN_HRT_TRUNCATED occurs. ------------------------------------------------------------------------------ - : Table : API Warning and Error Return Values: + Table : API Warning and Error Return Values To catch errors use an integer variable as shown in the code below: @@ -2562,7 +2562,7 @@ see which are set. defined? ------------------------------------------------------------------------------ - : Table : API Capability Flags: + Table : API Capability Flags For example: @@ -2869,7 +2869,7 @@ below: 5 Modulo-11 (NCR) 6 Modulo-11 (NCR) & Modulo-10 - : Table : MSI Plessey Check Digit Options: + Table : MSI Plessey Check Digit Options To not show the check digit or digits in the Human Readable Text, add 10 to the --vers value. For example --vers=12 (API option_2 = 12) will add two hidden @@ -3114,7 +3114,7 @@ and is of the form: ----------------------------------------------------------------------- - : Table : DPD Input Fields: + Table : DPD Input Fields A warning will be generated if the Service Code, the Destination Country Code, or the last 10 characters of the Tracking Number are non-numeric. @@ -3230,7 +3230,7 @@ the table below: 7 000000 576688 8 0000000 7742862 - : Table : Channel Value Ranges: + Table : Channel Value Ranges 6.1.14 BC412 (SEMI T1-95) @@ -3463,7 +3463,7 @@ encoding methods. Valid values are shown below. Expanded Stacked component ---------------------------------------------------------------------------- - : Table : GS1 Composite Symbology Values: + Table : GS1 Composite Symbology Values The data to be encoded in the linear component of a composite symbol should be entered into a primary string with the data for the 2D component being entered @@ -3600,7 +3600,7 @@ shown in the following table. 23 99999999999999999999999 67-bar 62 N --------------------------------------------------------------- - : Table : Australia Post Input Formats: + Table : Australia Post Input Formats 6.5.1.2 Reply Paid Barcode @@ -3660,7 +3660,8 @@ the following table. ---------------------------------------------------------------------------- - : Table : Royal Mail 4-State Mailmark Input Fields: + Table : Royal Mail 4-State Mailmark Input Fields + The 6 Destination+DPS (Destination Post Code plus Delivery Point Suffix) patterns are: @@ -3670,7 +3671,8 @@ patterns are: FFNFNLLNL FNNLLNLSS FNNNLLNLS ----------- ----------- ----------- - : Table : Royal Mail Mailmark Destination+DPS Patterns: + Table : Royal Mail Mailmark Destination+DPS Patterns + where 'F' stands for full alphabetic (A-Z), 'L' for limited alphabetic (A-Z less 'CIKMOV'), 'N' for numeric (0-9), and 'S' for space. @@ -3757,7 +3759,7 @@ standards have now been removed from Zint. 9 26 x 26 19 88 x 88 29 16 x 36 10 32 x 32 20 96 x 96 30 16 x 48 - : Table : Data Matrix Sizes: + Table : Data Matrix Sizes The largest version 24 (144 x 144) can encode 3116 digits, around 2335 alphanumeric characters, or 1555 bytes of data. @@ -3781,7 +3783,7 @@ the following values as before: 38 12 x 88 47 26 x 48 39 16 x 64 48 26 x 64 - : Table : DMRE Sizes: + Table : DMRE Sizes DMRE symbol sizes may be activated in automatic size mode using the option --dmre (API option_3 = DM_DMRE). @@ -3828,7 +3830,7 @@ section, as summarized below. Reserved 6 Spaces Customer Data 6, 45 or 29 Anything (Latin-1) - : Table : Royal Mail 2D Mailmark Input Fields: + Table : Royal Mail 2D Mailmark Input Fields The 6 Destination+DPS (Destination Post Code plus Delivery Point Suffix) patterns are the same as for the 4-state - see Table @@ -3841,7 +3843,7 @@ i.e. FFNFNLL FNNLLSS FNNNLLS --------- --------- --------- - : Table : Royal Mail 2D Mailmark RTS Patterns: + Table : Royal Mail 2D Mailmark RTS Patterns where 'F' is full alphabetic (A-Z), 'L' limited alphabetic (A-Z less 'CIKMOV'), 'N' numeric (0-9), and 'S' space. @@ -3855,7 +3857,7 @@ optional customer data: Type 9 32 x 32 45 characters 10 Type 29 16 x 48 29 characters 30 - : Table : Royal Mail 2D Mailmark Sizes: + Table : Royal Mail 2D Mailmark Sizes Zint will automatically select a size based on the amount of customer data, or it can be specified using the --vers option (API option_2), which takes the Zint @@ -3882,7 +3884,7 @@ option_1) as shown in the following table. 3 Q Approx 55% of symbol Approx 25% 4 H Approx 65% of symbol Approx 30% - : Table : QR Code ECC Levels: + Table : QR Code ECC Levels The size of the symbol can be specified by setting the --vers option (API option_2) to the QR Code version required (1-40). The size of symbol generated @@ -3905,7 +3907,7 @@ is shown in the table below. 13 69 x 69 27 125 x 125 14 73 x 73 28 129 x 129 - : Table : QR Code Sizes: + Table : QR Code Sizes The maximum capacity of a QR Code symbol (version 40) is 7089 numeric digits, 4296 alphanumeric characters or 2953 bytes of data. QR Code symbols can also be @@ -3963,7 +3965,7 @@ that versions M1 and M2 have restrictions on what characters can be encoded. 4 M4 17 x 17 Latin-1 and Shift JIS ------------------------------------------------------------------ - : Table : Micro QR Code Sizes: + Table : Micro QR Code Sizes Version M4 can encode up to 35 digits, 21 alphanumerics, 15 bytes or 9 Kanji characters. @@ -3983,7 +3985,7 @@ not available for any version, and ECC level Q is only available for version M4: 3 Q Approx 55% of symbol Approx 25% M4 ---------------------------------------------------------------------- - : Table : Micro QR ECC Levels: + Table : Micro QR ECC Levels The defaults for symbol size and ECC level depend on the input and whether either of them is specified. @@ -4014,7 +4016,7 @@ valid for this type of symbol. 2 M Approx 37% of symbol Approx 15% 4 H Approx 65% of symbol Approx 30% - : Table : rMQR ECC Levels: + Table : rMQR ECC Levels The preferred symbol sizes can be selected using the --vers option (API option_2) as shown in the table below. Input values between 33 and 38 fix the @@ -4062,7 +4064,7 @@ height of the symbol while allowing Zint to determine the minimum symbol width. 19 R13x59 13 x 59 38 R17xW 17 x automatic width ------------------------------------------------------------------------------ - : Table : rMQR Sizes: + Table : rMQR Sizes The largest version R17x139 (32) can encode up to 361 digits, 219 alphanumerics, 150 bytes, or 92 Kanji characters. @@ -4113,7 +4115,7 @@ message required by Zint is given in the following table. 10 - 12 Three-digit country code according to ISO 3166-1. 13 - 15 Three-digit service code. This depends on your parcel courier. - : Table : MaxiCode Structured Carrier Message Format: + Table : MaxiCode Structured Carrier Message Format The primary message can be set at the command prompt using the --primary switch (API primary). The secondary message uses the normal data entry method. For @@ -4168,7 +4170,7 @@ Example maximum data lengths are given in the table below: 6 93 138 50 ------------------------------------------------------------------------ - : Table : MaxiCode Data Length Maxima: + Table : MaxiCode Data Length Maxima * - secondary only @@ -4212,7 +4214,7 @@ a smaller bullseye pattern at the centre of the symbol. 11 45 x 45 23 95 x 95 35 147 x 147 12 49 x 49 24 101 x 101 36 151 x 151 - : Table : Aztec Code Sizes: + Table : Aztec Code Sizes Note that in symbols which have a specified size the amount of error correction is dependent on the length of the data input and Zint will allow error @@ -4228,7 +4230,7 @@ the --secure option (API option_1) to a value from the following table. 3 >36% + 3 codewords 4 >50% + 3 codewords - : Table : Aztec Code Error Correction Modes: + Table : Aztec Code Error Correction Modes It is not possible to select both symbol size and error correction capacity for the same symbol. If both options are selected then the error correction capacity @@ -4288,7 +4290,7 @@ and variable-width versions (versions S and T). These can be selected by using 10 T width x 16 90 55 -------------------------------------------------------------- - : Table : Code One Sizes: + Table : Code One Sizes Version S symbols can only encode numeric data. The width of version S and version T symbols is determined by the length of the input data. @@ -4326,7 +4328,7 @@ using the --secure option (API option_1), according to the following tables. 6 78 x 78 13 162 x 162 7 90 x 90 - : Table : Grid Matrix Sizes: + Table : Grid Matrix Sizes Mode Error Correction Capacity ------ --------------------------- @@ -4336,7 +4338,7 @@ using the --secure option (API option_1), according to the following tables. 4 Approximately 40% 5 Approximately 50% - : Table : Grid Matrix Error Correction Modes: + Table : Grid Matrix Error Correction Modes Non-ASCII data density may be maximized by using the --fullmultibyte switch (API option_3 = ZINT_FULL_MULTIBYTE), but check that your barcode reader supports @@ -4414,7 +4416,7 @@ to a value between 1 and 84 according to the following table. 27 75 x 75 55 131 x 131 83 187 x 187 28 77 x 77 56 133 x 133 84 189 x 189 - : Table : Han Xin Sizes: + Table : Han Xin Sizes The largest version (84) can encode 7827 digits, 4350 ASCII characters, up to 2175 Chinese characters, or 3261 bytes, making it the most capacious of all the @@ -4431,7 +4433,7 @@ following table. 3 Approx 23% 4 Approx 30% - : Table : Han Xin Error Correction Modes: + Table : Han Xin Error Correction Modes Non-ASCII data density may be maximized by using the --fullmultibyte switch (API option_3 = ZINT_FULL_MULTIBYTE), but check that your barcode reader supports @@ -4461,7 +4463,7 @@ modes are supported. The amount of error correction can be set using the 5 EC4 Approx 25% 6 EC5 Approx 33% - : Table : Ultracode Error Correction Values: + Table : Ultracode Error Correction Values Zint does not currently implement data compression by default, but this can be initiated through the API by setting @@ -4505,7 +4507,7 @@ generated using the characters A-E as shown in the table below. D Used for Information Based Indicia (IBI) postage. E Used for customized mail with a USPS Intelligent Mail barcode. - : Table : Valid FIM Characters: + Table : Valid FIM Characters 6.7.2 Flattermarken @@ -4695,7 +4697,7 @@ reproduced here for reference. E SO RS . > N ^ n ~ F SI US / ? O _ o DEL - : Table : ASCII: + Table : ASCII A.2 Latin Alphabet No. 1 (ISO/IEC 8859-1) @@ -4724,7 +4726,7 @@ defined. E ® ¾ Î Þ î þ F ¯ ¿ Ï ß ï ÿ - : Table : ISO/IEC 8859-1: + Table : ISO/IEC 8859-1 Annex B. Qt Backend QZint diff --git a/docs/zint.1 b/docs/zint.1 index 0059004a..ce5b6eb3 100644 --- a/docs/zint.1 +++ b/docs/zint.1 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pandoc 3.1.11 +.\" Automatically generated by Pandoc 3.1.11.1 .\" .TH "ZINT" "1" "January 2024" "Version 2.13.0.9" "" .SH NAME diff --git a/frontend/main.c b/frontend/main.c index 82f64ccf..bae9efb1 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -1,7 +1,7 @@ /* main.c - Command line handling routines for Zint */ /* libzint - the open source barcode library - Copyright (C) 2008-2023 Robin Stuart + Copyright (C) 2008-2024 Robin Stuart This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ #ifndef _MSC_VER # include -# ifdef __NetBSD__ /* `getopt_long_only()` not available */ +# if defined(__NetBSD__) && !defined(getopt_long_only) /* `getopt_long_only()` not available */ # define getopt_long_only getopt_long # endif # include @@ -1817,13 +1817,11 @@ int main(int argc, char **argv) { return do_exit(ZINT_ERROR_INVALID_OPTION); } switch (val) { - case 90: rotate_angle = 90; - break; - case 180: rotate_angle = 180; - break; - case 270: rotate_angle = 270; - break; - case 0: rotate_angle = 0; + case 0: + case 90: + case 180: + case 270: + rotate_angle = val; break; default: fprintf(stderr,