From 29d761c79577118cf6ecc686842d60a9a7c23762 Mon Sep 17 00:00:00 2001 From: gitlost Date: Sun, 16 May 2021 16:34:42 +0100 Subject: [PATCH] MAXICODE: Rejig raster output to more closely match ISO 16023:2000 --- backend/raster.c | 453 +++++++---- backend/tests/data/emf/maxicode_#185.emf | Bin 26928 -> 26928 bytes backend/tests/data/png/maxicode_0.5.png | Bin 851 -> 925 bytes .../tests/data/png/maxicode_0.7_wsp3_box1.png | Bin 0 -> 1497 bytes .../tests/data/png/maxicode_1.4_bgfgalpha.png | Bin 0 -> 2822 bytes backend/tests/data/png/maxicode_2.1.png | Bin 0 -> 4286 bytes .../tests/data/print/bmp/maxicode_fig_2.bmp | Bin 12062 -> 11982 bytes .../tests/data/print/emf/maxicode_fig_2.emf | Bin 26928 -> 26928 bytes .../tests/data/print/eps/maxicode_fig_2.eps | 712 +++++++++--------- .../tests/data/print/gif/maxicode_fig_2.gif | Bin 4676 -> 5019 bytes .../tests/data/print/pcx/maxicode_fig_2.pcx | Bin 37178 -> 48740 bytes .../tests/data/print/png/maxicode_fig_2.png | Bin 1994 -> 2386 bytes .../tests/data/print/svg/maxicode_fig_2.svg | 712 +++++++++--------- .../tests/data/print/tif/maxicode_fig_2.tif | Bin 3944 -> 4266 bytes backend/tests/data/svg/maxicode_box2.svg | 384 ++++++++++ backend/tests/test_emf.c | 2 +- backend/tests/test_png.c | 5 +- backend/tests/test_raster.c | 51 +- backend/tests/test_svg.c | 1 + backend/tests/test_vector.c | 30 +- backend/vector.c | 47 +- docs/manual.txt | 77 +- frontend/main.c | 13 +- 23 files changed, 1557 insertions(+), 930 deletions(-) create mode 100644 backend/tests/data/png/maxicode_0.7_wsp3_box1.png create mode 100644 backend/tests/data/png/maxicode_1.4_bgfgalpha.png create mode 100644 backend/tests/data/png/maxicode_2.1.png create mode 100644 backend/tests/data/svg/maxicode_box2.svg diff --git a/backend/raster.c b/backend/raster.c index 511ce9f8..49ff13a9 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -31,30 +31,36 @@ */ /* vim: set ts=4 sw=4 et : */ +#include +#include #include + #ifdef _MSC_VER #include #include #include +/* ceilf, floorf, roundf not before MSVC++2013 (C++ 12.0) */ +#if _MSC_VER < 1800 +#define ceilf (float) ceil +#define floorf (float) floor +#define roundf(arg) (float) floor((arg) + 0.5f) +#endif /* For Visual C++ 6 suppress conversion from int to float warning */ #if _MSC_VER == 1200 #pragma warning(disable: 4244) #endif -#endif -#include -#include +#endif /* _MSC_VER */ + #include "common.h" #include "output.h" #include "zfiletypes.h" #include "font.h" /* Font for human readable text */ -#define SSET "0123456789ABCDEF" +#define DEFAULT_INK '1' +#define DEFAULT_PAPER '0' -#define DEFAULT_INK '1' -#define DEFAULT_PAPER '0' - -#define UPCEAN_TEXT 1 +#define UPCEAN_TEXT 1 #ifndef NO_PNG INTERNAL int png_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf); @@ -156,13 +162,15 @@ static int buffer_plot(struct zint_symbol *symbol, unsigned char *pixelbuf) { return 0; } -static int save_raster_image_to_file(struct zint_symbol *symbol, int image_height, int image_width, unsigned char *pixelbuf, int rotate_angle, int file_type) { +static int save_raster_image_to_file(struct zint_symbol *symbol, const int image_height, const int image_width, + unsigned char *pixelbuf, int rotate_angle, const int file_type) { int error_number; int row, column; unsigned char *rotated_pixbuf = pixelbuf; - assert(rotate_angle == 0 || rotate_angle == 90 || rotate_angle == 180 || rotate_angle == 270); /* Suppress clang-analyzer-core.UndefinedBinaryOperatorResult warning */ + /* Suppress clang-analyzer-core.UndefinedBinaryOperatorResult warning */ + assert(rotate_angle == 0 || rotate_angle == 90 || rotate_angle == 180 || rotate_angle == 270); switch (rotate_angle) { case 0: case 180: @@ -262,8 +270,17 @@ static int save_raster_image_to_file(struct zint_symbol *symbol, int image_heigh return error_number; } -static void draw_bar(unsigned char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height, char fill) { - /* Draw a rectangle */ +/* Helper to check point within bounds before setting */ +static void draw_pt(unsigned char *buf, const int buf_width, const int buf_height, + const int x, const int y, const int fill) { + if (x >= 0 && x < buf_width && y >= 0 && y < buf_height) { + buf[y * buf_width + x] = fill; + } +} + +/* Draw a rectangle */ +static void draw_bar(unsigned char *pixelbuf, const int xpos, const int xlen, const int ypos, const int ylen, + const int image_width, const int image_height, const char fill) { int i, j, png_ypos; png_ypos = image_height - ypos - ylen; @@ -277,50 +294,9 @@ static void draw_bar(unsigned char *pixelbuf, int xpos, int xlen, int ypos, int } } -static void draw_circle(unsigned char *pixelbuf, int image_width, int image_height, int x0, int y0, float radius, char fill) { - int x, y; - int radius_i = (int) radius; - - for (y = -radius_i; y <= radius_i; y++) { - for (x = -radius_i; x <= radius_i; x++) { - if ((x * x) + (y * y) <= (radius_i * radius_i)) { - if ((y + y0 >= 0) && (y + y0 < image_height) - && (x + x0 >= 0) && (x + x0 < image_width)) { - *(pixelbuf + ((y + y0) * image_width) + (x + x0)) = fill; - } - } - } - } -} - -static void draw_bullseye(unsigned char *pixelbuf, int image_width, int image_height, int xoffset, int yoffset, int scaler) { - /* Central bullseye in Maxicode symbols */ - float x = 14.5f * scaler; - float y = 15.0f * scaler; - - draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (4.571f * scaler) + 1.0f, DEFAULT_INK); - draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (3.779f * scaler) + 1.0f, DEFAULT_PAPER); - draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (2.988f * scaler) + 1.0f, DEFAULT_INK); - draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (2.196f * scaler) + 1.0f, DEFAULT_PAPER); - draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (1.394f * scaler) + 1.0f, DEFAULT_INK); - draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (0.602f * scaler) + 1.0f, DEFAULT_PAPER); -} - -static void draw_hexagon(unsigned char *pixelbuf, int image_width, unsigned char *scaled_hexagon, int hexagon_size, int xposn, int yposn) { - /* Put a hexagon into the pixel buffer */ - int i, j; - - for (i = 0; i < hexagon_size; i++) { - for (j = 0; j < hexagon_size; j++) { - if (scaled_hexagon[(i * hexagon_size) + j] == DEFAULT_INK) { - *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = DEFAULT_INK; - } - } - } -} - -static void draw_letter(unsigned char *pixelbuf, unsigned char letter, int xposn, int yposn, int textflags, int image_width, int image_height, int si) { - /* Put a letter into a position */ +/* Put a letter into a position */ +static void draw_letter(unsigned char *pixelbuf, const unsigned char letter, int xposn, const int yposn, + const int textflags, const int image_width, const int image_height, const int si) { int skip; skip = 0; @@ -440,7 +416,8 @@ static void draw_letter(unsigned char *pixelbuf, unsigned char letter, int xposn } /* Plot a string into the pixel buffer */ -static void draw_string(unsigned char *pixbuf, unsigned char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height, int si) { +static void draw_string(unsigned char *pixbuf, const unsigned char input_string[], const int xposn, const int yposn, + const int textflags, const int image_width, const int image_height, const int si) { int i, string_length, string_left_hand, letter_width, letter_gap; int half_si = si / 2, odd_si = si & 1, x_incr; @@ -476,98 +453,255 @@ static void draw_string(unsigned char *pixbuf, unsigned char input_string[], int } } -static void plot_hexline(unsigned char *scaled_hexagon, int hexagon_size, float start_x, float start_y, float end_x, float end_y) { - /* Draw a straight line from start to end */ - int i; - float inc_x, inc_y; +/* Draw disc using x² + y² <= r² */ +static void draw_circle(unsigned char *pixelbuf, const int image_width, const int image_height, + const int x0, const int y0, const float radius, const char fill) { + int x, y; + const int radius_i = (int) floorf(radius); + const int radius_squared = radius_i * radius_i; - inc_x = (end_x - start_x) / hexagon_size; - inc_y = (end_y - start_y) / hexagon_size; - - for (i = 0; i < hexagon_size; i++) { - float this_x = start_x + (i * inc_x); - float this_y = start_y + (i * inc_y); - if (((this_x >= 0) && (this_x < hexagon_size)) && ((this_y >= 0) && (this_y < hexagon_size))) { - scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = DEFAULT_INK; - } - } -} - -static void plot_hexagon(unsigned char *scaled_hexagon, int hexagon_size) { - /* Create a hexagon shape and fill it */ - int line, i; - - float x_offset[6]; - float y_offset[6]; - float start_x, start_y; - float end_x, end_y; - - x_offset[0] = 0.0f; - x_offset[1] = 0.86f; - x_offset[2] = 0.86f; - x_offset[3] = 0.0f; - x_offset[4] = -0.86f; - x_offset[5] = -0.86f; - - y_offset[0] = 1.0f; - y_offset[1] = 0.5f; - y_offset[2] = -0.5f; - y_offset[3] = -1.0f; - y_offset[4] = -0.5f; - y_offset[5] = 0.5f; - - /* Plot hexagon outline */ - for (line = 0; line < 5; line++) { - start_x = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * x_offset[line]); - start_y = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * y_offset[line]); - end_x = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * x_offset[line + 1]); - end_y = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * y_offset[line + 1]); - plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y); - } - start_x = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * x_offset[line]); - start_y = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * y_offset[line]); - end_x = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * x_offset[0]); - end_y = (hexagon_size / 2.0f) + ((hexagon_size / 2.0f) * y_offset[0]); - plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y); - - /* Fill hexagon */ - for (line = 0; line < hexagon_size; line++) { - char ink = DEFAULT_PAPER; - for (i = 0; i < hexagon_size; i++) { - if (scaled_hexagon[(hexagon_size * line) + i] == DEFAULT_INK) { - if (i < (hexagon_size / 2)) { - ink = DEFAULT_INK; - } else { - ink = DEFAULT_PAPER; + for (y = -radius_i; y <= radius_i; y++) { + const int y_squared = y * y; + for (x = -radius_i; x <= radius_i; x++) { + if ((x * x) + y_squared <= radius_squared) { + if ((y + y0 >= 0) && (y + y0 < image_height) + && (x + x0 >= 0) && (x + x0 < image_width)) { + *(pixelbuf + ((y + y0) * image_width) + (x + x0)) = fill; } } + } + } +} - if (ink == DEFAULT_INK) { - scaled_hexagon[(hexagon_size * line) + i] = ink; +/* Helper for `draw_wp_circle()` to draw horizontal filler lines within disc */ +static void draw_mp_circle_lines(unsigned char *pixelbuf, const int image_width, const int image_height, + const int x0, const int y0, const int x, const int y, const int fill) { + int i; + for (i = x0 - x; i <= x0 + x; i++) { + draw_pt(pixelbuf, image_width, image_height, i, y0 + y, fill); /* (-x, y) to (x, y) */ + draw_pt(pixelbuf, image_width, image_height, i, y0 - y, fill); /* (-x, -y) to (x, -y) */ + } + for (i = x0 - y; i <= x0 + y; i++) { + draw_pt(pixelbuf, image_width, image_height, i, y0 + x, fill); /* (-y, x) to (y, x) */ + draw_pt(pixelbuf, image_width, image_height, i, y0 - x, fill); /* (-y, -x) to (y, -x) */ + } +} + +/* Draw disc using Midpoint Circle Algorithm. Using this for MaxiCode rather than `draw_circle()` because it gives a + * flatter circumference with no single pixel peaks, similar to Figures J3 and J6 in ISO/IEC 16023:2000. + * Taken from https://rosettacode.org/wiki/Bitmap/Midpoint_circle_algorithm#C + * "Content is available under GNU Free Documentation License 1.2 unless otherwise noted." + * https://www.gnu.org/licenses/old-licenses/fdl-1.2.html */ +static void draw_mp_circle(unsigned char *pixelbuf, const int image_width, const int image_height, + const int x0, const int y0, const int r, const int fill) { + /* Using top RHS octant from (0, r) going clockwise, so fast direction is x (i.e. always incremented) */ + int f = 1 - r; + int ddF_x = 0; + int ddF_y = -2 * r; + int x = 0; + int y = r; + + draw_mp_circle_lines(pixelbuf, image_width, image_height, x0, y0, x, y, fill); + + while (x < y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x + 1; + draw_mp_circle_lines(pixelbuf, image_width, image_height, x0, y0, x, y, fill); + } +} + +/* Draw central bullseye finder in Maxicode symbols */ +static void draw_bullseye(unsigned char *pixelbuf, const int image_width, const int image_height, + const int hex_width, const int hex_height, const int hx_start, const int hx_end, + const int hex_image_height, const int xoffset, const int yoffset, const float scaler) { + + /* ISO/IEC 16023:2000 4.11.4 and 4.2.1.1 */ + + /* 14W right from leftmost centre = 14.5X */ + const int x = (int) floorf(14.5f * hex_width - hx_start + xoffset * scaler); + /* 16Y above bottom-most centre = halfway */ + const int y = (int) ceilf(hex_image_height / 2 + yoffset * scaler); + + const int r1 = (int) ceilf(hex_height / 2.0f); /* Inner diameter is hex_height (V) */ + /* Total finder diameter is 9X, so radial increment for 5 radii r2 to r6 is ((9X - r1) / 5) / 2 */ + int r_incr = ((hex_width * 9 - r1) / 5) / 2; + /* Fudge increment to lessen overlapping of finder with top/bottom of hexagons due to rounding errors */ + if (r_incr > hx_end) { + r_incr -= hx_end; + } + + draw_mp_circle(pixelbuf, image_width, image_height, x, y, r1 + r_incr * 5, DEFAULT_INK); + draw_mp_circle(pixelbuf, image_width, image_height, x, y, r1 + r_incr * 4, DEFAULT_PAPER); + draw_mp_circle(pixelbuf, image_width, image_height, x, y, r1 + r_incr * 3, DEFAULT_INK); + draw_mp_circle(pixelbuf, image_width, image_height, x, y, r1 + r_incr * 2, DEFAULT_PAPER); + draw_mp_circle(pixelbuf, image_width, image_height, x, y, r1 + r_incr, DEFAULT_INK); + draw_mp_circle(pixelbuf, image_width, image_height, x, y, r1, DEFAULT_PAPER); +} + +/* Put a hexagon into the pixel buffer */ +static void draw_hexagon(unsigned char *pixelbuf, const int image_width, const int image_height, + unsigned char *scaled_hexagon, const int hex_width, const int hex_height, const int xposn, + const int yposn) { + int i, j; + + for (i = 0; i < hex_height; i++) { + for (j = 0; j < hex_width; j++) { + if (scaled_hexagon[(i * hex_width) + j] == DEFAULT_INK) { + draw_pt(pixelbuf, image_width, image_height, xposn + j, yposn + i, DEFAULT_INK); } } } } -static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, int file_type) { - /* Plot a MaxiCode symbol with hexagons and bullseye */ - int row, column, xposn; +/* Bresenham's line algorithm https://en.wikipedia.org/wiki/Bresenham's_line_algorithm + * Creative Commons Attribution-ShareAlike License + * https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License */ +static void plot_hexline(unsigned char *scaled_hexagon, const int hex_width, const int hex_height, + int start_x, int start_y, const int end_x, const int end_y) { + const int dx = abs(end_x - start_x); + const int sx = start_x < end_x ? 1 : -1; + const int dy = -abs(end_y - start_y); + const int sy = start_y < end_y ? 1 : -1; + int e_xy = dx + dy; + + for (;;) { + int e2; + draw_pt(scaled_hexagon, hex_width, hex_height, start_x, start_y, DEFAULT_INK); + if (start_x == end_x && start_y == end_y) { + break; + } + e2 = 2 * e_xy; + if (e2 >= dy) { /* e_xy+e_x > 0 */ + e_xy += dy; + start_x += sx; + } + if (e2 <= dx) { /* e_xy+e_y < 0 */ + e_xy += dx; + start_y += sy; + } + } +} + +/* Create a hexagon shape and fill it */ +static void plot_hexagon(unsigned char *scaled_hexagon, const int hex_width, const int hex_height, + const int hx_start, const int hy_start, const int hx_end, const int hy_end) { + int line, i; + int not_top; + + const int hx_width = hex_width - hx_start - hx_end; + const int hy_height = hex_height - hx_start - hx_end; + + const int hx_width_odd = hx_width & 1; + const int hy_height_odd = hy_height & 1; + + const int hx_radius = hx_width / 2; + const int hy_radius = hy_height / 2; + + /* To ensure symmetry, draw top left quadrant first, then copy/flip to other quadrants */ + + int start_y = hy_start + (hy_radius + 1) / 2; + int end_x = hx_start + hx_radius; + if (hx_radius > 2 && (hx_radius < 10 || !hx_width_odd)) { + /* Line drawing matches examples in ISO/IEC 16023:2000 Annexe J if point just to the left of end midpoint */ + end_x--; + } + + /* Plot line of top left quadrant */ + plot_hexline(scaled_hexagon, hex_width, hex_height, hx_start, start_y, end_x, hy_start); + + /* Fill to right */ + not_top = 0; + for (line = hy_start; line < hy_start + hy_radius + hy_height_odd; line++) { + int first = -1; + for (i = hx_start; i < hx_start + hx_radius + hx_width_odd; i++) { + if (first != -1) { + scaled_hexagon[(hex_width * line) + i] = DEFAULT_INK; + not_top = 1; + } else if (scaled_hexagon[(hex_width * line) + i] == DEFAULT_INK) { + first = i + 1; + } + } + if (not_top && first == -1) { /* Fill empty lines at bottom */ + for (i = hx_start; i < hx_start + hx_radius + hx_width_odd; i++) { + scaled_hexagon[(hex_width * line) + i] = DEFAULT_INK; + } + } + } + + /* Copy left quadrant to right, flipping horizontally */ + for (line = hy_start; line < hy_start + hy_radius + hy_height_odd; line++) { + for (i = hx_start; i < hx_start + hx_radius + hx_width_odd; i++) { + if (scaled_hexagon[(hex_width * line) + i] == DEFAULT_INK) { + scaled_hexagon[(hex_width * line) + hex_width - hx_end - (i - hx_start + 1)] = DEFAULT_INK; + } + } + } + + /* Copy top to bottom, flipping vertically */ + for (line = hy_start; line < hy_start + hy_radius + hy_height_odd; line++) { + for (i = hx_start; i < hex_width; i++) { + if (scaled_hexagon[(hex_width * line) + i] == DEFAULT_INK) { + scaled_hexagon[(hex_width * (hex_height - hy_end - (line - hy_start + 1))) + i] = DEFAULT_INK; + } + } + } +} + +/* Plot a MaxiCode symbol with hexagons and bullseye */ +static int plot_raster_maxicode(struct zint_symbol *symbol, const int rotate_angle, const int file_type) { + int row, column; int image_height, image_width; unsigned char *pixelbuf; int error_number; int xoffset, yoffset, roffset, boffset; float scaler = symbol->scale; + int xoffset_scaled, yoffset_scaled; unsigned char *scaled_hexagon; - int hexagon_size; + int hex_width, hex_height; + int hx_start, hy_start, hx_end, hy_end; + int hex_image_width, hex_image_height; + int yposn_offset; - if (scaler < 0.5f) { - scaler = 0.5f; + const float two_div_sqrt3 = 1.1547f; /* 2 / √3 */ + const float sqrt3_div_two = 0.866f; /* √3 / 2 == 1.5 / √3 */ + + if (scaler < 0.2f) { + scaler = 0.2f; } + scaler *= 10.0f; output_set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); + xoffset_scaled = (int) floorf(xoffset * scaler); + yoffset_scaled = (int) floorf(yoffset * scaler); - image_width = ceil((double) (300 + 2 * (xoffset + roffset)) * scaler); - image_height = ceil((double) (300 + 2 * (yoffset + boffset)) * scaler); + hex_width = (int) roundf(scaler); /* Short diameter, X in ISO/IEC 16023:2000 Figure 8 (same as W) */ + hex_height = (int) roundf(scaler * two_div_sqrt3); /* Long diameter, V in Figure 8 */ + + /* Allow for whitespace around each hexagon (see ISO/IEC 16023:2000 Annexe J.4) + TODO: replace following kludge with proper calc of whitespace as per J.4 Steps 8 to 11 */ + hx_start = (int) (scaler < 3.5f ? 0.0f : ceilf(hex_width * 0.05f)); + hy_start = (int) ceilf(hex_height * 0.05f); + hx_end = (int) roundf((hex_width - hx_start) * 0.05f); + hy_end = (int) roundf((hex_height - hy_start) * 0.05f); + + /* The hexagons will be drawn within box (hex_width - hx_start - hx_end) x (hex_height - hy_start - hy_end) + and plotted starting at (-hx_start, -hy_start) */ + + hex_image_width = 30 * hex_width - hx_start - hx_end; + /* `yposn_offset` is vertical distance between rows, Y in Figure 8 */ + /* TODO: replace following kludge with proper calc of hex_width/hex_height/yposn_offset as per J.4 Steps 1 to 7 */ + yposn_offset = (int) (scaler > 10.0f ? floorf(sqrt3_div_two * hex_width) : roundf(sqrt3_div_two * hex_width)); + /* 32 rows drawn yposn_offset apart + final hexagon */ + hex_image_height = 32 * yposn_offset + hex_height - hy_start - hy_end; + + image_width = (int) ceilf(hex_image_width + (xoffset + roffset) * scaler); + image_height = (int) ceilf(hex_image_height + (yoffset + boffset) * scaler); if (!(pixelbuf = (unsigned char *) malloc((size_t) image_width * image_height))) { strcpy(symbol->errtxt, "655: Insufficient memory for pixel buffer"); @@ -575,50 +709,45 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, in } memset(pixelbuf, DEFAULT_PAPER, (size_t) image_width * image_height); - hexagon_size = ceil(scaler * 10); - - if (!(scaled_hexagon = (unsigned char *) malloc((size_t) hexagon_size * hexagon_size))) { + if (!(scaled_hexagon = (unsigned char *) malloc((size_t) hex_width * hex_height))) { strcpy(symbol->errtxt, "656: Insufficient memory for pixel buffer"); free(pixelbuf); return ZINT_ERROR_ENCODING_PROBLEM; } - memset(scaled_hexagon, DEFAULT_PAPER, (size_t) hexagon_size * hexagon_size); + memset(scaled_hexagon, DEFAULT_PAPER, (size_t) hex_width * hex_height); - plot_hexagon(scaled_hexagon, hexagon_size); + plot_hexagon(scaled_hexagon, hex_width, hex_height, hx_start, hy_start, hx_end, hy_end); for (row = 0; row < symbol->rows; row++) { - int yposn = row * 9; - for (column = 0; column < symbol->width; column++) { - xposn = column * 10; + const int odd_row = row & 1; /* Odd (reduced) row, even (full) row */ + const int yposn = row * yposn_offset + yoffset_scaled - hy_start; + const int xposn_offset = (odd_row ? hex_width / 2 : 0) + xoffset_scaled - hx_start; + for (column = 0; column < symbol->width - odd_row; column++) { + const int xposn = column * hex_width + xposn_offset; if (module_is_set(symbol, row, column)) { - if (row & 1) { - /* Odd (reduced) row */ - xposn += 5; - draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, (xposn + (2 * xoffset)) * scaler, (yposn + (2 * yoffset)) * scaler); - } else { - /* Even (full) row */ - draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, (xposn + (2 * xoffset)) * scaler, (yposn + (2 * yoffset)) * scaler); - } + draw_hexagon(pixelbuf, image_width, image_height, scaled_hexagon, hex_width, hex_height, xposn, yposn); } } } - draw_bullseye(pixelbuf, image_width, image_height, (2 * xoffset), (2 * yoffset), scaler * 10); - - // Virtual hexagon - //draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, ((14 * 10) + (2 * xoffset)) * scaler, ((16 * 9) + (2 * yoffset)) * scaler); + draw_bullseye(pixelbuf, image_width, image_height, hex_width, hex_height, hx_start, hx_end, hex_image_height, + xoffset, yoffset, scaler); if (symbol->border_width > 0) { + const int border_scaled = (int) floorf(symbol->border_width * scaler); if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { /* boundary bars */ - draw_bar(pixelbuf, 0, image_width, 0, symbol->border_width * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, 0, image_width, 300 + (symbol->border_width * 2), symbol->border_width * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, 0, image_width, 0, border_scaled, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, 0, image_width, hex_image_height + border_scaled, border_scaled, image_width, + image_height, DEFAULT_INK); } if (symbol->output_options & BARCODE_BOX) { /* side bars */ - draw_bar(pixelbuf, 0, symbol->border_width * 2, 0, image_height, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * 2), symbol->border_width * 2, 0, image_height, image_width, image_height, DEFAULT_INK); + const int whitesp_scaled = (int) floorf(symbol->whitespace_width * scaler); + draw_bar(pixelbuf, 0, border_scaled, 0, image_height, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, hex_image_width + border_scaled + whitesp_scaled * 2, border_scaled, 0, image_height, + image_width, image_height, DEFAULT_INK); } } @@ -627,10 +756,18 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, in if (rotate_angle || file_type != OUT_BUFFER || !(symbol->output_options & OUT_BUFFER_INTERMEDIATE)) { free(pixelbuf); } + if (error_number == 0) { + /* Check whether size is compliant */ + const float size_ratio = (float) hex_image_width / hex_image_height; + if (size_ratio < 24.82f / 26.69f || size_ratio > 27.93f / 23.71f) { + strcpy(symbol->errtxt, "663: Size not within the minimum/maximum ranges"); + error_number = ZINT_WARN_NONCOMPLIANT; + } + } return error_number; } -static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int file_type) { +static int plot_raster_dotty(struct zint_symbol *symbol, const int rotate_angle, const int file_type) { float scaler = 2 * symbol->scale; unsigned char *scaled_pixelbuf; int r, i; @@ -679,9 +816,9 @@ static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int f for (i = 0; i < symbol->width; i++) { if (module_is_set(symbol, r, i)) { draw_circle(scaled_pixelbuf, scale_width, scale_height, - (i + dotoffset + xoffset) * scaler + dotradius_scaled, - row_scaled, - dotradius_scaled, + (int) floorf((i + dotoffset + xoffset) * scaler + dotradius_scaled), + (int) floorf(row_scaled), + (int) floorf(dotradius_scaled), DEFAULT_INK); } } @@ -738,7 +875,7 @@ static void to_iso8859_1(const unsigned char source[], unsigned char preprocesse return; } -static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int file_type) { +static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angle, const int file_type) { int error_number; float large_bar_height; int textdone = 0; diff --git a/backend/tests/data/emf/maxicode_#185.emf b/backend/tests/data/emf/maxicode_#185.emf index 3c77c37c2df3fe4213397b9f0a2aebd664633457..4c2c5a1e02c6976078ea8f4a0becf4ca5f66a083 100644 GIT binary patch literal 26928 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 INB^h(U!avF(EtDd diff --git a/backend/tests/data/png/maxicode_0.5.png b/backend/tests/data/png/maxicode_0.5.png index 9fb5b4dfc8b6ff8f1bc688d44261a98e349ed368..0894d767387287fa9810a6e653b8e654e9a037a7 100644 GIT binary patch delta 919 zcmV;I18Dry2Au~XiBL{Q4GJ0x0000DNk~Le0001$0001m0RsR40BE`>mysbAe^N`%UG#i*6o1nop$(L9_qd7 zL2I#QkViw-4)4L>ltK5wx6feB{3j=z%nP6Zm^_^@%GlG}wk#MNckk^$>*4vWIzsTf z+?uhjU`Ffx&y#co;{c$#LUa&pSyGN))`>9r+ph6nsC}z*B}j`s(;^efe_sNp4Qa0R zswqZFImSl*BO9r2rbQkxv$x%s#Kr7N$=h=boEn$zXa!j zm4+r`UU27W4$}v~vdxuYZ+D!Y^_cXe*D_QXXYeOqKHS3DkiWH2&UsZ;?99ZIc}~Tu zYE|`^t47C`8CU;$xhwyke-5U<)NYM3rhc7M(>DxT%mD7cyNu7={61}%@s}?~YB4Ed z@;5TRWt_j=Cljrz@iJ3<`Iv+~rWT8^WyW8n?z1o)kos}0L*WyKp{F~XJtMizdM?Qw z7~h)jHhryTdVgJJbTmv?Ef~En6>)BM9)dm>JQ6C-hUxQLbeTS9f8H=kum>~p<365H z5gQq9HX`2?PG}!wSoPb#`2$;j&mR) zCz}`X=Ba+C)Hj@Se=448)qg}Uc|wg zby{;QnHcx_Zi*L;XV1{k?N{BJUqA8w)&AnWpP81Mns=>PQr`A+=2L4f<6Yv1=&wFw zyzS}8$wnG%885F<5|q~=_#s5NDEd2<^scTYPgfOAuw`kfZE)MT-Y_uh;eC0dUnBTK z2gARo@6tAGSt>5u^;}%xg9&HHd~w?$r?k_A)mi_{q3&b1 t?=1*vz>=r4vSbN0l*G?rNCU2iBL{Q4GJ0x0000DNk~Le0001%0001%0RsR400z(Fp^+gKe+WrL zK~zY`t(L)R<1i40C3Mg&et}@WMgrdWl>)hR!Hc!z&|CWgfxe2v-kVntBR-( z*_n~-+Uio=dUY7chaF2Z|NJ8%{L-@CuYK4AB$A_Tc0RQ8ncY4gPPc-8{&H=BOu7ni z@e7K$5sR2QSy_+6Z6h=|Wyb+uf0@skm~EA|&u>Ftgcu zR54j+PsDbkN*t~3=;BA@1B-+hZsWa+f!$<`I78 zX*Pd2|M@Kyiv=);!p-PM3BkYo`m%a|`|EoqAYr<4NG?IY8$; zI6-prta%j7=D3n+w0#L*R>;RR+U|}68NdZSf=L$XhCPZ~XQUl38{U_owY$wF5r%g+ zOh<+c;L;8rHn(ZwJjYY?L-hz3{a3nT& zS8U{}WjLP4h78~WcpTo6PemEwkrqdtC2FI`QHMxv^dK1pGJs3>fNEn^Z}a*6AVv^1 zriK`ysEmRb0ju+krEdE&sH!s9Kgai-+FL1# zQ-)=52{J4cJN2&8C3Gos&><{0J5_T7$=BEzxP1`(JRMYFLKGK2qceIeOfE|6f_>@c z_zxx`p>;-G2f-;qI@gVmIk@{lPbwP%Z!Y7DSsmtd;dbzOH=^n*G>$-KFzAu4Y z>-60x8Yy(sUxC;dQon)D^5n{1UJbXceq2l+LK(7IlT zP|WKPbls_7ffuNrvW>C)|aQQO1)Ehq-+nttEk9cQyWAGz)wLME>a^*F0#^2 z4q}Kx9l6>a+B6{%j_G^IiGf45Bo-wD(G!ce+Dvui=~G> zxgK^)y*=z4WQTGcvI5!Xd^V)R#nQZDB~Bjo^^ND8JFTAXlfs+&wUHqMxRBPxlhc=` zd5xDeuiM1N9J6T{pZLtbJ$0v{m!|D}<(u=pEo37=e#`|ux{L3p5$XXquLl%4ym&Vo zPp`ds)Dno5uuURikw)z<4{Sog2YVorCuzon4B+A}4|fszkf52M^4*Zgp<|$F-I?28 z5M{d*7Tg|v()Pwpv?GdtDNne`qeBL8anTiklgl1CX;OQnO}FTn)oF`%kM~8Jk literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/maxicode_1.4_bgfgalpha.png b/backend/tests/data/png/maxicode_1.4_bgfgalpha.png new file mode 100644 index 0000000000000000000000000000000000000000..6c902565d3c9d8be0698dcae4e916fa9499f8c99 GIT binary patch literal 2822 zcmV+h3;FbkP)XNr43=S_*%Zh&tK2=E3=l*^k(5OJ#foM&gXaLP>eOHBP$bQdKUOODdV{Zz z;<8ft*Al+Q;<78C_Jiv0#YGoT$E#XAO3SxC~af0oxZBg!!9!_gKCp}+b*vTAKlrg(x=g= z)#3B|d?HnX->Hx8q)3(2dZj+UPpnb9?bu(8+Kxth;plQvq_*%oHTHudwT0iQ@iMUX z>i)hor}X!#BeIlEpC21@xyIxwj>sx|{iXNjPZ{&BI3f=)qa>1!8U=1~1h-f` z@*4HN^V$n;@dMmq=}2hrTKL0>MOe!5lhLToXq57I^Qq-B80}R?dsY3*7>qW{es}=|#@T^D!78sWpuiFIAU*H^#6JSc*j*A8Rb!J zl5g8(g?duIutuRy)-UC3&-|KSlc~bOGLb4QEE7qj{4$ZSDl8MpvBEN=LR6dN+jeF@9h8(cxT{gw;a!F(q2}9P|biT`5p#dg5 ztxK}{XyqojnM;kcm=Gz-S^pe zK*63-dvj@Y@nXA)Psye1CI2TIjZVpy2V|~+{6TcepN877w&hU;$uG3lPb6R1)8;omi7J5(%}Kg5$fCm!jO-~|~JS;WxeyFP#D6d!34Wz#9CzDLxx zoLO>|>`d~(1U`cFt(?Vj^zVy>rp?Els@wwPDoo66&boclhlU6n>;W z5XUsCBcbp0y@<+4enE0rYF*ABrn|gkWs*XSv&4=J(`SbmaKmCa8X=-1+)BQz0>1n~ z_x2C?Kx|v^@yHP#Bwx@h0FUcZ7G*xPJgK$(l%pvJ>b)u;_=y%D<}>QEs0{logG zUSI1Z54#NNy+ETh?l!;62^l_^Ak}&{Jz@oAb%^?H5;DA1AoC470QeE>f7__vCPS0R z`cWL_-&Ur~oiiURl0lea-F ztVV%O-Oz2TWi@J{)q;JL`MDmoL>I6z|FjkbSG8f!1|RU0MWvEApXEU+c?DEf^64%w zjkGyD0LPi#<%BPrJz}~9S_l`38AEx>F2k1@)jt?T8AEwWroN0GU5^;00NCHcp7Le* z2IpQue@Fhw-c+9PW%GV#cEs4rUHSO>DX(Nyr%89KQOB`2o)mN!cJ4U7f|;|wTMv9`7&%QppN%Wj|O#P+8msc@?}sW zBRiv3XeUf^f>Tl^Wl(n`@gwXuqCzH>sV^HG?~wPmWD#seg%kRfI&svb3f z#r)~0Hp#nPmZ;n=3%=|$D%6c-LaBoqGHY+Fhi?g`j;o6~ozIc2u#%azuaww@RnuF} zmNO(WiwgZlB`We!b*R`M)}y5FtwJS!K1Zn&$*1>}45dzXIlX^nb~&se=kAqnVYNBp z%L*IA;`_4E-k{nX@?~0*7{JB~@|3vBsgihu(=(b0QZqJZVfCIlbWdmkUqIFVgjZ>$y;93Kj6mYE-~st5E@8egP%8c{M7? z15}{)qfIp^|HGu@Irx+Ljr=alsM3I~Se`Z8+o4vpC7Z8$J2)|Z_%ggGLY zRLs|xU8X9Nk1E%fT~;iU`zqIAJu1z!)u7UxUKJ|IA6B7~TxAt1$%~fj%U<$n4z^rh z_Pdn+%5;jV@ee& zkt!sO3QkG-u_;xkM5>S{ujDD2fiY25DU9Z&Zw6(R{D4?m<&4S?*0Z*N9E3M7@di{n(_o)SFn}kBugh>sot0 zc5`<&`pSsU!}^2UjA}%+Nj}=;st#=K#aY>I*SZdD?#0>J&f2=(TpB!+N=_}9E+!6O2 zTQbN`DG1VXo)fyG86}U}B;U5n==wmT)Xwo`bELLhdmb%AwuxyxLe~e{t5%jTXW z?fKI(WSazMzWl@XSGXoLms^+IDNMLq1601%(B<(ZPYaU!&e)Z2YMun(0$+zvYxx;p(QQ^EEjXJ^6iMzW_ z971AzXhK2K-f&)z#;V|G;7&5dAtc9#qQAmVa`BLYI}!$?eR(sU8sl*>cjS$e<3r{8 zM#O{~kEXdJ?+7@Kno$nbCi%8q<|$7bu=;sD9z_{@U*Fleg(pg7uLK{_D9VTEuvyvV YAM)``3hVR?1poj507*qoM6N<$f|jzSF8}}l literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/maxicode_2.1.png b/backend/tests/data/png/maxicode_2.1.png new file mode 100644 index 0000000000000000000000000000000000000000..2df2874e82682aa29f77eed76b2e8105d96d0ee8 GIT binary patch literal 4286 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 literal 0 HcmV?d00001 diff --git a/backend/tests/data/print/bmp/maxicode_fig_2.bmp b/backend/tests/data/print/bmp/maxicode_fig_2.bmp index 73ac378352911b1002f99275df903083e2c0ee36..2a045f6556cb59a789c9712728f715faa3032abc 100644 GIT binary patch literal 11982 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 a=B?u9<}nu+a5f|jXY#6gDvGH^!TH}XJt6S` literal 12062 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 U&E*B2jY;DfUgA2%-6He+4|GE^E&u=k diff --git a/backend/tests/data/print/emf/maxicode_fig_2.emf b/backend/tests/data/print/emf/maxicode_fig_2.emf index 9cc448775e8d80dece2cbbc9fbeb2187fbce370f..db5bb7b85edce1f2606f625ec855f76a85d0a819 100644 GIT binary patch literal 26928 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 literal 4676 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 G0029-^nuO* diff --git a/backend/tests/data/print/pcx/maxicode_fig_2.pcx b/backend/tests/data/print/pcx/maxicode_fig_2.pcx index fe4046ecfb0f9c2bdc6004689e3ee00a4d2e17c6..3f5440c79a36b0df8dbf980b0a5d771e48a78677 100644 GIT binary patch literal 48740 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 literal 37178 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 BX%7GZ diff --git a/backend/tests/data/print/png/maxicode_fig_2.png b/backend/tests/data/print/png/maxicode_fig_2.png index 8f862199582dc14a1e405c456a8fb3314502f5f5..6478704860287bfe85c53c8043df7ecfd40fab78 100644 GIT binary patch literal 2386 zcmV-Y39a^tP)2OBu^ z6_&sR3Qc2!Az%)<_3f^vv~mNx02Q>T?q^H&s#sq-=Zo%i@Xnnazlx6E54zB)+kffD zS?Mj?NN?|UhF<(0Ik8u+7+mF&*S^2La^>jiHi1>c^_BCJYr5@WnIdEnQgkKK z>yX9rnfQdglk1CD_&c>@)DEeG7t#*wjjT4^BVChnc_Cdp|30x1$R1k`nF=ptIqm*q zW|OLWF{y1}nIhy7(u27&v$XU`FYKM!j+NeGuzK>}2ifzf+RM>ueg9*WJ!1r7FUE$d zpOfqvliCcHDMBV8kzUjs(2Jz@WXE#AOHh_LnCNN}Ee6$#yNZr0v581P0j?B6ko+{RustrFrIo*4zNNwdf*KIi(BfyWd ze8khQB*3qw>HK6&3O@c?(-~VD_ z`bhd-~JZkcZlg*!ZJn3B!uG@W(kl(fZ;kaT*vg5tnu z$n%J@k`Rka)H?YwQGF7yVJU(Qp)dTYhO`|lQ-se6Ie78`#4K{`9=mAFk=`S!=os`A z(>!PP&?~(RysVN&XZFy?y^XxAQqX8uo530+uPleL^V5<;(%-J-43nUdq!R z9Mg-Zl+uMjIbvQna(xnmCtOj2s9_h}6&62S?Zi+FSCnpQ5C`X1_n3k@X9GK2Z34>_ zA(IeH70%C+IqXhO=!JaYLcW5pNXsF)iBkFElW}Uw01|$b8{mI^>dEim@1K0q# z!D{fMW_`8_N1p}$iD1nVVB(5HO^>JG?JD>(v|jk~iA$-pL!dDD>0lx~h;knWUk3)_ zr~d>K5dhZjmj%9(VQUeDkh%llQ~{`%SAl_9Jv7^a5wfq{J+*p&zhOGQ`{5+qFtIrzs{ zt=|&f#A{&h%%_=cqJ?7BDvD`gqSG>MJeedju@IlOu~JyHxBmfV?u8Z1h>+Y_D-jGK z$$h#e4AFq|n(j{C31he(}Gxn4;4xV7|RJd#xHlsSgvwnH%mFJo zFUg%MCPu(NVxW|cnTzeF7*DBm=djBiGyEZHG%-3;BY=ZA_qZ%9#`?Rkm^s{q#XMvU zOGJoS&02(nkeDM?D?)fE!A*3NaqXazlgxo87$Fp5WDNOR=d^G^Etjf+| zd}y}2tCv(Cs-j|WH(y%INa&v@7=P=sof$3n; z(Dv;^pG?>QmMKCeA=K}6LNE2t&n+19`MJk_uYc^s3p-Ozb2nZWI!H#O8e*xpuL~X6 zfollZG%3)94(#}L6IiAQ8H8ZJ*FCV&^tM`tM8&LnoMDfOnyBVg$5i*Y zM2beU>c8sVRQ31^63iJY>;v8P7pQbIHkk_$dSVb}6)65}ciL7Q;cuXI4^r|`M zFE$!BpO}p5Aa@g3rU-e25R3Gv4%QYIOdqI8$)il9*IhqjMh-?*WT*V;16t&+RN?lS zf%I{&Z|MALF(3N`!X~gx5i$wUqBuPEaH3q;dDD^j2drfrrg;y<6aWAK07*qoM6N<$ Ef^#R24*&oF literal 1994 zcmV;*2Q~PKP)#1#dpeXYoIpN>l|K)D;j2)8eoxJ- zEhdGPH~F(^Whv+?z|qlXFiv6BD1W+67DHEe0ozCj(tEymdQBJU9iU3+rQaFA|6(`- zGs3Zh^i$vNkD#2Ov3rAUBBZc}=mlcYT$oQhcY>kl@t&>bF-3>NAqz*REx#uTTWvLL z6l)HyEF9~ua!!)qIA{{=0k(~h0n=5OaV$2aYGf}4{ReLQn$z@pohT31x{QLdQIo) z&59x|F;1*J8mz3u;!=dDlX^KH`n|x`2|1uKLk(bNiDP)SF_|O1&Fkk)mYL0qvEwj1 zH_9?IjWH8;0^3N4&|5NE>~Y08Aid{~8Vq(~m+}pSUb@Pb&KF7)nA(!f14xS}9fMtZ>Sqj1fLMo*9#Y%lEByvU1$$X-6M@JH(C^hU)M%5dNUDO-nqHswi zQ1zlri0YNX8isXiFg*H+l&ruEnW&??t-wlp?2Q{&U=@eJO^;v+AvNg+Ub`oR+cfoL z&`fgAUqyCNE2QQ@=I}ri$%qO`jg*Ye{36KHR4}ZNiYqyo!3v5x=36r?!VI&9|KAp2 zrK5`j)Z-$onj|f&X&E+hipcj2mJxy-9cQm`b3zUSgpLArMzR-092J61L($J{9v&U7 z5r5)dCcU6_Gnz&`Vmtnm>hNz)FK89cVI8FiJ$j2U*Vc~G1dhKi!;T}7+%Ccj2MuR$ zSAVU*22OxGSW1YQ0-dn;l%sbT;nD@OaFz=!tz*0iICx?4NbjZN1 zuy^>>YLsCw1MWWBFZd9d5gvZD`|z!MIX#AHFS7>oozWUB^jXWW(6z0=d=Iz=(@riY z&OlSoZ6(eFZ-Rjv}@+5v1MA<3o$wGaoH{J!CGZFvO2 zNBIn%MMqSoiz82hWD|XsFwra<2dD(u0c;~7yhm}+v2Nw(I&T&2XZAc|Kk-%(HPOk0 zKA95n#^~p_f6rk|=l#jdiMLsu^Y0S;?_nDW;dw78y*xiZcbLrQ%Rqzm^4+QmL()!v z@HE~pd?DQ;4J9`F@UXN^He7cA+dv4-d*Qh^G`=~f^ge;m+xa#m24*(n^yj3m#4yh$ zrvBVMVA}}6B;`ys-Syq_4x1MT-Lg2-K$12=X$MIbUm10?lqdAO)lXZh2}858$e=v6;v^;HyKEqSuZZ>D@FjzyJ9lR zj(X+Xu3+ng@J2iug!2Uz;>@p+Xg~bk6TQ99UY)@Y;NqA*6i+?JFA0cCWHTFPr&5aj zxgEeZ5^@-xd)jNG2Kc=X`xZj4x!^g>?YP&b(ed*loy*JDI_|Y;to`&!r~LBuIP3wo zkr3Kz;|5sL73oDjRUCSrr}>di@O2Ux2~jkBezVlOL?>aEB#8FWZ@umSwv7;KCb*9v z^Goz{9&=kkuRZko8cF_2)hh{1tszQx`STaFxOF~iz|(gIb^zN*h;NF+YY!*(!ce9Y ciGTF-C$T{-k9%kK_W%F@07*qoM6N<$g6K-Q8UO$Q diff --git a/backend/tests/data/print/svg/maxicode_fig_2.svg b/backend/tests/data/print/svg/maxicode_fig_2.svg index c6fa7e7a..631f8dcb 100644 --- a/backend/tests/data/print/svg/maxicode_fig_2.svg +++ b/backend/tests/data/print/svg/maxicode_fig_2.svg @@ -1,366 +1,366 @@ - Zint Generated Symbol - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/tests/data/print/tif/maxicode_fig_2.tif b/backend/tests/data/print/tif/maxicode_fig_2.tif index d18f02eeb23e139f266f416e4a0c087af4e126fb..e7c505168ca206b973bfa61988cbb649098b187f 100644 GIT binary patch literal 4266 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 literal 3944 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 diff --git a/backend/tests/data/svg/maxicode_box2.svg b/backend/tests/data/svg/maxicode_box2.svg new file mode 100644 index 00000000..8f3d3098 --- /dev/null +++ b/backend/tests/data/svg/maxicode_box2.svg @@ -0,0 +1,384 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/tests/test_emf.c b/backend/tests/test_emf.c index 42313772..3216f385 100644 --- a/backend/tests/test_emf.c +++ b/backend/tests/test_emf.c @@ -69,7 +69,7 @@ static void test_print(int index, int generate, int debug) { /* 9*/ { BARCODE_CODE39, -1, -1, -1, -1, -1, "", "", 90, "123", "../data/emf/code39_rotate_90.emf", "" }, /* 10*/ { BARCODE_CODE39, -1, -1, -1, -1, -1, "", "", 180, "123", "../data/emf/code39_rotate_180.emf", "" }, /* 11*/ { BARCODE_CODE39, -1, -1, -1, -1, -1, "", "", 270, "123", "../data/emf/code39_rotate_270.emf", "" }, - /* 12*/ { BARCODE_MAXICODE, -1, -1, -1, -1, 20, "E0E0E0", "700070", 0, "THIS IS A 93 CHARACTER CODE SET A MESSAGE THAT FILLS A MODE 4, UNAPPENDED, MAXICODE SYMBOL...", "../data/emf/maxicode_#185.emf", "#185 Maxicode scaling" }, + /* 12*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, "E0E0E0", "700070", 0, "THIS IS A 93 CHARACTER CODE SET A MESSAGE THAT FILLS A MODE 4, UNAPPENDED, MAXICODE SYMBOL...", "../data/emf/maxicode_#185.emf", "#185 Maxicode scaling" }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_png.c b/backend/tests/test_png.c index f7b734eb..5fd8adb2 100644 --- a/backend/tests/test_png.c +++ b/backend/tests/test_png.c @@ -172,7 +172,10 @@ static void test_print(int index, int generate, int debug) { /* 36*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, 0, 0, "0000007F", "FF0000", "12345", "", "../data/png/ultra_fgalpha.png", "" }, /* 37*/ { BARCODE_ULTRA, -1, -1, -1, -1, -1, -1, -1, 0, 0, "0000007F", "", "12345", "", "../data/png/ultra_fgalpha_nobg.png", "" }, /* 38*/ { BARCODE_ULTRA, -1, -1, -1, -1, -1, -1, -1, 0, 0.5f, "", "", "1", "", "../data/png/ultra_odd.png", "" }, - /* 39*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, 0, 0.5f, "", "", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", "../data/png/maxicode_0.5.png", "" }, + /* 39*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, 0, 0.5f, "", "", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", "../data/png/maxicode_0.5.png", "6 dpmm, 150 dpi" }, + /* 40*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BOX, 3, -1, -1, -1, 0, 0.7f, "", "", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", "../data/png/maxicode_0.7_wsp3_box1.png", "8 dpmm, 200 dpi" }, + /* 41*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, 0, 1.4f, "1111117F", "EEEEEEEE", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", "../data/png/maxicode_1.4_bgfgalpha.png", "16 dpmm, 400 dpi" }, + /* 42*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, 0, 2.1f, "", "", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", "../data/png/maxicode_2.1.png", "24 dpmm, 600 dpi" }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index cd0012a5..7190bef5 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -179,7 +179,7 @@ static void test_buffer(int index, int generate, int debug) { /* 55*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58, 20 }, /* 56*/ { BARCODE_PDF417, "1234567890", "", 21, 7, 103, 206, 42 }, /* 57*/ { BARCODE_PDF417COMP, "1234567890", "", 21, 7, 69, 138, 42 }, - /* 58*/ { BARCODE_MAXICODE, "1234567890", "", 165, 33, 30, 300, 300 }, + /* 58*/ { BARCODE_MAXICODE, "1234567890", "", 165, 33, 30, 299, 298 }, /* 59*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42, 42 }, /* 60*/ { BARCODE_CODE128B, "1234567890", "", 50, 1, 145, 290, 116 }, /* 61*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, @@ -674,27 +674,34 @@ static void test_output_options(int index, int debug) { /* 41*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 43, 43, 0, 2, 2 }, /* 42*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 180, "A123", 0, 21, 21, 21, 43, 43, 1, 41, 1 }, /* 43*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 180, "A123", 0, 21, 21, 21, 43, 43, 0, 40, 2 }, - /* 44*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 45*/ { BARCODE_MAXICODE, -1, -1, -1, 270, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 46*/ { BARCODE_MAXICODE, -1, 5, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 47*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 300, 320, 1, 0, 0 }, - /* 48*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 300, 320, 0, 10, 0 }, - /* 49*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 320, 320, 1, 10, 0 }, - /* 50*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 1, 0, 14 }, - /* 51*/ { BARCODE_MAXICODE, 6, -1, -1, 0, "A123", 0, 165, 33, 30, 324, 300, 0, 0, 14 }, - /* 52*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 324, 320, 1, 10, 25 }, - /* 53*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 324, 320, 0, 10, 9 }, - /* 54*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 344, 320, 1, 10, 9 }, - /* 55*/ { BARCODE_MAXICODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, - /* 56*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 57*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 300, 300, 1, 0, 14 }, - /* 58*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 59*/ { BARCODE_ITF14, -1, -1, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 60*/ { BARCODE_ITF14, -1, -1, -1, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, - /* 61*/ { BARCODE_ITF14, -1, 0, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 62*/ { BARCODE_ITF14, -1, 0, BARCODE_BOX, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 }, - /* 63*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 64*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, + /* 44*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 299, 298, 0, 4, 4 }, + /* 45*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 4, 14 }, + /* 46*/ { BARCODE_MAXICODE, -1, -1, -1, 270, "A123", 0, 165, 33, 30, 298, 299, 1, 4, 4 }, + /* 47*/ { BARCODE_MAXICODE, -1, -1, -1, 270, "A123", 0, 165, 33, 30, 298, 299, 0, 4, 14 }, + /* 48*/ { BARCODE_MAXICODE, -1, 5, -1, 0, "A123", 0, 165, 33, 30, 299, 298, 0, 0, 0 }, + /* 49*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 299, 298 + 50 * 2, 1, 0, 0 }, + /* 50*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 299, 298 + 50 * 2, 0, 50, 0 }, + /* 51*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 299, 298 + 50 * 2, 0, 347, 50 }, + /* 52*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 299, 298 + 50 * 2, 1, 348, 50 }, + /* 53*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 299 + 50 * 2, 298 + 50 * 2, 1, 50, 0 }, + /* 54*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 299 + 50 * 2, 298 + 50 * 2, 0, 347, 50 }, + /* 55*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 0, 14 }, + /* 56*/ { BARCODE_MAXICODE, 6, -1, -1, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298, 0, 0, 14 }, + /* 57*/ { BARCODE_MAXICODE, 6, -1, -1, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298, 0, 0, 47 }, + /* 58*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298 + 50 * 2, 1, 0, 47 }, + /* 59*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 299 + 60 * 2, 298 + 50 * 2, 0, 50, 0 }, + /* 60*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 299 + (60 + 50) * 2, 298 + 50 * 2, 1, 50, 0 }, + /* 61*/ { BARCODE_MAXICODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, + /* 62*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 299, 298, 0, 4, 4 }, + /* 63*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 299, 298, 1, 4, 14 }, + /* 64*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, "A123", 0, 165, 33, 30, 298, 299, 1, 4, 4 }, + /* 65*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, "A123", 0, 165, 33, 30, 298, 299, 0, 4, 14 }, + /* 66*/ { BARCODE_ITF14, -1, -1, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 67*/ { BARCODE_ITF14, -1, -1, -1, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, + /* 68*/ { BARCODE_ITF14, -1, 0, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 69*/ { BARCODE_ITF14, -1, 0, BARCODE_BOX, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 }, + /* 70*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 71*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_svg.c b/backend/tests/test_svg.c index 478c6e6f..6f1bd35c 100644 --- a/backend/tests/test_svg.c +++ b/backend/tests/test_svg.c @@ -90,6 +90,7 @@ static void test_print(int index, int generate, int debug) { /* 30*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, "12", "", "../data/svg/ean2.svg" }, /* 31*/ { BARCODE_CODE39, -1, -1, SMALL_TEXT, -1, -1, -1, "123", "", "../data/svg/code39_small.svg" }, /* 32*/ { BARCODE_POSTNET, -1, -1, -1, -1, -1, -1, "12345", "", "../data/svg/postnet_zip.svg" }, + /* 33*/ { BARCODE_MAXICODE, -1, 2, BARCODE_BOX, -1, -1, -1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", "../data/svg/maxicode_box2.svg" }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index 30c5b220..5c1c1243 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -31,7 +31,7 @@ #include "testcommon.h" -static struct zint_vector_rect *find_rect(struct zint_symbol *symbol, int x, int y, int height, int width) { +static struct zint_vector_rect *find_rect(struct zint_symbol *symbol, float x, float y, float height, float width) { struct zint_vector_rect *rect; if (symbol->vector == NULL) { @@ -196,7 +196,7 @@ static void test_buffer_vector(int index, int generate, int debug) { /* 55*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58, 20 }, /* 56*/ { BARCODE_PDF417, "1234567890", "", 21, 7, 103, 206, 42 }, /* 57*/ { BARCODE_PDF417COMP, "1234567890", "", 21, 7, 69, 138, 42 }, - /* 58*/ { BARCODE_MAXICODE, "1234567890", "", 165, 33, 30, 74, 72 }, + /* 58*/ { BARCODE_MAXICODE, "1234567890", "", 165, 33, 30, 60, 57.733398 }, /* 59*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42, 42 }, /* 60*/ { BARCODE_CODE128B, "1234567890", "", 50, 1, 145, 290, 118.9 }, /* 61*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, @@ -603,8 +603,8 @@ static void test_output_options(int index, int debug) { float expected_vector_width; float expected_vector_height; int expected_set; - int expected_set_row; - int expected_set_col; + float expected_set_row; + float expected_set_col; }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { @@ -634,15 +634,15 @@ static void test_output_options(int index, int debug) { /* 23*/ { BARCODE_QRCODE, -1, 4, BARCODE_BIND | BARCODE_DOTTY_MODE, "A123", 0, 21, 21, 21, 42, 58, 1, 0, 50 }, /* 24*/ { BARCODE_QRCODE, -1, 4, BARCODE_BIND | BARCODE_DOTTY_MODE, "A123", 0, 21, 21, 21, 42, 58, 0, 54, 0 }, /* 25*/ { BARCODE_QRCODE, 1, 4, BARCODE_BOX | BARCODE_DOTTY_MODE, "A123", 0, 21, 21, 21, 62, 58, 1, 54, 0 }, - /* 26*/ { BARCODE_MAXICODE, -1, -1, -1, "A123", 0, 165, 33, 30, 74, 72, 0, 0, 82 }, - /* 27*/ { BARCODE_MAXICODE, -1, 5, -1, "A123", 0, 165, 33, 30, 74, 72, 0, 0, 82 }, - /* 28*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 74, 92, 1, 0, 82 }, - /* 29*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 74, 92, 0, 84, 0 }, - /* 30*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, "A123", 0, 165, 33, 30, 94, 92, 1, 84, 0 }, - /* 31*/ { BARCODE_MAXICODE, -1, -1, -1, "A123", 0, 165, 33, 30, 74, 72, 0, 0, 82 }, - /* 32*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 98, 92, 1, 0, 82 }, - /* 33*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 98, 92, 0, 108, 0 }, - /* 34*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BOX, "A123", 0, 165, 33, 30, 118, 92, 1, 108, 0 }, + /* 26*/ { BARCODE_MAXICODE, -1, -1, -1, "A123", 0, 165, 33, 30, 60, 57.733398, 0, 0, 67.7334 }, + /* 27*/ { BARCODE_MAXICODE, -1, 5, -1, "A123", 0, 165, 33, 30, 60, 57.733398, 0, 0, 67.7334 }, + /* 28*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 60, 77.733398, 1, 0, 67.7334 }, + /* 29*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 60, 77.733398, 0, 70, 0 }, + /* 30*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, "A123", 0, 165, 33, 30, 80, 77.733398, 1, 70, 0 }, + /* 31*/ { BARCODE_MAXICODE, -1, -1, -1, "A123", 0, 165, 33, 30, 60, 57.733398, 0, 0, 67.7334 }, + /* 32*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 84, 77.733398, 1, 0, 67.7334 }, + /* 33*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, "A123", 0, 165, 33, 30, 84, 77.733398, 0, 94, 0 }, + /* 34*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BOX, "A123", 0, 165, 33, 30, 104, 77.733398, 1, 94, 0 }, /* 35*/ { BARCODE_MAXICODE, -1, -1, BARCODE_DOTTY_MODE, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, /* 36*/ { BARCODE_ITF14, -1, -1, -1, "123", 0, 50, 1, 135, 330, 138.89999, 1, 320, 0 }, /* 37*/ { BARCODE_ITF14, -1, 0, -1, "123", 0, 50, 1, 135, 330, 138.89999, 1, 320, 0 }, @@ -693,9 +693,9 @@ static void test_output_options(int index, int debug) { if (data[i].expected_set != -1) { rect = find_rect(symbol, data[i].expected_set_row, data[i].expected_set_col, 0, 0); if (data[i].expected_set) { - assert_nonnull(rect, "i:%d (%d) find_rect(%d, %d, 0, 0) NULL\n", i, data[i].symbology, data[i].expected_set_row, data[i].expected_set_col); + assert_nonnull(rect, "i:%d (%d) find_rect(%g, %g, 0, 0) NULL\n", i, data[i].symbology, data[i].expected_set_row, data[i].expected_set_col); } else { - assert_null(rect, "i:%d (%d) find_rect(%d, %d, 0, 0) not NULL\n", i, data[i].symbology, data[i].expected_set_row, data[i].expected_set_col); + assert_null(rect, "i:%d (%d) find_rect(%g, %g, 0, 0) not NULL\n", i, data[i].symbology, data[i].expected_set_row, data[i].expected_set_col); } } } diff --git a/backend/vector.c b/backend/vector.c index 00ff740c..06d7de38 100644 --- a/backend/vector.c +++ b/backend/vector.c @@ -496,31 +496,50 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ // Plot Maxicode symbols if (symbol->symbology == BARCODE_MAXICODE) { struct zint_vector_circle *circle; - float hex_diameter = (float) (symbol->dot_size * 5.0 / 4.0); // Ugly kludge for legacy support - vector->width = 37.0f + (xoffset + roffset); - vector->height = 36.0f + (yoffset + boffset); + float bull_x, bull_y, bull_d_incr; + const float two_div_sqrt3 = 1.1547f; /* 2 / √3 */ + const float sqrt3_div_two = 0.866f; /* √3 / 2 == 1.5 / √3 */ - // Bullseye - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 10.85f, 0); + /* `hex_diameter` is short diameter, X in ISO/IEC 16023:2000 Figure 8 (same as W) */ + const float hex_diameter = 1.0f; + const float hex_radius = hex_diameter / 2.0f; + const float hex_ydiameter = two_div_sqrt3 * hex_diameter; /* Long diameter, V in Figure 8 */ + const float hex_yradius = hex_ydiameter / 2.0f; + const float yposn_offset = sqrt3_div_two * hex_diameter; /* Vertical distance between rows, Y in Figure 8 */ + + vector->width = 30 * hex_diameter + (xoffset + roffset); + /* 32 rows drawn yposn_offset apart + final hexagon */ + vector->height = 32 * yposn_offset + hex_ydiameter + (yoffset + boffset); + + // Bullseye (ISO/IEC 16023:2000 4.2.1.1 and 4.11.4) + bull_x = 14.5f * hex_diameter + xoffset; /* 14W right from leftmost centre = 14.5X */ + bull_y = vector->height / 2.0f; /* 16Y above bottom-most centre = halfway */ + /* Total finder diameter is 9X, so diametric increment for 5 diameters d2 to d6 is (9X - d1) / 5 */ + bull_d_incr = (hex_diameter * 9 - hex_ydiameter) / 5.0f; + + // TODO: Add width to circle so can draw rings instead of overlaying circles + circle = vector_plot_create_circle(bull_x, bull_y, hex_ydiameter + bull_d_incr * 5, 0); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 8.97f, 1); + circle = vector_plot_create_circle(bull_x, bull_y, hex_ydiameter + bull_d_incr * 4, 1); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 7.10f, 0); + circle = vector_plot_create_circle(bull_x, bull_y, hex_ydiameter + bull_d_incr * 3, 0); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 5.22f, 1); + circle = vector_plot_create_circle(bull_x, bull_y, hex_ydiameter + bull_d_incr * 2, 1); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 3.31f, 0); + circle = vector_plot_create_circle(bull_x, bull_y, hex_ydiameter + bull_d_incr, 0); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 1.43f, 1); + circle = vector_plot_create_circle(bull_x, bull_y, hex_ydiameter, 1); vector_plot_add_circle(symbol, circle, &last_circle); /* Hexagons */ for (r = 0; r < symbol->rows; r++) { - for (i = 0; i < symbol->width; i++) { + const int odd_row = r & 1; /* Odd (reduced) row, even (full) row */ + const float yposn = r * yposn_offset + hex_yradius + yoffset; + const float xposn_offset = (odd_row ? hex_diameter : hex_radius) + xoffset; + for (i = 0; i < symbol->width - odd_row; i++) { if (module_is_set(symbol, r, i)) { - //struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 0.88) + ((r & 1) ? 1.76 : 1.32)), ((r * 0.76) + 0.76), hex_diameter); - struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23f) + 0.615f + ((r & 1) ? 0.615f : 0.0f)) + xoffset, - ((r * 1.067f) + 0.715f) + yoffset, hex_diameter); + const float xposn = i * hex_diameter + xposn_offset; + struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(xposn, yposn, hex_diameter); vector_plot_add_hexagon(symbol, hexagon, &last_hexagon); } } diff --git a/docs/manual.txt b/docs/manual.txt index 2ff4a14b..8bdb0e47 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -461,8 +461,74 @@ followed by the angle of rotation as shown below. 4.9 Adjusting image size ------------------------ The scale of the image can be altered using the --scale= option followed by a -multiple of the default X-dimension. The default X-dimension is 2 pixels. For -example for PNG images a scale of 5 will increase the X-dimension to 10 pixels. +multiple of the default X-dimension. The scale is multiplied by 2 before being +applied. The default scale is 1. + +For raster output, the default X-dimension is 2 pixels (except for MaxiCode, see +4.9.2 below, and dotty mode, see 4.14). For example for PNG images a scale of 5 +will increase the X-dimension to 10 pixels. Scales should be given in increments +of 0.5, i.e. 0.5, 1, 1.5, 2, 2.5, 3, 3.5, etc., to avoid the X-dimension +varying across the symbol due to interpolation. 0.5 increments are also faster +to render. + +The minimum scale for non-dotty raster output is 0.5, giving a minimum +X-dimension of 1 pixel, and text will not be printed for scales less than 1. + +The minimum scale for vector output is 0.1, giving a minimum X-dimension of 0.2. + +4.9.1 Scaling example +--------------------- +The GS1 General Specifications Section 5.2.6.6 "Symbol dimensions at nominal +size" gives an example of an EAN-13 barcode using the X-dimension of 0.33mm. +To print that example as a PNG at 12 dots per mm (dpmm), the equivalent of 300 +dots per inch (dpi = dpmm * 25.4), specify a scale of 2, since 0.33 * 12 = 3.96 +pixels, or 4 pixels rounding to the nearest pixel: + +zint -b EANX -d "501234567890" --height 69 --scale 2 + +This will result in output of 38.27mm x 26.08mm (WxH) at 300 dpi. The following +table shows the scale to use (in 0.5 increments) depending on the dpmm desired, +for a target X-dimension of 0.33mm: + +------------------- +dpmm | dpi | scale +------------------- + 6 | 150 | 1 + 8 | 200 | 1.5 + 12 | 300 | 2 + 16 | 400 | 3 + 24 | 600 | 4 + 47 | 1200 | 8 + 95 | 2400 | 15.5 +189 | 4800 | 31 +------------------- + +4.9.2 MaxiCode raster scaling +----------------------------- +For MaxiCode symbols, which use hexagons, the scale for raster output is +multiplied by 10 before being applied. The minimum scale is 0.2, so the minimum +X-dimension is 2 pixels. + +MaxiCode symbols have fixed size ranges of 24.82mm to 27.93mm in width, and +23.71mm to 26.69mm in height, excluding quiet zones. The following table shows +the scale to use depending on the dpmm desired, with dpi equivalents: + +------------------- +dpmm | dpi | scale +------------------- + 6 | 150 | 0.5 + 8 | 200 | 0.7 + 12 | 300 | 1 + 16 | 400 | 1.4 + 24 | 600 | 2.1 + 47 | 1200 | 4.1 + 95 | 2400 | 8.2 +189 | 4800 | 16.4 +------------------- + +Note that the 0.5 increment recommended for normal raster output does not apply. +Scales below 0.5 are not recommended and may produce symbols that are not within +the minimum/maximum size ranges. 4.10 Input modes ---------------- @@ -694,7 +760,9 @@ Matrix codes can be rendered as a series of dots or circles rather than the normal squares by using the --dotty option. This option is only available for matrix symbologies, and is automatically selected for DotCode. The size of the dots can be adjusted using the --dotsize= option followed by the radius -of the dot, where that radius is given as a multiple of the X-dimension. +of the dot, where that radius is given as a multiple of the X-dimension. The +minimum dot size is 0.01, the maximum is 20. The default and minimum scale for +raster output in dotty mode is 2. 4.15 Help options ----------------- @@ -2418,6 +2486,9 @@ Mode | Maximum Data Length | Maximum Data Length | Number of Error ----------------------------------------------------------------------------- * - secondary only +MaxiCode uses a different scaling than other symbols for raster output, see +4.9.2. + 6.6.7 Aztec Code (ISO 24778) ---------------------------- Invented by Andrew Longacre at Welch Allyn Inc in 1995 the Aztec Code symbol is diff --git a/frontend/main.c b/frontend/main.c index c25f8b56..e2507b3f 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -1288,8 +1288,11 @@ int main(int argc, char **argv) { strcpy(filetype, no_png ? "gif" : "png"); } } - if (my_symbol->scale < 0.5f && is_raster(filetype, no_png)) { - fprintf(stderr, "Warning 145: Scaling less than 0.5 will be set to 0.5 for '%s' output\n", filetype); + if (((my_symbol->symbology != BARCODE_MAXICODE && my_symbol->scale < 0.5f) || my_symbol->scale < 0.2f) + && is_raster(filetype, no_png)) { + const int min = my_symbol->symbology != BARCODE_MAXICODE ? 5 : 2; + fprintf(stderr, "Warning 145: Scaling less than 0.%d will be set to 0.%d for '%s' output\n", min, min, + filetype); fflush(stderr); } error_number = batch_process(my_symbol, arg_opts[0].arg, mirror_mode, filetype, rotate_angle); @@ -1301,8 +1304,10 @@ int main(int argc, char **argv) { if (filetype[0] != '\0') { set_extension(my_symbol->outfile, filetype); } - if (my_symbol->scale < 0.5f && is_raster(get_extension(my_symbol->outfile), no_png)) { - fprintf(stderr, "Warning 146: Scaling less than 0.5 will be set to 0.5 for '%s' output\n", + if (((my_symbol->symbology != BARCODE_MAXICODE && my_symbol->scale < 0.5f) || my_symbol->scale < 0.2f) + && is_raster(get_extension(my_symbol->outfile), no_png)) { + const int min = my_symbol->symbology != BARCODE_MAXICODE ? 5 : 2; + fprintf(stderr, "Warning 146: Scaling less than 0.%d will be set to 0.%d for '%s' output\n", min, min, get_extension(my_symbol->outfile)); fflush(stderr); }