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 3c77c37c..4c2c5a1e 100644 Binary files a/backend/tests/data/emf/maxicode_#185.emf and b/backend/tests/data/emf/maxicode_#185.emf differ diff --git a/backend/tests/data/png/maxicode_0.5.png b/backend/tests/data/png/maxicode_0.5.png index 9fb5b4df..0894d767 100644 Binary files a/backend/tests/data/png/maxicode_0.5.png and b/backend/tests/data/png/maxicode_0.5.png differ diff --git a/backend/tests/data/png/maxicode_0.7_wsp3_box1.png b/backend/tests/data/png/maxicode_0.7_wsp3_box1.png new file mode 100644 index 00000000..b5cab9da Binary files /dev/null and b/backend/tests/data/png/maxicode_0.7_wsp3_box1.png differ 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 00000000..6c902565 Binary files /dev/null and b/backend/tests/data/png/maxicode_1.4_bgfgalpha.png differ 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 00000000..2df2874e Binary files /dev/null and b/backend/tests/data/png/maxicode_2.1.png differ diff --git a/backend/tests/data/print/bmp/maxicode_fig_2.bmp b/backend/tests/data/print/bmp/maxicode_fig_2.bmp index 73ac3783..2a045f65 100644 Binary files a/backend/tests/data/print/bmp/maxicode_fig_2.bmp and b/backend/tests/data/print/bmp/maxicode_fig_2.bmp differ diff --git a/backend/tests/data/print/emf/maxicode_fig_2.emf b/backend/tests/data/print/emf/maxicode_fig_2.emf index 9cc44877..db5bb7b8 100644 Binary files a/backend/tests/data/print/emf/maxicode_fig_2.emf and b/backend/tests/data/print/emf/maxicode_fig_2.emf differ diff --git a/backend/tests/data/print/eps/maxicode_fig_2.eps b/backend/tests/data/print/eps/maxicode_fig_2.eps index 7bdd8e92..f720f1bb 100644 --- a/backend/tests/data/print/eps/maxicode_fig_2.eps +++ b/backend/tests/data/print/eps/maxicode_fig_2.eps @@ -2,7 +2,7 @@ %%Creator: Zint 2.9.1.9 %%Title: Zint Generated Symbol %%Pages: 0 -%%BoundingBox: 0 0 74 72 +%%BoundingBox: 0 0 60 58 %%EndComments /TL { setlinewidth moveto lineto stroke } bind def /TD { newpath 0 360 arc fill } bind def @@ -12,365 +12,365 @@ /TE { pop pop } bind def newpath 1.00 1.00 1.00 setrgbcolor -72.00 0.00 TB 0.00 74.00 TR +57.73 0.00 TB 0.00 60.00 TR TE 0.00 0.00 0.00 setrgbcolor -3.69 71.57 4.56 71.07 4.56 70.07 3.69 69.57 2.82 70.07 2.82 71.07 TH -6.15 71.57 7.02 71.07 7.02 70.07 6.15 69.57 5.28 70.07 5.28 71.07 TH -8.61 71.57 9.48 71.07 9.48 70.07 8.61 69.57 7.74 70.07 7.74 71.07 TH -11.07 71.57 11.94 71.07 11.94 70.07 11.07 69.57 10.20 70.07 10.20 71.07 TH -13.53 71.57 14.40 71.07 14.40 70.07 13.53 69.57 12.66 70.07 12.66 71.07 TH -18.45 71.57 19.32 71.07 19.32 70.07 18.45 69.57 17.58 70.07 17.58 71.07 TH -35.67 71.57 36.54 71.07 36.54 70.07 35.67 69.57 34.80 70.07 34.80 71.07 TH -50.43 71.57 51.30 71.07 51.30 70.07 50.43 69.57 49.56 70.07 49.56 71.07 TH -60.27 71.57 61.14 71.07 61.14 70.07 60.27 69.57 59.40 70.07 59.40 71.07 TH -67.65 71.57 68.52 71.07 68.52 70.07 67.65 69.57 66.78 70.07 66.78 71.07 TH -70.11 71.57 70.98 71.07 70.98 70.07 70.11 69.57 69.24 70.07 69.24 71.07 TH -72.57 71.57 73.44 71.07 73.44 70.07 72.57 69.57 71.70 70.07 71.70 71.07 TH -9.84 69.44 10.71 68.94 10.71 67.94 9.84 67.44 8.97 67.94 8.97 68.94 TH -29.52 69.44 30.39 68.94 30.39 67.94 29.52 67.44 28.65 67.94 28.65 68.94 TH -51.66 69.44 52.53 68.94 52.53 67.94 51.66 67.44 50.79 67.94 50.79 68.94 TH -56.58 69.44 57.45 68.94 57.45 67.94 56.58 67.44 55.71 67.94 55.71 68.94 TH -6.15 67.30 7.02 66.80 7.02 65.80 6.15 65.30 5.28 65.80 5.28 66.80 TH -11.07 67.30 11.94 66.80 11.94 65.80 11.07 65.30 10.20 65.80 10.20 66.80 TH -13.53 67.30 14.40 66.80 14.40 65.80 13.53 65.30 12.66 65.80 12.66 66.80 TH -20.91 67.30 21.78 66.80 21.78 65.80 20.91 65.30 20.04 65.80 20.04 66.80 TH -23.37 67.30 24.24 66.80 24.24 65.80 23.37 65.30 22.50 65.80 22.50 66.80 TH -30.75 67.30 31.62 66.80 31.62 65.80 30.75 65.30 29.88 65.80 29.88 66.80 TH -38.13 67.30 39.00 66.80 39.00 65.80 38.13 65.30 37.26 65.80 37.26 66.80 TH -40.59 67.30 41.46 66.80 41.46 65.80 40.59 65.30 39.72 65.80 39.72 66.80 TH -45.51 67.30 46.38 66.80 46.38 65.80 45.51 65.30 44.64 65.80 44.64 66.80 TH -47.97 67.30 48.84 66.80 48.84 65.80 47.97 65.30 47.10 65.80 47.10 66.80 TH -55.35 67.30 56.22 66.80 56.22 65.80 55.35 65.30 54.48 65.80 54.48 66.80 TH -62.73 67.30 63.60 66.80 63.60 65.80 62.73 65.30 61.86 65.80 61.86 66.80 TH -70.11 67.30 70.98 66.80 70.98 65.80 70.11 65.30 69.24 65.80 69.24 66.80 TH -2.46 65.17 3.33 64.67 3.33 63.67 2.46 63.17 1.59 63.67 1.59 64.67 TH -19.68 65.17 20.55 64.67 20.55 63.67 19.68 63.17 18.81 63.67 18.81 64.67 TH -29.52 65.17 30.39 64.67 30.39 63.67 29.52 63.17 28.65 63.67 28.65 64.67 TH -31.98 65.17 32.85 64.67 32.85 63.67 31.98 63.17 31.11 63.67 31.11 64.67 TH -41.82 65.17 42.69 64.67 42.69 63.67 41.82 63.17 40.95 63.67 40.95 64.67 TH -49.20 65.17 50.07 64.67 50.07 63.67 49.20 63.17 48.33 63.67 48.33 64.67 TH -6.15 63.03 7.02 62.53 7.02 61.53 6.15 61.03 5.28 61.53 5.28 62.53 TH -11.07 63.03 11.94 62.53 11.94 61.53 11.07 61.03 10.20 61.53 10.20 62.53 TH -13.53 63.03 14.40 62.53 14.40 61.53 13.53 61.03 12.66 61.53 12.66 62.53 TH -30.75 63.03 31.62 62.53 31.62 61.53 30.75 61.03 29.88 61.53 29.88 62.53 TH -35.67 63.03 36.54 62.53 36.54 61.53 35.67 61.03 34.80 61.53 34.80 62.53 TH -50.43 63.03 51.30 62.53 51.30 61.53 50.43 61.03 49.56 61.53 49.56 62.53 TH -55.35 63.03 56.22 62.53 56.22 61.53 55.35 61.03 54.48 61.53 54.48 62.53 TH -60.27 63.03 61.14 62.53 61.14 61.53 60.27 61.03 59.40 61.53 59.40 62.53 TH -62.73 63.03 63.60 62.53 63.60 61.53 62.73 61.03 61.86 61.53 61.86 62.53 TH -70.11 63.03 70.98 62.53 70.98 61.53 70.11 61.03 69.24 61.53 69.24 62.53 TH -72.57 63.03 73.44 62.53 73.44 61.53 72.57 61.03 71.70 61.53 71.70 62.53 TH -2.46 60.90 3.33 60.40 3.33 59.40 2.46 58.90 1.59 59.40 1.59 60.40 TH -4.92 60.90 5.79 60.40 5.79 59.40 4.92 58.90 4.05 59.40 4.05 60.40 TH -7.38 60.90 8.25 60.40 8.25 59.40 7.38 58.90 6.51 59.40 6.51 60.40 TH -12.30 60.90 13.17 60.40 13.17 59.40 12.30 58.90 11.43 59.40 11.43 60.40 TH -22.14 60.90 23.01 60.40 23.01 59.40 22.14 58.90 21.27 59.40 21.27 60.40 TH -36.90 60.90 37.77 60.40 37.77 59.40 36.90 58.90 36.03 59.40 36.03 60.40 TH -41.82 60.90 42.69 60.40 42.69 59.40 41.82 58.90 40.95 59.40 40.95 60.40 TH -44.28 60.90 45.15 60.40 45.15 59.40 44.28 58.90 43.41 59.40 43.41 60.40 TH -51.66 60.90 52.53 60.40 52.53 59.40 51.66 58.90 50.79 59.40 50.79 60.40 TH -61.50 60.90 62.37 60.40 62.37 59.40 61.50 58.90 60.63 59.40 60.63 60.40 TH -63.96 60.90 64.83 60.40 64.83 59.40 63.96 58.90 63.09 59.40 63.09 60.40 TH -66.42 60.90 67.29 60.40 67.29 59.40 66.42 58.90 65.55 59.40 65.55 60.40 TH -68.88 60.90 69.75 60.40 69.75 59.40 68.88 58.90 68.01 59.40 68.01 60.40 TH -1.23 58.77 2.10 58.27 2.10 57.27 1.23 56.77 0.36 57.27 0.36 58.27 TH -23.37 58.77 24.24 58.27 24.24 57.27 23.37 56.77 22.50 57.27 22.50 58.27 TH -25.83 58.77 26.70 58.27 26.70 57.27 25.83 56.77 24.96 57.27 24.96 58.27 TH -40.59 58.77 41.46 58.27 41.46 57.27 40.59 56.77 39.72 57.27 39.72 58.27 TH -47.97 58.77 48.84 58.27 48.84 57.27 47.97 56.77 47.10 57.27 47.10 58.27 TH -12.30 56.63 13.17 56.13 13.17 55.13 12.30 54.63 11.43 55.13 11.43 56.13 TH -17.22 56.63 18.09 56.13 18.09 55.13 17.22 54.63 16.35 55.13 16.35 56.13 TH -27.06 56.63 27.93 56.13 27.93 55.13 27.06 54.63 26.19 55.13 26.19 56.13 TH -34.44 56.63 35.31 56.13 35.31 55.13 34.44 54.63 33.57 55.13 33.57 56.13 TH -41.82 56.63 42.69 56.13 42.69 55.13 41.82 54.63 40.95 55.13 40.95 56.13 TH -51.66 56.63 52.53 56.13 52.53 55.13 51.66 54.63 50.79 55.13 50.79 56.13 TH -59.04 56.63 59.91 56.13 59.91 55.13 59.04 54.63 58.17 55.13 58.17 56.13 TH -61.50 56.63 62.37 56.13 62.37 55.13 61.50 54.63 60.63 55.13 60.63 56.13 TH -63.96 56.63 64.83 56.13 64.83 55.13 63.96 54.63 63.09 55.13 63.09 56.13 TH -66.42 56.63 67.29 56.13 67.29 55.13 66.42 54.63 65.55 55.13 65.55 56.13 TH -68.88 56.63 69.75 56.13 69.75 55.13 68.88 54.63 68.01 55.13 68.01 56.13 TH -1.23 54.50 2.10 54.00 2.10 53.00 1.23 52.50 0.36 53.00 0.36 54.00 TH -3.69 54.50 4.56 54.00 4.56 53.00 3.69 52.50 2.82 53.00 2.82 54.00 TH -6.15 54.50 7.02 54.00 7.02 53.00 6.15 52.50 5.28 53.00 5.28 54.00 TH -11.07 54.50 11.94 54.00 11.94 53.00 11.07 52.50 10.20 53.00 10.20 54.00 TH -13.53 54.50 14.40 54.00 14.40 53.00 13.53 52.50 12.66 53.00 12.66 54.00 TH -15.99 54.50 16.86 54.00 16.86 53.00 15.99 52.50 15.12 53.00 15.12 54.00 TH -35.67 54.50 36.54 54.00 36.54 53.00 35.67 52.50 34.80 53.00 34.80 54.00 TH -52.89 54.50 53.76 54.00 53.76 53.00 52.89 52.50 52.02 53.00 52.02 54.00 TH -55.35 54.50 56.22 54.00 56.22 53.00 55.35 52.50 54.48 53.00 54.48 54.00 TH -19.68 52.36 20.55 51.86 20.55 50.86 19.68 50.36 18.81 50.86 18.81 51.86 TH -22.14 52.36 23.01 51.86 23.01 50.86 22.14 50.36 21.27 50.86 21.27 51.86 TH -27.06 52.36 27.93 51.86 27.93 50.86 27.06 50.36 26.19 50.86 26.19 51.86 TH -29.52 52.36 30.39 51.86 30.39 50.86 29.52 50.36 28.65 50.86 28.65 51.86 TH -49.20 52.36 50.07 51.86 50.07 50.86 49.20 50.36 48.33 50.86 48.33 51.86 TH -54.12 52.36 54.99 51.86 54.99 50.86 54.12 50.36 53.25 50.86 53.25 51.86 TH -63.96 52.36 64.83 51.86 64.83 50.86 63.96 50.36 63.09 50.86 63.09 51.86 TH -66.42 52.36 67.29 51.86 67.29 50.86 66.42 50.36 65.55 50.86 65.55 51.86 TH -1.23 50.23 2.10 49.73 2.10 48.73 1.23 48.23 0.36 48.73 0.36 49.73 TH -6.15 50.23 7.02 49.73 7.02 48.73 6.15 48.23 5.28 48.73 5.28 49.73 TH -8.61 50.23 9.48 49.73 9.48 48.73 8.61 48.23 7.74 48.73 7.74 49.73 TH -11.07 50.23 11.94 49.73 11.94 48.73 11.07 48.23 10.20 48.73 10.20 49.73 TH -13.53 50.23 14.40 49.73 14.40 48.73 13.53 48.23 12.66 48.73 12.66 49.73 TH -28.29 50.23 29.16 49.73 29.16 48.73 28.29 48.23 27.42 48.73 27.42 49.73 TH -33.21 50.23 34.08 49.73 34.08 48.73 33.21 48.23 32.34 48.73 32.34 49.73 TH -38.13 50.23 39.00 49.73 39.00 48.73 38.13 48.23 37.26 48.73 37.26 49.73 TH -40.59 50.23 41.46 49.73 41.46 48.73 40.59 48.23 39.72 48.73 39.72 49.73 TH -50.43 50.23 51.30 49.73 51.30 48.73 50.43 48.23 49.56 48.73 49.56 49.73 TH -52.89 50.23 53.76 49.73 53.76 48.73 52.89 48.23 52.02 48.73 52.02 49.73 TH -70.11 50.23 70.98 49.73 70.98 48.73 70.11 48.23 69.24 48.73 69.24 49.73 TH -72.57 50.23 73.44 49.73 73.44 48.73 72.57 48.23 71.70 48.73 71.70 49.73 TH -7.38 48.10 8.25 47.60 8.25 46.60 7.38 46.10 6.51 46.60 6.51 47.60 TH -9.84 48.10 10.71 47.60 10.71 46.60 9.84 46.10 8.97 46.60 8.97 47.60 TH -12.30 48.10 13.17 47.60 13.17 46.60 12.30 46.10 11.43 46.60 11.43 47.60 TH -22.14 48.10 23.01 47.60 23.01 46.60 22.14 46.10 21.27 46.60 21.27 47.60 TH -27.06 48.10 27.93 47.60 27.93 46.60 27.06 46.10 26.19 46.60 26.19 47.60 TH -46.74 48.10 47.61 47.60 47.61 46.60 46.74 46.10 45.87 46.60 45.87 47.60 TH -49.20 48.10 50.07 47.60 50.07 46.60 49.20 46.10 48.33 46.60 48.33 47.60 TH -51.66 48.10 52.53 47.60 52.53 46.60 51.66 46.10 50.79 46.60 50.79 47.60 TH -56.58 48.10 57.45 47.60 57.45 46.60 56.58 46.10 55.71 46.60 55.71 47.60 TH -66.42 48.10 67.29 47.60 67.29 46.60 66.42 46.10 65.55 46.60 65.55 47.60 TH -68.88 48.10 69.75 47.60 69.75 46.60 68.88 46.10 68.01 46.60 68.01 47.60 TH -71.34 48.10 72.21 47.60 72.21 46.60 71.34 46.10 70.47 46.60 70.47 47.60 TH -8.61 45.96 9.48 45.46 9.48 44.46 8.61 43.96 7.74 44.46 7.74 45.46 TH -11.07 45.96 11.94 45.46 11.94 44.46 11.07 43.96 10.20 44.46 10.20 45.46 TH -13.53 45.96 14.40 45.46 14.40 44.46 13.53 43.96 12.66 44.46 12.66 45.46 TH -15.99 45.96 16.86 45.46 16.86 44.46 15.99 43.96 15.12 44.46 15.12 45.46 TH -45.51 45.96 46.38 45.46 46.38 44.46 45.51 43.96 44.64 44.46 44.64 45.46 TH -57.81 45.96 58.68 45.46 58.68 44.46 57.81 43.96 56.94 44.46 56.94 45.46 TH -62.73 45.96 63.60 45.46 63.60 44.46 62.73 43.96 61.86 44.46 61.86 45.46 TH -65.19 45.96 66.06 45.46 66.06 44.46 65.19 43.96 64.32 44.46 64.32 45.46 TH -2.46 43.83 3.33 43.33 3.33 42.33 2.46 41.83 1.59 42.33 1.59 43.33 TH -12.30 43.83 13.17 43.33 13.17 42.33 12.30 41.83 11.43 42.33 11.43 43.33 TH -54.12 43.83 54.99 43.33 54.99 42.33 54.12 41.83 53.25 42.33 53.25 43.33 TH -56.58 43.83 57.45 43.33 57.45 42.33 56.58 41.83 55.71 42.33 55.71 43.33 TH -59.04 43.83 59.91 43.33 59.91 42.33 59.04 41.83 58.17 42.33 58.17 43.33 TH -66.42 43.83 67.29 43.33 67.29 42.33 66.42 41.83 65.55 42.33 65.55 43.33 TH -1.23 41.69 2.10 41.19 2.10 40.19 1.23 39.69 0.36 40.19 0.36 41.19 TH -20.91 41.69 21.78 41.19 21.78 40.19 20.91 39.69 20.04 40.19 20.04 41.19 TH -47.97 41.69 48.84 41.19 48.84 40.19 47.97 39.69 47.10 40.19 47.10 41.19 TH -50.43 41.69 51.30 41.19 51.30 40.19 50.43 39.69 49.56 40.19 49.56 41.19 TH -65.19 41.69 66.06 41.19 66.06 40.19 65.19 39.69 64.32 40.19 64.32 41.19 TH -12.30 39.56 13.17 39.06 13.17 38.06 12.30 37.56 11.43 38.06 11.43 39.06 TH -17.22 39.56 18.09 39.06 18.09 38.06 17.22 37.56 16.35 38.06 16.35 39.06 TH -19.68 39.56 20.55 39.06 20.55 38.06 19.68 37.56 18.81 38.06 18.81 39.06 TH -22.14 39.56 23.01 39.06 23.01 38.06 22.14 37.56 21.27 38.06 21.27 39.06 TH -56.58 39.56 57.45 39.06 57.45 38.06 56.58 37.56 55.71 38.06 55.71 39.06 TH -71.34 39.56 72.21 39.06 72.21 38.06 71.34 37.56 70.47 38.06 70.47 39.06 TH -1.23 37.43 2.10 36.93 2.10 35.93 1.23 35.43 0.36 35.93 0.36 36.93 TH -3.69 37.43 4.56 36.93 4.56 35.93 3.69 35.43 2.82 35.93 2.82 36.93 TH -6.15 37.43 7.02 36.93 7.02 35.93 6.15 35.43 5.28 35.93 5.28 36.93 TH -20.91 37.43 21.78 36.93 21.78 35.93 20.91 35.43 20.04 35.93 20.04 36.93 TH -50.43 37.43 51.30 36.93 51.30 35.93 50.43 35.43 49.56 35.93 49.56 36.93 TH -65.19 37.43 66.06 36.93 66.06 35.93 65.19 35.43 64.32 35.93 64.32 36.93 TH -67.65 37.43 68.52 36.93 68.52 35.93 67.65 35.43 66.78 35.93 66.78 36.93 TH -72.57 37.43 73.44 36.93 73.44 35.93 72.57 35.43 71.70 35.93 71.70 36.93 TH -4.92 35.29 5.79 34.79 5.79 33.79 4.92 33.29 4.05 33.79 4.05 34.79 TH -7.38 35.29 8.25 34.79 8.25 33.79 7.38 33.29 6.51 33.79 6.51 34.79 TH -51.66 35.29 52.53 34.79 52.53 33.79 51.66 33.29 50.79 33.79 50.79 34.79 TH -61.50 35.29 62.37 34.79 62.37 33.79 61.50 33.29 60.63 33.79 60.63 34.79 TH -68.88 35.29 69.75 34.79 69.75 33.79 68.88 33.29 68.01 33.79 68.01 34.79 TH -15.99 33.16 16.86 32.66 16.86 31.66 15.99 31.16 15.12 31.66 15.12 32.66 TH -20.91 33.16 21.78 32.66 21.78 31.66 20.91 31.16 20.04 31.66 20.04 32.66 TH -23.37 33.16 24.24 32.66 24.24 31.66 23.37 31.16 22.50 31.66 22.50 32.66 TH -50.43 33.16 51.30 32.66 51.30 31.66 50.43 31.16 49.56 31.66 49.56 32.66 TH -57.81 33.16 58.68 32.66 58.68 31.66 57.81 31.16 56.94 31.66 56.94 32.66 TH -62.73 33.16 63.60 32.66 63.60 31.66 62.73 31.16 61.86 31.66 61.86 32.66 TH -72.57 33.16 73.44 32.66 73.44 31.66 72.57 31.16 71.70 31.66 71.70 32.66 TH -2.46 31.02 3.33 30.52 3.33 29.52 2.46 29.02 1.59 29.52 1.59 30.52 TH -7.38 31.02 8.25 30.52 8.25 29.52 7.38 29.02 6.51 29.52 6.51 30.52 TH -12.30 31.02 13.17 30.52 13.17 29.52 12.30 29.02 11.43 29.52 11.43 30.52 TH -22.14 31.02 23.01 30.52 23.01 29.52 22.14 29.02 21.27 29.52 21.27 30.52 TH -46.74 31.02 47.61 30.52 47.61 29.52 46.74 29.02 45.87 29.52 45.87 30.52 TH -54.12 31.02 54.99 30.52 54.99 29.52 54.12 29.02 53.25 29.52 53.25 30.52 TH -56.58 31.02 57.45 30.52 57.45 29.52 56.58 29.02 55.71 29.52 55.71 30.52 TH -59.04 31.02 59.91 30.52 59.91 29.52 59.04 29.02 58.17 29.52 58.17 30.52 TH -66.42 31.02 67.29 30.52 67.29 29.52 66.42 29.02 65.55 29.52 65.55 30.52 TH -68.88 31.02 69.75 30.52 69.75 29.52 68.88 29.02 68.01 29.52 68.01 30.52 TH -6.15 28.89 7.02 28.39 7.02 27.39 6.15 26.89 5.28 27.39 5.28 28.39 TH -18.45 28.89 19.32 28.39 19.32 27.39 18.45 26.89 17.58 27.39 17.58 28.39 TH -20.91 28.89 21.78 28.39 21.78 27.39 20.91 26.89 20.04 27.39 20.04 28.39 TH -47.97 28.89 48.84 28.39 48.84 27.39 47.97 26.89 47.10 27.39 47.10 28.39 TH -50.43 28.89 51.30 28.39 51.30 27.39 50.43 26.89 49.56 27.39 49.56 28.39 TH -52.89 28.89 53.76 28.39 53.76 27.39 52.89 26.89 52.02 27.39 52.02 28.39 TH -65.19 28.89 66.06 28.39 66.06 27.39 65.19 26.89 64.32 27.39 64.32 28.39 TH -70.11 28.89 70.98 28.39 70.98 27.39 70.11 26.89 69.24 27.39 69.24 28.39 TH -46.74 26.76 47.61 26.26 47.61 25.26 46.74 24.76 45.87 25.26 45.87 26.26 TH -49.20 26.76 50.07 26.26 50.07 25.26 49.20 24.76 48.33 25.26 48.33 26.26 TH -61.50 26.76 62.37 26.26 62.37 25.26 61.50 24.76 60.63 25.26 60.63 26.26 TH -1.23 24.62 2.10 24.12 2.10 23.12 1.23 22.62 0.36 23.12 0.36 24.12 TH -6.15 24.62 7.02 24.12 7.02 23.12 6.15 22.62 5.28 23.12 5.28 24.12 TH -11.07 24.62 11.94 24.12 11.94 23.12 11.07 22.62 10.20 23.12 10.20 24.12 TH -13.53 24.62 14.40 24.12 14.40 23.12 13.53 22.62 12.66 23.12 12.66 24.12 TH -20.91 24.62 21.78 24.12 21.78 23.12 20.91 22.62 20.04 23.12 20.04 24.12 TH -25.83 24.62 26.70 24.12 26.70 23.12 25.83 22.62 24.96 23.12 24.96 24.12 TH -30.75 24.62 31.62 24.12 31.62 23.12 30.75 22.62 29.88 23.12 29.88 24.12 TH -43.05 24.62 43.92 24.12 43.92 23.12 43.05 22.62 42.18 23.12 42.18 24.12 TH -52.89 24.62 53.76 24.12 53.76 23.12 52.89 22.62 52.02 23.12 52.02 24.12 TH -57.81 24.62 58.68 24.12 58.68 23.12 57.81 22.62 56.94 23.12 56.94 24.12 TH -62.73 24.62 63.60 24.12 63.60 23.12 62.73 22.62 61.86 23.12 61.86 24.12 TH -72.57 24.62 73.44 24.12 73.44 23.12 72.57 22.62 71.70 23.12 71.70 24.12 TH -2.46 22.49 3.33 21.99 3.33 20.99 2.46 20.49 1.59 20.99 1.59 21.99 TH -12.30 22.49 13.17 21.99 13.17 20.99 12.30 20.49 11.43 20.99 11.43 21.99 TH -14.76 22.49 15.63 21.99 15.63 20.99 14.76 20.49 13.89 20.99 13.89 21.99 TH -17.22 22.49 18.09 21.99 18.09 20.99 17.22 20.49 16.35 20.99 16.35 21.99 TH -19.68 22.49 20.55 21.99 20.55 20.99 19.68 20.49 18.81 20.99 18.81 21.99 TH -27.06 22.49 27.93 21.99 27.93 20.99 27.06 20.49 26.19 20.99 26.19 21.99 TH -31.98 22.49 32.85 21.99 32.85 20.99 31.98 20.49 31.11 20.99 31.11 21.99 TH -36.90 22.49 37.77 21.99 37.77 20.99 36.90 20.49 36.03 20.99 36.03 21.99 TH -44.28 22.49 45.15 21.99 45.15 20.99 44.28 20.49 43.41 20.99 43.41 21.99 TH -46.74 22.49 47.61 21.99 47.61 20.99 46.74 20.49 45.87 20.99 45.87 21.99 TH -51.66 22.49 52.53 21.99 52.53 20.99 51.66 20.49 50.79 20.99 50.79 21.99 TH -56.58 22.49 57.45 21.99 57.45 20.99 56.58 20.49 55.71 20.99 55.71 21.99 TH -66.42 22.49 67.29 21.99 67.29 20.99 66.42 20.49 65.55 20.99 65.55 21.99 TH -71.34 22.49 72.21 21.99 72.21 20.99 71.34 20.49 70.47 20.99 70.47 21.99 TH -3.69 20.35 4.56 19.85 4.56 18.85 3.69 18.35 2.82 18.85 2.82 19.85 TH -6.15 20.35 7.02 19.85 7.02 18.85 6.15 18.35 5.28 18.85 5.28 19.85 TH -11.07 20.35 11.94 19.85 11.94 18.85 11.07 18.35 10.20 18.85 10.20 19.85 TH -38.13 20.35 39.00 19.85 39.00 18.85 38.13 18.35 37.26 18.85 37.26 19.85 TH -43.05 20.35 43.92 19.85 43.92 18.85 43.05 18.35 42.18 18.85 42.18 19.85 TH -47.97 20.35 48.84 19.85 48.84 18.85 47.97 18.35 47.10 18.85 47.10 19.85 TH -50.43 20.35 51.30 19.85 51.30 18.85 50.43 18.35 49.56 18.85 49.56 19.85 TH -55.35 20.35 56.22 19.85 56.22 18.85 55.35 18.35 54.48 18.85 54.48 19.85 TH -62.73 20.35 63.60 19.85 63.60 18.85 62.73 18.35 61.86 18.85 61.86 19.85 TH -65.19 20.35 66.06 19.85 66.06 18.85 65.19 18.35 64.32 18.85 64.32 19.85 TH -67.65 20.35 68.52 19.85 68.52 18.85 67.65 18.35 66.78 18.85 66.78 19.85 TH -70.11 20.35 70.98 19.85 70.98 18.85 70.11 18.35 69.24 18.85 69.24 19.85 TH -72.57 20.35 73.44 19.85 73.44 18.85 72.57 18.35 71.70 18.85 71.70 19.85 TH -14.76 18.22 15.63 17.72 15.63 16.72 14.76 16.22 13.89 16.72 13.89 17.72 TH -17.22 18.22 18.09 17.72 18.09 16.72 17.22 16.22 16.35 16.72 16.35 17.72 TH -19.68 18.22 20.55 17.72 20.55 16.72 19.68 16.22 18.81 16.72 18.81 17.72 TH -27.06 18.22 27.93 17.72 27.93 16.72 27.06 16.22 26.19 16.72 26.19 17.72 TH -29.52 18.22 30.39 17.72 30.39 16.72 29.52 16.22 28.65 16.72 28.65 17.72 TH -31.98 18.22 32.85 17.72 32.85 16.72 31.98 16.22 31.11 16.72 31.11 17.72 TH -34.44 18.22 35.31 17.72 35.31 16.72 34.44 16.22 33.57 16.72 33.57 17.72 TH -36.90 18.22 37.77 17.72 37.77 16.72 36.90 16.22 36.03 16.72 36.03 17.72 TH -39.36 18.22 40.23 17.72 40.23 16.72 39.36 16.22 38.49 16.72 38.49 17.72 TH -41.82 18.22 42.69 17.72 42.69 16.72 41.82 16.22 40.95 16.72 40.95 17.72 TH -44.28 18.22 45.15 17.72 45.15 16.72 44.28 16.22 43.41 16.72 43.41 17.72 TH -46.74 18.22 47.61 17.72 47.61 16.72 46.74 16.22 45.87 16.72 45.87 17.72 TH -49.20 18.22 50.07 17.72 50.07 16.72 49.20 16.22 48.33 16.72 48.33 17.72 TH -51.66 18.22 52.53 17.72 52.53 16.72 51.66 16.22 50.79 16.72 50.79 17.72 TH -54.12 18.22 54.99 17.72 54.99 16.72 54.12 16.22 53.25 16.72 53.25 17.72 TH -63.96 18.22 64.83 17.72 64.83 16.72 63.96 16.22 63.09 16.72 63.09 17.72 TH -68.88 18.22 69.75 17.72 69.75 16.72 68.88 16.22 68.01 16.72 68.01 17.72 TH -6.15 16.09 7.02 15.59 7.02 14.59 6.15 14.09 5.28 14.59 5.28 15.59 TH -8.61 16.09 9.48 15.59 9.48 14.59 8.61 14.09 7.74 14.59 7.74 15.59 TH -11.07 16.09 11.94 15.59 11.94 14.59 11.07 14.09 10.20 14.59 10.20 15.59 TH -15.99 16.09 16.86 15.59 16.86 14.59 15.99 14.09 15.12 14.59 15.12 15.59 TH -23.37 16.09 24.24 15.59 24.24 14.59 23.37 14.09 22.50 14.59 22.50 15.59 TH -25.83 16.09 26.70 15.59 26.70 14.59 25.83 14.09 24.96 14.59 24.96 15.59 TH -28.29 16.09 29.16 15.59 29.16 14.59 28.29 14.09 27.42 14.59 27.42 15.59 TH -38.13 16.09 39.00 15.59 39.00 14.59 38.13 14.09 37.26 14.59 37.26 15.59 TH -43.05 16.09 43.92 15.59 43.92 14.59 43.05 14.09 42.18 14.59 42.18 15.59 TH -47.97 16.09 48.84 15.59 48.84 14.59 47.97 14.09 47.10 14.59 47.10 15.59 TH -50.43 16.09 51.30 15.59 51.30 14.59 50.43 14.09 49.56 14.59 49.56 15.59 TH -62.73 16.09 63.60 15.59 63.60 14.59 62.73 14.09 61.86 14.59 61.86 15.59 TH -65.19 16.09 66.06 15.59 66.06 14.59 65.19 14.09 64.32 14.59 64.32 15.59 TH -67.65 16.09 68.52 15.59 68.52 14.59 67.65 14.09 66.78 14.59 66.78 15.59 TH -2.46 13.95 3.33 13.45 3.33 12.45 2.46 11.95 1.59 12.45 1.59 13.45 TH -4.92 13.95 5.79 13.45 5.79 12.45 4.92 11.95 4.05 12.45 4.05 13.45 TH -9.84 13.95 10.71 13.45 10.71 12.45 9.84 11.95 8.97 12.45 8.97 13.45 TH -12.30 13.95 13.17 13.45 13.17 12.45 12.30 11.95 11.43 12.45 11.43 13.45 TH -14.76 13.95 15.63 13.45 15.63 12.45 14.76 11.95 13.89 12.45 13.89 13.45 TH -19.68 13.95 20.55 13.45 20.55 12.45 19.68 11.95 18.81 12.45 18.81 13.45 TH -22.14 13.95 23.01 13.45 23.01 12.45 22.14 11.95 21.27 12.45 21.27 13.45 TH -24.60 13.95 25.47 13.45 25.47 12.45 24.60 11.95 23.73 12.45 23.73 13.45 TH -31.98 13.95 32.85 13.45 32.85 12.45 31.98 11.95 31.11 12.45 31.11 13.45 TH -44.28 13.95 45.15 13.45 45.15 12.45 44.28 11.95 43.41 12.45 43.41 13.45 TH -46.74 13.95 47.61 13.45 47.61 12.45 46.74 11.95 45.87 12.45 45.87 13.45 TH -51.66 13.95 52.53 13.45 52.53 12.45 51.66 11.95 50.79 12.45 50.79 13.45 TH -59.04 13.95 59.91 13.45 59.91 12.45 59.04 11.95 58.17 12.45 58.17 13.45 TH -63.96 13.95 64.83 13.45 64.83 12.45 63.96 11.95 63.09 12.45 63.09 13.45 TH -68.88 13.95 69.75 13.45 69.75 12.45 68.88 11.95 68.01 12.45 68.01 13.45 TH -71.34 13.95 72.21 13.45 72.21 12.45 71.34 11.95 70.47 12.45 70.47 13.45 TH -13.53 11.82 14.40 11.32 14.40 10.32 13.53 9.82 12.66 10.32 12.66 11.32 TH -18.45 11.82 19.32 11.32 19.32 10.32 18.45 9.82 17.58 10.32 17.58 11.32 TH -20.91 11.82 21.78 11.32 21.78 10.32 20.91 9.82 20.04 10.32 20.04 11.32 TH -25.83 11.82 26.70 11.32 26.70 10.32 25.83 9.82 24.96 10.32 24.96 11.32 TH -28.29 11.82 29.16 11.32 29.16 10.32 28.29 9.82 27.42 10.32 27.42 11.32 TH -30.75 11.82 31.62 11.32 31.62 10.32 30.75 9.82 29.88 10.32 29.88 11.32 TH -35.67 11.82 36.54 11.32 36.54 10.32 35.67 9.82 34.80 10.32 34.80 11.32 TH -40.59 11.82 41.46 11.32 41.46 10.32 40.59 9.82 39.72 10.32 39.72 11.32 TH -47.97 11.82 48.84 11.32 48.84 10.32 47.97 9.82 47.10 10.32 47.10 11.32 TH -52.89 11.82 53.76 11.32 53.76 10.32 52.89 9.82 52.02 10.32 52.02 11.32 TH -55.35 11.82 56.22 11.32 56.22 10.32 55.35 9.82 54.48 10.32 54.48 11.32 TH -57.81 11.82 58.68 11.32 58.68 10.32 57.81 9.82 56.94 10.32 56.94 11.32 TH -65.19 11.82 66.06 11.32 66.06 10.32 65.19 9.82 64.32 10.32 64.32 11.32 TH -67.65 11.82 68.52 11.32 68.52 10.32 67.65 9.82 66.78 10.32 66.78 11.32 TH -2.46 9.68 3.33 9.18 3.33 8.18 2.46 7.68 1.59 8.18 1.59 9.18 TH -4.92 9.68 5.79 9.18 5.79 8.18 4.92 7.68 4.05 8.18 4.05 9.18 TH -7.38 9.68 8.25 9.18 8.25 8.18 7.38 7.68 6.51 8.18 6.51 9.18 TH -17.22 9.68 18.09 9.18 18.09 8.18 17.22 7.68 16.35 8.18 16.35 9.18 TH -19.68 9.68 20.55 9.18 20.55 8.18 19.68 7.68 18.81 8.18 18.81 9.18 TH -24.60 9.68 25.47 9.18 25.47 8.18 24.60 7.68 23.73 8.18 23.73 9.18 TH -27.06 9.68 27.93 9.18 27.93 8.18 27.06 7.68 26.19 8.18 26.19 9.18 TH -29.52 9.68 30.39 9.18 30.39 8.18 29.52 7.68 28.65 8.18 28.65 9.18 TH -31.98 9.68 32.85 9.18 32.85 8.18 31.98 7.68 31.11 8.18 31.11 9.18 TH -41.82 9.68 42.69 9.18 42.69 8.18 41.82 7.68 40.95 8.18 40.95 9.18 TH -51.66 9.68 52.53 9.18 52.53 8.18 51.66 7.68 50.79 8.18 50.79 9.18 TH -54.12 9.68 54.99 9.18 54.99 8.18 54.12 7.68 53.25 8.18 53.25 9.18 TH -56.58 9.68 57.45 9.18 57.45 8.18 56.58 7.68 55.71 8.18 55.71 9.18 TH -59.04 9.68 59.91 9.18 59.91 8.18 59.04 7.68 58.17 8.18 58.17 9.18 TH -63.96 9.68 64.83 9.18 64.83 8.18 63.96 7.68 63.09 8.18 63.09 9.18 TH -66.42 9.68 67.29 9.18 67.29 8.18 66.42 7.68 65.55 8.18 65.55 9.18 TH -68.88 9.68 69.75 9.18 69.75 8.18 68.88 7.68 68.01 8.18 68.01 9.18 TH -71.34 9.68 72.21 9.18 72.21 8.18 71.34 7.68 70.47 8.18 70.47 9.18 TH -1.23 7.55 2.10 7.05 2.10 6.05 1.23 5.55 0.36 6.05 0.36 7.05 TH -6.15 7.55 7.02 7.05 7.02 6.05 6.15 5.55 5.28 6.05 5.28 7.05 TH -8.61 7.55 9.48 7.05 9.48 6.05 8.61 5.55 7.74 6.05 7.74 7.05 TH -11.07 7.55 11.94 7.05 11.94 6.05 11.07 5.55 10.20 6.05 10.20 7.05 TH -13.53 7.55 14.40 7.05 14.40 6.05 13.53 5.55 12.66 6.05 12.66 7.05 TH -18.45 7.55 19.32 7.05 19.32 6.05 18.45 5.55 17.58 6.05 17.58 7.05 TH -23.37 7.55 24.24 7.05 24.24 6.05 23.37 5.55 22.50 6.05 22.50 7.05 TH -25.83 7.55 26.70 7.05 26.70 6.05 25.83 5.55 24.96 6.05 24.96 7.05 TH -28.29 7.55 29.16 7.05 29.16 6.05 28.29 5.55 27.42 6.05 27.42 7.05 TH -30.75 7.55 31.62 7.05 31.62 6.05 30.75 5.55 29.88 6.05 29.88 7.05 TH -33.21 7.55 34.08 7.05 34.08 6.05 33.21 5.55 32.34 6.05 32.34 7.05 TH -35.67 7.55 36.54 7.05 36.54 6.05 35.67 5.55 34.80 6.05 34.80 7.05 TH -47.97 7.55 48.84 7.05 48.84 6.05 47.97 5.55 47.10 6.05 47.10 7.05 TH -52.89 7.55 53.76 7.05 53.76 6.05 52.89 5.55 52.02 6.05 52.02 7.05 TH -55.35 7.55 56.22 7.05 56.22 6.05 55.35 5.55 54.48 6.05 54.48 7.05 TH -60.27 7.55 61.14 7.05 61.14 6.05 60.27 5.55 59.40 6.05 59.40 7.05 TH -62.73 7.55 63.60 7.05 63.60 6.05 62.73 5.55 61.86 6.05 61.86 7.05 TH -65.19 7.55 66.06 7.05 66.06 6.05 65.19 5.55 64.32 6.05 64.32 7.05 TH -72.57 7.55 73.44 7.05 73.44 6.05 72.57 5.55 71.70 6.05 71.70 7.05 TH -7.38 5.42 8.25 4.92 8.25 3.92 7.38 3.42 6.51 3.92 6.51 4.92 TH -14.76 5.42 15.63 4.92 15.63 3.92 14.76 3.42 13.89 3.92 13.89 4.92 TH -17.22 5.42 18.09 4.92 18.09 3.92 17.22 3.42 16.35 3.92 16.35 4.92 TH -22.14 5.42 23.01 4.92 23.01 3.92 22.14 3.42 21.27 3.92 21.27 4.92 TH -24.60 5.42 25.47 4.92 25.47 3.92 24.60 3.42 23.73 3.92 23.73 4.92 TH -27.06 5.42 27.93 4.92 27.93 3.92 27.06 3.42 26.19 3.92 26.19 4.92 TH -29.52 5.42 30.39 4.92 30.39 3.92 29.52 3.42 28.65 3.92 28.65 4.92 TH -31.98 5.42 32.85 4.92 32.85 3.92 31.98 3.42 31.11 3.92 31.11 4.92 TH -36.90 5.42 37.77 4.92 37.77 3.92 36.90 3.42 36.03 3.92 36.03 4.92 TH -39.36 5.42 40.23 4.92 40.23 3.92 39.36 3.42 38.49 3.92 38.49 4.92 TH -44.28 5.42 45.15 4.92 45.15 3.92 44.28 3.42 43.41 3.92 43.41 4.92 TH -46.74 5.42 47.61 4.92 47.61 3.92 46.74 3.42 45.87 3.92 45.87 4.92 TH -51.66 5.42 52.53 4.92 52.53 3.92 51.66 3.42 50.79 3.92 50.79 4.92 TH -56.58 5.42 57.45 4.92 57.45 3.92 56.58 3.42 55.71 3.92 55.71 4.92 TH -63.96 5.42 64.83 4.92 64.83 3.92 63.96 3.42 63.09 3.92 63.09 4.92 TH -66.42 5.42 67.29 4.92 67.29 3.92 66.42 3.42 65.55 3.92 65.55 4.92 TH -68.88 5.42 69.75 4.92 69.75 3.92 68.88 3.42 68.01 3.92 68.01 4.92 TH -6.15 3.28 7.02 2.78 7.02 1.78 6.15 1.28 5.28 1.78 5.28 2.78 TH -11.07 3.28 11.94 2.78 11.94 1.78 11.07 1.28 10.20 1.78 10.20 2.78 TH -13.53 3.28 14.40 2.78 14.40 1.78 13.53 1.28 12.66 1.78 12.66 2.78 TH -30.75 3.28 31.62 2.78 31.62 1.78 30.75 1.28 29.88 1.78 29.88 2.78 TH -33.21 3.28 34.08 2.78 34.08 1.78 33.21 1.28 32.34 1.78 32.34 2.78 TH -35.67 3.28 36.54 2.78 36.54 1.78 35.67 1.28 34.80 1.78 34.80 2.78 TH -38.13 3.28 39.00 2.78 39.00 1.78 38.13 1.28 37.26 1.78 37.26 2.78 TH -43.05 3.28 43.92 2.78 43.92 1.78 43.05 1.28 42.18 1.78 42.18 2.78 TH -45.51 3.28 46.38 2.78 46.38 1.78 45.51 1.28 44.64 1.78 44.64 2.78 TH -52.89 3.28 53.76 2.78 53.76 1.78 52.89 1.28 52.02 1.78 52.02 2.78 TH -65.19 3.28 66.06 2.78 66.06 1.78 65.19 1.28 64.32 1.78 64.32 2.78 TH -35.76 36.40 10.85 TD +3.00 57.58 3.87 57.08 3.87 56.08 3.00 55.58 2.13 56.08 2.13 57.08 TH +5.00 57.58 5.87 57.08 5.87 56.08 5.00 55.58 4.13 56.08 4.13 57.08 TH +7.00 57.58 7.87 57.08 7.87 56.08 7.00 55.58 6.13 56.08 6.13 57.08 TH +9.00 57.58 9.87 57.08 9.87 56.08 9.00 55.58 8.13 56.08 8.13 57.08 TH +11.00 57.58 11.87 57.08 11.87 56.08 11.00 55.58 10.13 56.08 10.13 57.08 TH +15.00 57.58 15.87 57.08 15.87 56.08 15.00 55.58 14.13 56.08 14.13 57.08 TH +29.00 57.58 29.87 57.08 29.87 56.08 29.00 55.58 28.13 56.08 28.13 57.08 TH +41.00 57.58 41.87 57.08 41.87 56.08 41.00 55.58 40.13 56.08 40.13 57.08 TH +49.00 57.58 49.87 57.08 49.87 56.08 49.00 55.58 48.13 56.08 48.13 57.08 TH +55.00 57.58 55.87 57.08 55.87 56.08 55.00 55.58 54.13 56.08 54.13 57.08 TH +57.00 57.58 57.87 57.08 57.87 56.08 57.00 55.58 56.13 56.08 56.13 57.08 TH +59.00 57.58 59.87 57.08 59.87 56.08 59.00 55.58 58.13 56.08 58.13 57.08 TH +8.00 55.85 8.87 55.35 8.87 54.35 8.00 53.85 7.13 54.35 7.13 55.35 TH +24.00 55.85 24.87 55.35 24.87 54.35 24.00 53.85 23.13 54.35 23.13 55.35 TH +42.00 55.85 42.87 55.35 42.87 54.35 42.00 53.85 41.13 54.35 41.13 55.35 TH +46.00 55.85 46.87 55.35 46.87 54.35 46.00 53.85 45.13 54.35 45.13 55.35 TH +5.00 54.11 5.87 53.61 5.87 52.61 5.00 52.11 4.13 52.61 4.13 53.61 TH +9.00 54.11 9.87 53.61 9.87 52.61 9.00 52.11 8.13 52.61 8.13 53.61 TH +11.00 54.11 11.87 53.61 11.87 52.61 11.00 52.11 10.13 52.61 10.13 53.61 TH +17.00 54.11 17.87 53.61 17.87 52.61 17.00 52.11 16.13 52.61 16.13 53.61 TH +19.00 54.11 19.87 53.61 19.87 52.61 19.00 52.11 18.13 52.61 18.13 53.61 TH +25.00 54.11 25.87 53.61 25.87 52.61 25.00 52.11 24.13 52.61 24.13 53.61 TH +31.00 54.11 31.87 53.61 31.87 52.61 31.00 52.11 30.13 52.61 30.13 53.61 TH +33.00 54.11 33.87 53.61 33.87 52.61 33.00 52.11 32.13 52.61 32.13 53.61 TH +37.00 54.11 37.87 53.61 37.87 52.61 37.00 52.11 36.13 52.61 36.13 53.61 TH +39.00 54.11 39.87 53.61 39.87 52.61 39.00 52.11 38.13 52.61 38.13 53.61 TH +45.00 54.11 45.87 53.61 45.87 52.61 45.00 52.11 44.13 52.61 44.13 53.61 TH +51.00 54.11 51.87 53.61 51.87 52.61 51.00 52.11 50.13 52.61 50.13 53.61 TH +57.00 54.11 57.87 53.61 57.87 52.61 57.00 52.11 56.13 52.61 56.13 53.61 TH +2.00 52.38 2.87 51.88 2.87 50.88 2.00 50.38 1.13 50.88 1.13 51.88 TH +16.00 52.38 16.87 51.88 16.87 50.88 16.00 50.38 15.13 50.88 15.13 51.88 TH +24.00 52.38 24.87 51.88 24.87 50.88 24.00 50.38 23.13 50.88 23.13 51.88 TH +26.00 52.38 26.87 51.88 26.87 50.88 26.00 50.38 25.13 50.88 25.13 51.88 TH +34.00 52.38 34.87 51.88 34.87 50.88 34.00 50.38 33.13 50.88 33.13 51.88 TH +40.00 52.38 40.87 51.88 40.87 50.88 40.00 50.38 39.13 50.88 39.13 51.88 TH +5.00 50.65 5.87 50.15 5.87 49.15 5.00 48.65 4.13 49.15 4.13 50.15 TH +9.00 50.65 9.87 50.15 9.87 49.15 9.00 48.65 8.13 49.15 8.13 50.15 TH +11.00 50.65 11.87 50.15 11.87 49.15 11.00 48.65 10.13 49.15 10.13 50.15 TH +25.00 50.65 25.87 50.15 25.87 49.15 25.00 48.65 24.13 49.15 24.13 50.15 TH +29.00 50.65 29.87 50.15 29.87 49.15 29.00 48.65 28.13 49.15 28.13 50.15 TH +41.00 50.65 41.87 50.15 41.87 49.15 41.00 48.65 40.13 49.15 40.13 50.15 TH +45.00 50.65 45.87 50.15 45.87 49.15 45.00 48.65 44.13 49.15 44.13 50.15 TH +49.00 50.65 49.87 50.15 49.87 49.15 49.00 48.65 48.13 49.15 48.13 50.15 TH +51.00 50.65 51.87 50.15 51.87 49.15 51.00 48.65 50.13 49.15 50.13 50.15 TH +57.00 50.65 57.87 50.15 57.87 49.15 57.00 48.65 56.13 49.15 56.13 50.15 TH +59.00 50.65 59.87 50.15 59.87 49.15 59.00 48.65 58.13 49.15 58.13 50.15 TH +2.00 48.92 2.87 48.42 2.87 47.42 2.00 46.92 1.13 47.42 1.13 48.42 TH +4.00 48.92 4.87 48.42 4.87 47.42 4.00 46.92 3.13 47.42 3.13 48.42 TH +6.00 48.92 6.87 48.42 6.87 47.42 6.00 46.92 5.13 47.42 5.13 48.42 TH +10.00 48.92 10.87 48.42 10.87 47.42 10.00 46.92 9.13 47.42 9.13 48.42 TH +18.00 48.92 18.87 48.42 18.87 47.42 18.00 46.92 17.13 47.42 17.13 48.42 TH +30.00 48.92 30.87 48.42 30.87 47.42 30.00 46.92 29.13 47.42 29.13 48.42 TH +34.00 48.92 34.87 48.42 34.87 47.42 34.00 46.92 33.13 47.42 33.13 48.42 TH +36.00 48.92 36.87 48.42 36.87 47.42 36.00 46.92 35.13 47.42 35.13 48.42 TH +42.00 48.92 42.87 48.42 42.87 47.42 42.00 46.92 41.13 47.42 41.13 48.42 TH +50.00 48.92 50.87 48.42 50.87 47.42 50.00 46.92 49.13 47.42 49.13 48.42 TH +52.00 48.92 52.87 48.42 52.87 47.42 52.00 46.92 51.13 47.42 51.13 48.42 TH +54.00 48.92 54.87 48.42 54.87 47.42 54.00 46.92 53.13 47.42 53.13 48.42 TH +56.00 48.92 56.87 48.42 56.87 47.42 56.00 46.92 55.13 47.42 55.13 48.42 TH +1.00 47.19 1.87 46.69 1.87 45.69 1.00 45.19 0.13 45.69 0.13 46.69 TH +19.00 47.19 19.87 46.69 19.87 45.69 19.00 45.19 18.13 45.69 18.13 46.69 TH +21.00 47.19 21.87 46.69 21.87 45.69 21.00 45.19 20.13 45.69 20.13 46.69 TH +33.00 47.19 33.87 46.69 33.87 45.69 33.00 45.19 32.13 45.69 32.13 46.69 TH +39.00 47.19 39.87 46.69 39.87 45.69 39.00 45.19 38.13 45.69 38.13 46.69 TH +10.00 45.45 10.87 44.95 10.87 43.95 10.00 43.45 9.13 43.95 9.13 44.95 TH +14.00 45.45 14.87 44.95 14.87 43.95 14.00 43.45 13.13 43.95 13.13 44.95 TH +22.00 45.45 22.87 44.95 22.87 43.95 22.00 43.45 21.13 43.95 21.13 44.95 TH +28.00 45.45 28.87 44.95 28.87 43.95 28.00 43.45 27.13 43.95 27.13 44.95 TH +34.00 45.45 34.87 44.95 34.87 43.95 34.00 43.45 33.13 43.95 33.13 44.95 TH +42.00 45.45 42.87 44.95 42.87 43.95 42.00 43.45 41.13 43.95 41.13 44.95 TH +48.00 45.45 48.87 44.95 48.87 43.95 48.00 43.45 47.13 43.95 47.13 44.95 TH +50.00 45.45 50.87 44.95 50.87 43.95 50.00 43.45 49.13 43.95 49.13 44.95 TH +52.00 45.45 52.87 44.95 52.87 43.95 52.00 43.45 51.13 43.95 51.13 44.95 TH +54.00 45.45 54.87 44.95 54.87 43.95 54.00 43.45 53.13 43.95 53.13 44.95 TH +56.00 45.45 56.87 44.95 56.87 43.95 56.00 43.45 55.13 43.95 55.13 44.95 TH +1.00 43.72 1.87 43.22 1.87 42.22 1.00 41.72 0.13 42.22 0.13 43.22 TH +3.00 43.72 3.87 43.22 3.87 42.22 3.00 41.72 2.13 42.22 2.13 43.22 TH +5.00 43.72 5.87 43.22 5.87 42.22 5.00 41.72 4.13 42.22 4.13 43.22 TH +9.00 43.72 9.87 43.22 9.87 42.22 9.00 41.72 8.13 42.22 8.13 43.22 TH +11.00 43.72 11.87 43.22 11.87 42.22 11.00 41.72 10.13 42.22 10.13 43.22 TH +13.00 43.72 13.87 43.22 13.87 42.22 13.00 41.72 12.13 42.22 12.13 43.22 TH +29.00 43.72 29.87 43.22 29.87 42.22 29.00 41.72 28.13 42.22 28.13 43.22 TH +43.00 43.72 43.87 43.22 43.87 42.22 43.00 41.72 42.13 42.22 42.13 43.22 TH +45.00 43.72 45.87 43.22 45.87 42.22 45.00 41.72 44.13 42.22 44.13 43.22 TH +16.00 41.99 16.87 41.49 16.87 40.49 16.00 39.99 15.13 40.49 15.13 41.49 TH +18.00 41.99 18.87 41.49 18.87 40.49 18.00 39.99 17.13 40.49 17.13 41.49 TH +22.00 41.99 22.87 41.49 22.87 40.49 22.00 39.99 21.13 40.49 21.13 41.49 TH +24.00 41.99 24.87 41.49 24.87 40.49 24.00 39.99 23.13 40.49 23.13 41.49 TH +40.00 41.99 40.87 41.49 40.87 40.49 40.00 39.99 39.13 40.49 39.13 41.49 TH +44.00 41.99 44.87 41.49 44.87 40.49 44.00 39.99 43.13 40.49 43.13 41.49 TH +52.00 41.99 52.87 41.49 52.87 40.49 52.00 39.99 51.13 40.49 51.13 41.49 TH +54.00 41.99 54.87 41.49 54.87 40.49 54.00 39.99 53.13 40.49 53.13 41.49 TH +1.00 40.26 1.87 39.76 1.87 38.76 1.00 38.26 0.13 38.76 0.13 39.76 TH +5.00 40.26 5.87 39.76 5.87 38.76 5.00 38.26 4.13 38.76 4.13 39.76 TH +7.00 40.26 7.87 39.76 7.87 38.76 7.00 38.26 6.13 38.76 6.13 39.76 TH +9.00 40.26 9.87 39.76 9.87 38.76 9.00 38.26 8.13 38.76 8.13 39.76 TH +11.00 40.26 11.87 39.76 11.87 38.76 11.00 38.26 10.13 38.76 10.13 39.76 TH +23.00 40.26 23.87 39.76 23.87 38.76 23.00 38.26 22.13 38.76 22.13 39.76 TH +27.00 40.26 27.87 39.76 27.87 38.76 27.00 38.26 26.13 38.76 26.13 39.76 TH +31.00 40.26 31.87 39.76 31.87 38.76 31.00 38.26 30.13 38.76 30.13 39.76 TH +33.00 40.26 33.87 39.76 33.87 38.76 33.00 38.26 32.13 38.76 32.13 39.76 TH +41.00 40.26 41.87 39.76 41.87 38.76 41.00 38.26 40.13 38.76 40.13 39.76 TH +43.00 40.26 43.87 39.76 43.87 38.76 43.00 38.26 42.13 38.76 42.13 39.76 TH +57.00 40.26 57.87 39.76 57.87 38.76 57.00 38.26 56.13 38.76 56.13 39.76 TH +59.00 40.26 59.87 39.76 59.87 38.76 59.00 38.26 58.13 38.76 58.13 39.76 TH +6.00 38.53 6.87 38.03 6.87 37.03 6.00 36.53 5.13 37.03 5.13 38.03 TH +8.00 38.53 8.87 38.03 8.87 37.03 8.00 36.53 7.13 37.03 7.13 38.03 TH +10.00 38.53 10.87 38.03 10.87 37.03 10.00 36.53 9.13 37.03 9.13 38.03 TH +18.00 38.53 18.87 38.03 18.87 37.03 18.00 36.53 17.13 37.03 17.13 38.03 TH +22.00 38.53 22.87 38.03 22.87 37.03 22.00 36.53 21.13 37.03 21.13 38.03 TH +38.00 38.53 38.87 38.03 38.87 37.03 38.00 36.53 37.13 37.03 37.13 38.03 TH +40.00 38.53 40.87 38.03 40.87 37.03 40.00 36.53 39.13 37.03 39.13 38.03 TH +42.00 38.53 42.87 38.03 42.87 37.03 42.00 36.53 41.13 37.03 41.13 38.03 TH +46.00 38.53 46.87 38.03 46.87 37.03 46.00 36.53 45.13 37.03 45.13 38.03 TH +54.00 38.53 54.87 38.03 54.87 37.03 54.00 36.53 53.13 37.03 53.13 38.03 TH +56.00 38.53 56.87 38.03 56.87 37.03 56.00 36.53 55.13 37.03 55.13 38.03 TH +58.00 38.53 58.87 38.03 58.87 37.03 58.00 36.53 57.13 37.03 57.13 38.03 TH +7.00 36.79 7.87 36.29 7.87 35.29 7.00 34.79 6.13 35.29 6.13 36.29 TH +9.00 36.79 9.87 36.29 9.87 35.29 9.00 34.79 8.13 35.29 8.13 36.29 TH +11.00 36.79 11.87 36.29 11.87 35.29 11.00 34.79 10.13 35.29 10.13 36.29 TH +13.00 36.79 13.87 36.29 13.87 35.29 13.00 34.79 12.13 35.29 12.13 36.29 TH +37.00 36.79 37.87 36.29 37.87 35.29 37.00 34.79 36.13 35.29 36.13 36.29 TH +47.00 36.79 47.87 36.29 47.87 35.29 47.00 34.79 46.13 35.29 46.13 36.29 TH +51.00 36.79 51.87 36.29 51.87 35.29 51.00 34.79 50.13 35.29 50.13 36.29 TH +53.00 36.79 53.87 36.29 53.87 35.29 53.00 34.79 52.13 35.29 52.13 36.29 TH +2.00 35.06 2.87 34.56 2.87 33.56 2.00 33.06 1.13 33.56 1.13 34.56 TH +10.00 35.06 10.87 34.56 10.87 33.56 10.00 33.06 9.13 33.56 9.13 34.56 TH +44.00 35.06 44.87 34.56 44.87 33.56 44.00 33.06 43.13 33.56 43.13 34.56 TH +46.00 35.06 46.87 34.56 46.87 33.56 46.00 33.06 45.13 33.56 45.13 34.56 TH +48.00 35.06 48.87 34.56 48.87 33.56 48.00 33.06 47.13 33.56 47.13 34.56 TH +54.00 35.06 54.87 34.56 54.87 33.56 54.00 33.06 53.13 33.56 53.13 34.56 TH +1.00 33.33 1.87 32.83 1.87 31.83 1.00 31.33 0.13 31.83 0.13 32.83 TH +17.00 33.33 17.87 32.83 17.87 31.83 17.00 31.33 16.13 31.83 16.13 32.83 TH +39.00 33.33 39.87 32.83 39.87 31.83 39.00 31.33 38.13 31.83 38.13 32.83 TH +41.00 33.33 41.87 32.83 41.87 31.83 41.00 31.33 40.13 31.83 40.13 32.83 TH +53.00 33.33 53.87 32.83 53.87 31.83 53.00 31.33 52.13 31.83 52.13 32.83 TH +10.00 31.60 10.87 31.10 10.87 30.10 10.00 29.60 9.13 30.10 9.13 31.10 TH +14.00 31.60 14.87 31.10 14.87 30.10 14.00 29.60 13.13 30.10 13.13 31.10 TH +16.00 31.60 16.87 31.10 16.87 30.10 16.00 29.60 15.13 30.10 15.13 31.10 TH +18.00 31.60 18.87 31.10 18.87 30.10 18.00 29.60 17.13 30.10 17.13 31.10 TH +46.00 31.60 46.87 31.10 46.87 30.10 46.00 29.60 45.13 30.10 45.13 31.10 TH +58.00 31.60 58.87 31.10 58.87 30.10 58.00 29.60 57.13 30.10 57.13 31.10 TH +1.00 29.87 1.87 29.37 1.87 28.37 1.00 27.87 0.13 28.37 0.13 29.37 TH +3.00 29.87 3.87 29.37 3.87 28.37 3.00 27.87 2.13 28.37 2.13 29.37 TH +5.00 29.87 5.87 29.37 5.87 28.37 5.00 27.87 4.13 28.37 4.13 29.37 TH +17.00 29.87 17.87 29.37 17.87 28.37 17.00 27.87 16.13 28.37 16.13 29.37 TH +41.00 29.87 41.87 29.37 41.87 28.37 41.00 27.87 40.13 28.37 40.13 29.37 TH +53.00 29.87 53.87 29.37 53.87 28.37 53.00 27.87 52.13 28.37 52.13 29.37 TH +55.00 29.87 55.87 29.37 55.87 28.37 55.00 27.87 54.13 28.37 54.13 29.37 TH +59.00 29.87 59.87 29.37 59.87 28.37 59.00 27.87 58.13 28.37 58.13 29.37 TH +4.00 28.13 4.87 27.63 4.87 26.63 4.00 26.13 3.13 26.63 3.13 27.63 TH +6.00 28.13 6.87 27.63 6.87 26.63 6.00 26.13 5.13 26.63 5.13 27.63 TH +42.00 28.13 42.87 27.63 42.87 26.63 42.00 26.13 41.13 26.63 41.13 27.63 TH +50.00 28.13 50.87 27.63 50.87 26.63 50.00 26.13 49.13 26.63 49.13 27.63 TH +56.00 28.13 56.87 27.63 56.87 26.63 56.00 26.13 55.13 26.63 55.13 27.63 TH +13.00 26.40 13.87 25.90 13.87 24.90 13.00 24.40 12.13 24.90 12.13 25.90 TH +17.00 26.40 17.87 25.90 17.87 24.90 17.00 24.40 16.13 24.90 16.13 25.90 TH +19.00 26.40 19.87 25.90 19.87 24.90 19.00 24.40 18.13 24.90 18.13 25.90 TH +41.00 26.40 41.87 25.90 41.87 24.90 41.00 24.40 40.13 24.90 40.13 25.90 TH +47.00 26.40 47.87 25.90 47.87 24.90 47.00 24.40 46.13 24.90 46.13 25.90 TH +51.00 26.40 51.87 25.90 51.87 24.90 51.00 24.40 50.13 24.90 50.13 25.90 TH +59.00 26.40 59.87 25.90 59.87 24.90 59.00 24.40 58.13 24.90 58.13 25.90 TH +2.00 24.67 2.87 24.17 2.87 23.17 2.00 22.67 1.13 23.17 1.13 24.17 TH +6.00 24.67 6.87 24.17 6.87 23.17 6.00 22.67 5.13 23.17 5.13 24.17 TH +10.00 24.67 10.87 24.17 10.87 23.17 10.00 22.67 9.13 23.17 9.13 24.17 TH +18.00 24.67 18.87 24.17 18.87 23.17 18.00 22.67 17.13 23.17 17.13 24.17 TH +38.00 24.67 38.87 24.17 38.87 23.17 38.00 22.67 37.13 23.17 37.13 24.17 TH +44.00 24.67 44.87 24.17 44.87 23.17 44.00 22.67 43.13 23.17 43.13 24.17 TH +46.00 24.67 46.87 24.17 46.87 23.17 46.00 22.67 45.13 23.17 45.13 24.17 TH +48.00 24.67 48.87 24.17 48.87 23.17 48.00 22.67 47.13 23.17 47.13 24.17 TH +54.00 24.67 54.87 24.17 54.87 23.17 54.00 22.67 53.13 23.17 53.13 24.17 TH +56.00 24.67 56.87 24.17 56.87 23.17 56.00 22.67 55.13 23.17 55.13 24.17 TH +5.00 22.94 5.87 22.44 5.87 21.44 5.00 20.94 4.13 21.44 4.13 22.44 TH +15.00 22.94 15.87 22.44 15.87 21.44 15.00 20.94 14.13 21.44 14.13 22.44 TH +17.00 22.94 17.87 22.44 17.87 21.44 17.00 20.94 16.13 21.44 16.13 22.44 TH +39.00 22.94 39.87 22.44 39.87 21.44 39.00 20.94 38.13 21.44 38.13 22.44 TH +41.00 22.94 41.87 22.44 41.87 21.44 41.00 20.94 40.13 21.44 40.13 22.44 TH +43.00 22.94 43.87 22.44 43.87 21.44 43.00 20.94 42.13 21.44 42.13 22.44 TH +53.00 22.94 53.87 22.44 53.87 21.44 53.00 20.94 52.13 21.44 52.13 22.44 TH +57.00 22.94 57.87 22.44 57.87 21.44 57.00 20.94 56.13 21.44 56.13 22.44 TH +38.00 21.21 38.87 20.71 38.87 19.71 38.00 19.21 37.13 19.71 37.13 20.71 TH +40.00 21.21 40.87 20.71 40.87 19.71 40.00 19.21 39.13 19.71 39.13 20.71 TH +50.00 21.21 50.87 20.71 50.87 19.71 50.00 19.21 49.13 19.71 49.13 20.71 TH +1.00 19.47 1.87 18.97 1.87 17.97 1.00 17.47 0.13 17.97 0.13 18.97 TH +5.00 19.47 5.87 18.97 5.87 17.97 5.00 17.47 4.13 17.97 4.13 18.97 TH +9.00 19.47 9.87 18.97 9.87 17.97 9.00 17.47 8.13 17.97 8.13 18.97 TH +11.00 19.47 11.87 18.97 11.87 17.97 11.00 17.47 10.13 17.97 10.13 18.97 TH +17.00 19.47 17.87 18.97 17.87 17.97 17.00 17.47 16.13 17.97 16.13 18.97 TH +21.00 19.47 21.87 18.97 21.87 17.97 21.00 17.47 20.13 17.97 20.13 18.97 TH +25.00 19.47 25.87 18.97 25.87 17.97 25.00 17.47 24.13 17.97 24.13 18.97 TH +35.00 19.47 35.87 18.97 35.87 17.97 35.00 17.47 34.13 17.97 34.13 18.97 TH +43.00 19.47 43.87 18.97 43.87 17.97 43.00 17.47 42.13 17.97 42.13 18.97 TH +47.00 19.47 47.87 18.97 47.87 17.97 47.00 17.47 46.13 17.97 46.13 18.97 TH +51.00 19.47 51.87 18.97 51.87 17.97 51.00 17.47 50.13 17.97 50.13 18.97 TH +59.00 19.47 59.87 18.97 59.87 17.97 59.00 17.47 58.13 17.97 58.13 18.97 TH +2.00 17.74 2.87 17.24 2.87 16.24 2.00 15.74 1.13 16.24 1.13 17.24 TH +10.00 17.74 10.87 17.24 10.87 16.24 10.00 15.74 9.13 16.24 9.13 17.24 TH +12.00 17.74 12.87 17.24 12.87 16.24 12.00 15.74 11.13 16.24 11.13 17.24 TH +14.00 17.74 14.87 17.24 14.87 16.24 14.00 15.74 13.13 16.24 13.13 17.24 TH +16.00 17.74 16.87 17.24 16.87 16.24 16.00 15.74 15.13 16.24 15.13 17.24 TH +22.00 17.74 22.87 17.24 22.87 16.24 22.00 15.74 21.13 16.24 21.13 17.24 TH +26.00 17.74 26.87 17.24 26.87 16.24 26.00 15.74 25.13 16.24 25.13 17.24 TH +30.00 17.74 30.87 17.24 30.87 16.24 30.00 15.74 29.13 16.24 29.13 17.24 TH +36.00 17.74 36.87 17.24 36.87 16.24 36.00 15.74 35.13 16.24 35.13 17.24 TH +38.00 17.74 38.87 17.24 38.87 16.24 38.00 15.74 37.13 16.24 37.13 17.24 TH +42.00 17.74 42.87 17.24 42.87 16.24 42.00 15.74 41.13 16.24 41.13 17.24 TH +46.00 17.74 46.87 17.24 46.87 16.24 46.00 15.74 45.13 16.24 45.13 17.24 TH +54.00 17.74 54.87 17.24 54.87 16.24 54.00 15.74 53.13 16.24 53.13 17.24 TH +58.00 17.74 58.87 17.24 58.87 16.24 58.00 15.74 57.13 16.24 57.13 17.24 TH +3.00 16.01 3.87 15.51 3.87 14.51 3.00 14.01 2.13 14.51 2.13 15.51 TH +5.00 16.01 5.87 15.51 5.87 14.51 5.00 14.01 4.13 14.51 4.13 15.51 TH +9.00 16.01 9.87 15.51 9.87 14.51 9.00 14.01 8.13 14.51 8.13 15.51 TH +31.00 16.01 31.87 15.51 31.87 14.51 31.00 14.01 30.13 14.51 30.13 15.51 TH +35.00 16.01 35.87 15.51 35.87 14.51 35.00 14.01 34.13 14.51 34.13 15.51 TH +39.00 16.01 39.87 15.51 39.87 14.51 39.00 14.01 38.13 14.51 38.13 15.51 TH +41.00 16.01 41.87 15.51 41.87 14.51 41.00 14.01 40.13 14.51 40.13 15.51 TH +45.00 16.01 45.87 15.51 45.87 14.51 45.00 14.01 44.13 14.51 44.13 15.51 TH +51.00 16.01 51.87 15.51 51.87 14.51 51.00 14.01 50.13 14.51 50.13 15.51 TH +53.00 16.01 53.87 15.51 53.87 14.51 53.00 14.01 52.13 14.51 52.13 15.51 TH +55.00 16.01 55.87 15.51 55.87 14.51 55.00 14.01 54.13 14.51 54.13 15.51 TH +57.00 16.01 57.87 15.51 57.87 14.51 57.00 14.01 56.13 14.51 56.13 15.51 TH +59.00 16.01 59.87 15.51 59.87 14.51 59.00 14.01 58.13 14.51 58.13 15.51 TH +12.00 14.28 12.87 13.78 12.87 12.78 12.00 12.28 11.13 12.78 11.13 13.78 TH +14.00 14.28 14.87 13.78 14.87 12.78 14.00 12.28 13.13 12.78 13.13 13.78 TH +16.00 14.28 16.87 13.78 16.87 12.78 16.00 12.28 15.13 12.78 15.13 13.78 TH +22.00 14.28 22.87 13.78 22.87 12.78 22.00 12.28 21.13 12.78 21.13 13.78 TH +24.00 14.28 24.87 13.78 24.87 12.78 24.00 12.28 23.13 12.78 23.13 13.78 TH +26.00 14.28 26.87 13.78 26.87 12.78 26.00 12.28 25.13 12.78 25.13 13.78 TH +28.00 14.28 28.87 13.78 28.87 12.78 28.00 12.28 27.13 12.78 27.13 13.78 TH +30.00 14.28 30.87 13.78 30.87 12.78 30.00 12.28 29.13 12.78 29.13 13.78 TH +32.00 14.28 32.87 13.78 32.87 12.78 32.00 12.28 31.13 12.78 31.13 13.78 TH +34.00 14.28 34.87 13.78 34.87 12.78 34.00 12.28 33.13 12.78 33.13 13.78 TH +36.00 14.28 36.87 13.78 36.87 12.78 36.00 12.28 35.13 12.78 35.13 13.78 TH +38.00 14.28 38.87 13.78 38.87 12.78 38.00 12.28 37.13 12.78 37.13 13.78 TH +40.00 14.28 40.87 13.78 40.87 12.78 40.00 12.28 39.13 12.78 39.13 13.78 TH +42.00 14.28 42.87 13.78 42.87 12.78 42.00 12.28 41.13 12.78 41.13 13.78 TH +44.00 14.28 44.87 13.78 44.87 12.78 44.00 12.28 43.13 12.78 43.13 13.78 TH +52.00 14.28 52.87 13.78 52.87 12.78 52.00 12.28 51.13 12.78 51.13 13.78 TH +56.00 14.28 56.87 13.78 56.87 12.78 56.00 12.28 55.13 12.78 55.13 13.78 TH +5.00 12.55 5.87 12.05 5.87 11.05 5.00 10.55 4.13 11.05 4.13 12.05 TH +7.00 12.55 7.87 12.05 7.87 11.05 7.00 10.55 6.13 11.05 6.13 12.05 TH +9.00 12.55 9.87 12.05 9.87 11.05 9.00 10.55 8.13 11.05 8.13 12.05 TH +13.00 12.55 13.87 12.05 13.87 11.05 13.00 10.55 12.13 11.05 12.13 12.05 TH +19.00 12.55 19.87 12.05 19.87 11.05 19.00 10.55 18.13 11.05 18.13 12.05 TH +21.00 12.55 21.87 12.05 21.87 11.05 21.00 10.55 20.13 11.05 20.13 12.05 TH +23.00 12.55 23.87 12.05 23.87 11.05 23.00 10.55 22.13 11.05 22.13 12.05 TH +31.00 12.55 31.87 12.05 31.87 11.05 31.00 10.55 30.13 11.05 30.13 12.05 TH +35.00 12.55 35.87 12.05 35.87 11.05 35.00 10.55 34.13 11.05 34.13 12.05 TH +39.00 12.55 39.87 12.05 39.87 11.05 39.00 10.55 38.13 11.05 38.13 12.05 TH +41.00 12.55 41.87 12.05 41.87 11.05 41.00 10.55 40.13 11.05 40.13 12.05 TH +51.00 12.55 51.87 12.05 51.87 11.05 51.00 10.55 50.13 11.05 50.13 12.05 TH +53.00 12.55 53.87 12.05 53.87 11.05 53.00 10.55 52.13 11.05 52.13 12.05 TH +55.00 12.55 55.87 12.05 55.87 11.05 55.00 10.55 54.13 11.05 54.13 12.05 TH +2.00 10.81 2.87 10.31 2.87 9.31 2.00 8.81 1.13 9.31 1.13 10.31 TH +4.00 10.81 4.87 10.31 4.87 9.31 4.00 8.81 3.13 9.31 3.13 10.31 TH +8.00 10.81 8.87 10.31 8.87 9.31 8.00 8.81 7.13 9.31 7.13 10.31 TH +10.00 10.81 10.87 10.31 10.87 9.31 10.00 8.81 9.13 9.31 9.13 10.31 TH +12.00 10.81 12.87 10.31 12.87 9.31 12.00 8.81 11.13 9.31 11.13 10.31 TH +16.00 10.81 16.87 10.31 16.87 9.31 16.00 8.81 15.13 9.31 15.13 10.31 TH +18.00 10.81 18.87 10.31 18.87 9.31 18.00 8.81 17.13 9.31 17.13 10.31 TH +20.00 10.81 20.87 10.31 20.87 9.31 20.00 8.81 19.13 9.31 19.13 10.31 TH +26.00 10.81 26.87 10.31 26.87 9.31 26.00 8.81 25.13 9.31 25.13 10.31 TH +36.00 10.81 36.87 10.31 36.87 9.31 36.00 8.81 35.13 9.31 35.13 10.31 TH +38.00 10.81 38.87 10.31 38.87 9.31 38.00 8.81 37.13 9.31 37.13 10.31 TH +42.00 10.81 42.87 10.31 42.87 9.31 42.00 8.81 41.13 9.31 41.13 10.31 TH +48.00 10.81 48.87 10.31 48.87 9.31 48.00 8.81 47.13 9.31 47.13 10.31 TH +52.00 10.81 52.87 10.31 52.87 9.31 52.00 8.81 51.13 9.31 51.13 10.31 TH +56.00 10.81 56.87 10.31 56.87 9.31 56.00 8.81 55.13 9.31 55.13 10.31 TH +58.00 10.81 58.87 10.31 58.87 9.31 58.00 8.81 57.13 9.31 57.13 10.31 TH +11.00 9.08 11.87 8.58 11.87 7.58 11.00 7.08 10.13 7.58 10.13 8.58 TH +15.00 9.08 15.87 8.58 15.87 7.58 15.00 7.08 14.13 7.58 14.13 8.58 TH +17.00 9.08 17.87 8.58 17.87 7.58 17.00 7.08 16.13 7.58 16.13 8.58 TH +21.00 9.08 21.87 8.58 21.87 7.58 21.00 7.08 20.13 7.58 20.13 8.58 TH +23.00 9.08 23.87 8.58 23.87 7.58 23.00 7.08 22.13 7.58 22.13 8.58 TH +25.00 9.08 25.87 8.58 25.87 7.58 25.00 7.08 24.13 7.58 24.13 8.58 TH +29.00 9.08 29.87 8.58 29.87 7.58 29.00 7.08 28.13 7.58 28.13 8.58 TH +33.00 9.08 33.87 8.58 33.87 7.58 33.00 7.08 32.13 7.58 32.13 8.58 TH +39.00 9.08 39.87 8.58 39.87 7.58 39.00 7.08 38.13 7.58 38.13 8.58 TH +43.00 9.08 43.87 8.58 43.87 7.58 43.00 7.08 42.13 7.58 42.13 8.58 TH +45.00 9.08 45.87 8.58 45.87 7.58 45.00 7.08 44.13 7.58 44.13 8.58 TH +47.00 9.08 47.87 8.58 47.87 7.58 47.00 7.08 46.13 7.58 46.13 8.58 TH +53.00 9.08 53.87 8.58 53.87 7.58 53.00 7.08 52.13 7.58 52.13 8.58 TH +55.00 9.08 55.87 8.58 55.87 7.58 55.00 7.08 54.13 7.58 54.13 8.58 TH +2.00 7.35 2.87 6.85 2.87 5.85 2.00 5.35 1.13 5.85 1.13 6.85 TH +4.00 7.35 4.87 6.85 4.87 5.85 4.00 5.35 3.13 5.85 3.13 6.85 TH +6.00 7.35 6.87 6.85 6.87 5.85 6.00 5.35 5.13 5.85 5.13 6.85 TH +14.00 7.35 14.87 6.85 14.87 5.85 14.00 5.35 13.13 5.85 13.13 6.85 TH +16.00 7.35 16.87 6.85 16.87 5.85 16.00 5.35 15.13 5.85 15.13 6.85 TH +20.00 7.35 20.87 6.85 20.87 5.85 20.00 5.35 19.13 5.85 19.13 6.85 TH +22.00 7.35 22.87 6.85 22.87 5.85 22.00 5.35 21.13 5.85 21.13 6.85 TH +24.00 7.35 24.87 6.85 24.87 5.85 24.00 5.35 23.13 5.85 23.13 6.85 TH +26.00 7.35 26.87 6.85 26.87 5.85 26.00 5.35 25.13 5.85 25.13 6.85 TH +34.00 7.35 34.87 6.85 34.87 5.85 34.00 5.35 33.13 5.85 33.13 6.85 TH +42.00 7.35 42.87 6.85 42.87 5.85 42.00 5.35 41.13 5.85 41.13 6.85 TH +44.00 7.35 44.87 6.85 44.87 5.85 44.00 5.35 43.13 5.85 43.13 6.85 TH +46.00 7.35 46.87 6.85 46.87 5.85 46.00 5.35 45.13 5.85 45.13 6.85 TH +48.00 7.35 48.87 6.85 48.87 5.85 48.00 5.35 47.13 5.85 47.13 6.85 TH +52.00 7.35 52.87 6.85 52.87 5.85 52.00 5.35 51.13 5.85 51.13 6.85 TH +54.00 7.35 54.87 6.85 54.87 5.85 54.00 5.35 53.13 5.85 53.13 6.85 TH +56.00 7.35 56.87 6.85 56.87 5.85 56.00 5.35 55.13 5.85 55.13 6.85 TH +58.00 7.35 58.87 6.85 58.87 5.85 58.00 5.35 57.13 5.85 57.13 6.85 TH +1.00 5.62 1.87 5.12 1.87 4.12 1.00 3.62 0.13 4.12 0.13 5.12 TH +5.00 5.62 5.87 5.12 5.87 4.12 5.00 3.62 4.13 4.12 4.13 5.12 TH +7.00 5.62 7.87 5.12 7.87 4.12 7.00 3.62 6.13 4.12 6.13 5.12 TH +9.00 5.62 9.87 5.12 9.87 4.12 9.00 3.62 8.13 4.12 8.13 5.12 TH +11.00 5.62 11.87 5.12 11.87 4.12 11.00 3.62 10.13 4.12 10.13 5.12 TH +15.00 5.62 15.87 5.12 15.87 4.12 15.00 3.62 14.13 4.12 14.13 5.12 TH +19.00 5.62 19.87 5.12 19.87 4.12 19.00 3.62 18.13 4.12 18.13 5.12 TH +21.00 5.62 21.87 5.12 21.87 4.12 21.00 3.62 20.13 4.12 20.13 5.12 TH +23.00 5.62 23.87 5.12 23.87 4.12 23.00 3.62 22.13 4.12 22.13 5.12 TH +25.00 5.62 25.87 5.12 25.87 4.12 25.00 3.62 24.13 4.12 24.13 5.12 TH +27.00 5.62 27.87 5.12 27.87 4.12 27.00 3.62 26.13 4.12 26.13 5.12 TH +29.00 5.62 29.87 5.12 29.87 4.12 29.00 3.62 28.13 4.12 28.13 5.12 TH +39.00 5.62 39.87 5.12 39.87 4.12 39.00 3.62 38.13 4.12 38.13 5.12 TH +43.00 5.62 43.87 5.12 43.87 4.12 43.00 3.62 42.13 4.12 42.13 5.12 TH +45.00 5.62 45.87 5.12 45.87 4.12 45.00 3.62 44.13 4.12 44.13 5.12 TH +49.00 5.62 49.87 5.12 49.87 4.12 49.00 3.62 48.13 4.12 48.13 5.12 TH +51.00 5.62 51.87 5.12 51.87 4.12 51.00 3.62 50.13 4.12 50.13 5.12 TH +53.00 5.62 53.87 5.12 53.87 4.12 53.00 3.62 52.13 4.12 52.13 5.12 TH +59.00 5.62 59.87 5.12 59.87 4.12 59.00 3.62 58.13 4.12 58.13 5.12 TH +6.00 3.89 6.87 3.39 6.87 2.39 6.00 1.89 5.13 2.39 5.13 3.39 TH +12.00 3.89 12.87 3.39 12.87 2.39 12.00 1.89 11.13 2.39 11.13 3.39 TH +14.00 3.89 14.87 3.39 14.87 2.39 14.00 1.89 13.13 2.39 13.13 3.39 TH +18.00 3.89 18.87 3.39 18.87 2.39 18.00 1.89 17.13 2.39 17.13 3.39 TH +20.00 3.89 20.87 3.39 20.87 2.39 20.00 1.89 19.13 2.39 19.13 3.39 TH +22.00 3.89 22.87 3.39 22.87 2.39 22.00 1.89 21.13 2.39 21.13 3.39 TH +24.00 3.89 24.87 3.39 24.87 2.39 24.00 1.89 23.13 2.39 23.13 3.39 TH +26.00 3.89 26.87 3.39 26.87 2.39 26.00 1.89 25.13 2.39 25.13 3.39 TH +30.00 3.89 30.87 3.39 30.87 2.39 30.00 1.89 29.13 2.39 29.13 3.39 TH +32.00 3.89 32.87 3.39 32.87 2.39 32.00 1.89 31.13 2.39 31.13 3.39 TH +36.00 3.89 36.87 3.39 36.87 2.39 36.00 1.89 35.13 2.39 35.13 3.39 TH +38.00 3.89 38.87 3.39 38.87 2.39 38.00 1.89 37.13 2.39 37.13 3.39 TH +42.00 3.89 42.87 3.39 42.87 2.39 42.00 1.89 41.13 2.39 41.13 3.39 TH +46.00 3.89 46.87 3.39 46.87 2.39 46.00 1.89 45.13 2.39 45.13 3.39 TH +52.00 3.89 52.87 3.39 52.87 2.39 52.00 1.89 51.13 2.39 51.13 3.39 TH +54.00 3.89 54.87 3.39 54.87 2.39 54.00 1.89 53.13 2.39 53.13 3.39 TH +56.00 3.89 56.87 3.39 56.87 2.39 56.00 1.89 55.13 2.39 55.13 3.39 TH +5.00 2.15 5.87 1.65 5.87 0.65 5.00 0.15 4.13 0.65 4.13 1.65 TH +9.00 2.15 9.87 1.65 9.87 0.65 9.00 0.15 8.13 0.65 8.13 1.65 TH +11.00 2.15 11.87 1.65 11.87 0.65 11.00 0.15 10.13 0.65 10.13 1.65 TH +25.00 2.15 25.87 1.65 25.87 0.65 25.00 0.15 24.13 0.65 24.13 1.65 TH +27.00 2.15 27.87 1.65 27.87 0.65 27.00 0.15 26.13 0.65 26.13 1.65 TH +29.00 2.15 29.87 1.65 29.87 0.65 29.00 0.15 28.13 0.65 28.13 1.65 TH +31.00 2.15 31.87 1.65 31.87 0.65 31.00 0.15 30.13 0.65 30.13 1.65 TH +35.00 2.15 35.87 1.65 35.87 0.65 35.00 0.15 34.13 0.65 34.13 1.65 TH +37.00 2.15 37.87 1.65 37.87 0.65 37.00 0.15 36.13 0.65 36.13 1.65 TH +43.00 2.15 43.87 1.65 43.87 0.65 43.00 0.15 42.13 0.65 42.13 1.65 TH +53.00 2.15 53.87 1.65 53.87 0.65 53.00 0.15 52.13 0.65 52.13 1.65 TH +29.00 28.87 9.00 TD 1.00 1.00 1.00 setrgbcolor -35.76 36.40 8.97 TD +29.00 28.87 7.43 TD 0.00 0.00 0.00 setrgbcolor -35.76 36.40 7.10 TD +29.00 28.87 5.86 TD 1.00 1.00 1.00 setrgbcolor -35.76 36.40 5.22 TD +29.00 28.87 4.29 TD 0.00 0.00 0.00 setrgbcolor -35.76 36.40 3.31 TD +29.00 28.87 2.72 TD 1.00 1.00 1.00 setrgbcolor -35.76 36.40 1.43 TD +29.00 28.87 1.15 TD diff --git a/backend/tests/data/print/gif/maxicode_fig_2.gif b/backend/tests/data/print/gif/maxicode_fig_2.gif index c30526e8..59093ef4 100644 Binary files a/backend/tests/data/print/gif/maxicode_fig_2.gif and b/backend/tests/data/print/gif/maxicode_fig_2.gif differ diff --git a/backend/tests/data/print/pcx/maxicode_fig_2.pcx b/backend/tests/data/print/pcx/maxicode_fig_2.pcx index fe4046ec..3f5440c7 100644 Binary files a/backend/tests/data/print/pcx/maxicode_fig_2.pcx and b/backend/tests/data/print/pcx/maxicode_fig_2.pcx differ diff --git a/backend/tests/data/print/png/maxicode_fig_2.png b/backend/tests/data/print/png/maxicode_fig_2.png index 8f862199..64787048 100644 Binary files a/backend/tests/data/print/png/maxicode_fig_2.png and b/backend/tests/data/print/png/maxicode_fig_2.png differ 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 d18f02ee..e7c50516 100644 Binary files a/backend/tests/data/print/tif/maxicode_fig_2.tif and b/backend/tests/data/print/tif/maxicode_fig_2.tif differ 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); }