From 47cac63e7f935ab77600fae03084afbd63e73c4b Mon Sep 17 00:00:00 2001 From: Robin Stuart Date: Sun, 2 Aug 2020 22:26:39 +0100 Subject: [PATCH] Add alpha channel support and --nobackground option Alpha channel for PNG and SVG and option to remove background from EMF --- backend/emf.c | 31 +++++++++++++++-------- backend/library.c | 3 +++ backend/output.c | 6 ++--- backend/png.c | 44 +++++++++++++++++++++++++++----- backend/raster.c | 28 +++++++++++++++++++++ backend/svg.c | 64 +++++++++++++++++++++++++++++++++++++++-------- backend/zint.h | 36 +++----------------------- docs/manual.txt | 46 +++++++++++++++++++++++++++------- frontend/main.c | 9 +++++-- 9 files changed, 195 insertions(+), 72 deletions(-) diff --git a/backend/emf.c b/backend/emf.c index d1e6e07f..cabf5bd5 100644 --- a/backend/emf.c +++ b/backend/emf.c @@ -186,6 +186,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) { int rectangle_count_bycolour[8]; unsigned char *this_string[6]; uint32_t spacing; + int draw_background = 1; float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy; @@ -223,6 +224,12 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) { bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + if (strlen(symbol->bgcolour) > 6) { + if ((ctoi(symbol->bgcolour[6]) == 0) && (ctoi(symbol->bgcolour[7]) == 0)) { + draw_background = 0; + } + } rectangle_count = count_rectangles(symbol); circle_count = count_circles(symbol); @@ -372,15 +379,17 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) { bytecount += 12; recordcount++; - /* Make background from a rectangle */ - background.type = 0x0000002b; // EMR_RECTANGLE; - background.size = 24; - background.box.top = 0; - background.box.left = 0; - background.box.right = emr_header.emf_header.bounds.right; - background.box.bottom = emr_header.emf_header.bounds.bottom; - bytecount += 24; - recordcount++; + if (draw_background) { + /* Make background from a rectangle */ + background.type = 0x0000002b; // EMR_RECTANGLE; + background.size = 24; + background.box.top = 0; + background.box.left = 0; + background.box.right = emr_header.emf_header.bounds.right; + background.box.bottom = emr_header.emf_header.bounds.bottom; + bytecount += 24; + recordcount++; + } //Rectangles rect = symbol->vector->rectangles; @@ -578,7 +587,9 @@ INTERNAL int emf_plot(struct zint_symbol *symbol) { fwrite(&emr_selectobject_bgbrush, sizeof (emr_selectobject_t), 1, emf_file); fwrite(&emr_selectobject_pen, sizeof (emr_selectobject_t), 1, emf_file); - fwrite(&background, sizeof (emr_rectangle_t), 1, emf_file); + if (draw_background) { + fwrite(&background, sizeof (emr_rectangle_t), 1, emf_file); + } if (symbol->symbology == BARCODE_ULTRA) { for(i = 0; i < 8; i++) { diff --git a/backend/library.c b/backend/library.c index 51ee5b74..8b8e76ae 100644 --- a/backend/library.c +++ b/backend/library.c @@ -55,7 +55,9 @@ struct zint_symbol *ZBarcode_Create() { symbol->rows = 0; symbol->width = 0; strcpy(symbol->fgcolour, "000000"); + symbol->fgcolor = &symbol->fgcolour[0]; strcpy(symbol->bgcolour, "ffffff"); + symbol->bgcolor = &symbol->bgcolour[0]; strcpy(symbol->outfile, "out.png"); symbol->scale = 1.0; symbol->option_1 = -1; @@ -67,6 +69,7 @@ struct zint_symbol *ZBarcode_Create() { symbol->bitmap = NULL; symbol->bitmap_width = 0; symbol->bitmap_height = 0; + symbol->alphamap = NULL; symbol->eci = 0; // Default 0 uses ECI 3 symbol->dot_size = 4.0 / 5.0; symbol->vector = NULL; diff --git a/backend/output.c b/backend/output.c index 8738d31d..d1b47e99 100644 --- a/backend/output.c +++ b/backend/output.c @@ -39,11 +39,11 @@ INTERNAL int output_check_colour_options(struct zint_symbol *symbol) { int error_number; - if (strlen(symbol->fgcolour) != 6) { + if ((strlen(symbol->fgcolour) != 6) && (strlen(symbol->fgcolour) != 8)) { strcpy(symbol->errtxt, "651: Malformed foreground colour target"); return ZINT_ERROR_INVALID_OPTION; } - if (strlen(symbol->bgcolour) != 6) { + if ((strlen(symbol->bgcolour) != 6) && (strlen(symbol->bgcolour) != 8)) { strcpy(symbol->errtxt, "652: Malformed background colour target"); return ZINT_ERROR_INVALID_OPTION; } @@ -57,7 +57,7 @@ INTERNAL int output_check_colour_options(struct zint_symbol *symbol) { return ZINT_ERROR_INVALID_OPTION; } - error_number = is_sane(SSET, (unsigned char *) symbol->bgcolour, strlen(symbol->fgcolour)); + error_number = is_sane(SSET, (unsigned char *) symbol->bgcolour, strlen(symbol->bgcolour)); if (error_number == ZINT_ERROR_INVALID_DATA) { strcpy(symbol->errtxt, "654: Malformed background colour target"); return ZINT_ERROR_INVALID_OPTION; diff --git a/backend/png.c b/backend/png.c index f2e41f14..6a826e4a 100644 --- a/backend/png.c +++ b/backend/png.c @@ -79,11 +79,12 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { png_infop info_ptr; int i, row, column; int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int fgalpha, bgalpha, use_alpha; #ifndef _MSC_VER - unsigned char outdata[symbol->bitmap_width * 3]; + unsigned char outdata[symbol->bitmap_width * 4]; #else - unsigned char* outdata = (unsigned char*) _alloca(symbol->bitmap_width * 3); + unsigned char* outdata = (unsigned char*) _alloca(symbol->bitmap_width * 4); #endif graphic = &wpng_info; @@ -98,6 +99,22 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + use_alpha = 0; + + if (strlen(symbol->fgcolour) > 6) { + fgalpha = (16 * ctoi(symbol->fgcolour[6])) + ctoi(symbol->fgcolour[7]); + if (fgalpha != 0xff) use_alpha = 1; + } else { + fgalpha = 0xff; + } + + if (strlen(symbol->bgcolour) > 6) { + bgalpha = (16 * ctoi(symbol->bgcolour[6])) + ctoi(symbol->bgcolour[7]); + if (bgalpha != 0xff) use_alpha = 1; + } else { + bgalpha = 0xff; + } + /* Open output file in binary mode */ if (symbol->output_options & BARCODE_STDOUT) { #ifdef _MSC_VER @@ -142,10 +159,14 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { png_set_compression_level(png_ptr, 9); /* set Header block */ - png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height, - 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - + if (use_alpha) + png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height, + 8, PNG_COLOR_TYPE_RGBA, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + else + png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); /* write all chunks up to (but not including) first IDAT */ png_write_info(png_ptr, info_ptr); @@ -158,56 +179,67 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { unsigned char *image_data; for (column = 0; column < symbol->bitmap_width; column++) { i = column * 3; + if (use_alpha) i += column; switch (*(pixelbuf + (symbol->bitmap_width * row) + column)) { case 'W': // White outdata[i] = 255; outdata[i + 1] = 255; outdata[i + 2] = 255; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'C': // Cyan outdata[i] = 0; outdata[i + 1] = 255; outdata[i + 2] = 255; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'B': // Blue outdata[i] = 0; outdata[i + 1] = 0; outdata[i + 2] = 255; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'M': // Magenta outdata[i] = 255; outdata[i + 1] = 0; outdata[i + 2] = 255; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'R': // Red outdata[i] = 255; outdata[i + 1] = 0; outdata[i + 2] = 0; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'Y': // Yellow outdata[i] = 255; outdata[i + 1] = 255; outdata[i + 2] = 0; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'G': // Green outdata[i] = 0; outdata[i + 1] = 255; outdata[i + 2] = 0; + if (use_alpha) outdata[i + 3] = fgalpha; break; case 'K': // Black outdata[i] = 0; outdata[i + 1] = 0; outdata[i + 2] = 0; + if (use_alpha) outdata[i + 3] = fgalpha; break; case '1': outdata[i] = fgred; outdata[i + 1] = fggrn; outdata[i + 2] = fgblu; + if (use_alpha) outdata[i + 3] = fgalpha; break; default: outdata[i] = bgred; outdata[i + 1] = bggrn; outdata[i + 2] = bgblu; + if (use_alpha) outdata[i + 3] = bgalpha; break; } diff --git a/backend/raster.c b/backend/raster.c index aaf93359..0c03d68e 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -62,6 +62,7 @@ static const char ultra_colour[] = "WCBMRYGK"; static int buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { /* Place pixelbuffer into symbol */ int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int fgalpha, bgalpha; int row, column, i; /* Free any previous bitmap */ @@ -74,6 +75,11 @@ static int buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { strcpy(symbol->errtxt, "661: Insufficient memory for bitmap buffer"); return ZINT_ERROR_MEMORY; } + symbol->alphamap = (unsigned char *) malloc(symbol->bitmap_width * symbol->bitmap_height); + if (symbol->alphamap == NULL) { + strcpy(symbol->errtxt, "662: Insufficient memory for alphamap buffer"); + return ZINT_ERROR_MEMORY; + } fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); @@ -81,6 +87,18 @@ static int buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + if (strlen(symbol->fgcolour) > 6) { + fgalpha = (16 * ctoi(symbol->fgcolour[6])) + ctoi(symbol->fgcolour[7]); + } else { + fgalpha = 0xff; + } + + if (strlen(symbol->bgcolour) > 6) { + bgalpha = (16 * ctoi(symbol->bgcolour[6])) + ctoi(symbol->bgcolour[7]); + } else { + bgalpha = 0xff; + } for (row = 0; row < symbol->bitmap_height; row++) { for (column = 0; column < symbol->bitmap_width; column++) { @@ -90,51 +108,61 @@ static int buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { symbol->bitmap[i] = 255; symbol->bitmap[i + 1] = 255; symbol->bitmap[i + 2] = 255; + symbol->alphamap[i / 3] = fgalpha; break; case 'C': // Cyan symbol->bitmap[i] = 0; symbol->bitmap[i + 1] = 255; symbol->bitmap[i + 2] = 255; + symbol->alphamap[i / 3] = fgalpha; break; case 'B': // Blue symbol->bitmap[i] = 0; symbol->bitmap[i + 1] = 0; symbol->bitmap[i + 2] = 255; + symbol->alphamap[i / 3] = fgalpha; break; case 'M': // Magenta symbol->bitmap[i] = 255; symbol->bitmap[i + 1] = 0; symbol->bitmap[i + 2] = 255; + symbol->alphamap[i / 3] = fgalpha; break; case 'R': // Red symbol->bitmap[i] = 255; symbol->bitmap[i + 1] = 0; symbol->bitmap[i + 2] = 0; + symbol->alphamap[i / 3] = fgalpha; break; case 'Y': // Yellow symbol->bitmap[i] = 255; symbol->bitmap[i + 1] = 255; symbol->bitmap[i + 2] = 0; + symbol->alphamap[i / 3] = fgalpha; break; case 'G': // Green symbol->bitmap[i] = 0; symbol->bitmap[i + 1] = 255; symbol->bitmap[i + 2] = 0; + symbol->alphamap[i / 3] = fgalpha; break; case 'K': // Black symbol->bitmap[i] = 0; symbol->bitmap[i + 1] = 0; symbol->bitmap[i + 2] = 0; + symbol->alphamap[i / 3] = fgalpha; break; case DEFAULT_INK: symbol->bitmap[i] = fgred; symbol->bitmap[i + 1] = fggrn; symbol->bitmap[i + 2] = fgblu; + symbol->alphamap[i / 3] = fgalpha; break; default: // DEFAULT_PAPER symbol->bitmap[i] = bgred; symbol->bitmap[i + 1] = bggrn; symbol->bitmap[i + 2] = bgblu; + symbol->alphamap[i / 3] = bgalpha; break; } } diff --git a/backend/svg.c b/backend/svg.c index 98cca3d9..3c0d1c34 100644 --- a/backend/svg.c +++ b/backend/svg.c @@ -121,6 +121,10 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy; float radius; int i; + char fgcolour_string[7]; + char bgcolour_string[7]; + int bg_alpha = 0xff; + int fg_alpha = 0xff; struct zint_vector_rect *rect; struct zint_vector_hexagon *hex; @@ -133,6 +137,20 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { char* html_string; #endif + for (i = 0; i < 6; i++) { + fgcolour_string[i] = symbol->fgcolour[i]; + bgcolour_string[i] = symbol->bgcolour[i]; + } + fgcolour_string[6] = '\0'; + bgcolour_string[6] = '\0'; + + if (strlen(symbol->fgcolour) > 6) { + fg_alpha = (16 * ctoi(symbol->fgcolour[6])) + ctoi(symbol->fgcolour[7]); + } + if (strlen(symbol->bgcolour) > 6) { + bg_alpha = (16 * ctoi(symbol->bgcolour[6])) + ctoi(symbol->bgcolour[7]); + } + int html_len = strlen((char *)symbol->text) + 1; for (i = 0; i < (int) strlen((char *)symbol->text); i++) { @@ -178,18 +196,27 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { fprintf(fsvg, " xmlns=\"http://www.w3.org/2000/svg\">\n"); fprintf(fsvg, " Zint Generated Symbol\n"); fprintf(fsvg, " \n"); - fprintf(fsvg, "\n \n", symbol->fgcolour); + fprintf(fsvg, "\n \n", fgcolour_string); - fprintf(fsvg, " \n", (int) ceil(symbol->vector->width), (int) ceil(symbol->vector->height), symbol->bgcolour); + if (bg_alpha != 0) { + fprintf(fsvg, " vector->width), (int) ceil(symbol->vector->height), bgcolour_string); + if (bg_alpha != 0xff) { + fprintf(fsvg, " opacity=\"%.3f\"", (float) bg_alpha / 255.0); + } + fprintf(fsvg, " />\n"); + } rect = symbol->vector->rectangles; while (rect) { - if (rect->colour == -1) { - fprintf(fsvg, " \n", rect->x, rect->y, rect->width, rect->height); - } else { + fprintf(fsvg, " x, rect->y, rect->width, rect->height); + if (rect->colour != -1) { pick_colour(rect->colour, colour_code); - fprintf(fsvg, " \n", rect->x, rect->y, rect->width, rect->height, colour_code); + fprintf(fsvg, " fill=\"#%s\"", colour_code); } + if (fg_alpha != 0xff) { + fprintf(fsvg, " opacity=\"%.3f\"", (float) fg_alpha / 255.0); + } + fprintf(fsvg, " />\n"); rect = rect->next; } @@ -208,24 +235,41 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { dx = hex->x; ex = hex->x - (0.86 * radius); fx = hex->x - (0.86 * radius); - fprintf(fsvg, " \n", ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy); + fprintf(fsvg, " \n"); hex = hex->next; } circle = symbol->vector->circles; while (circle) { + fprintf(fsvg, " x, circle->y, circle->diameter / 2.0); + if (circle->colour) { - fprintf(fsvg, " \n", circle->x, circle->y, circle->diameter / 2.0, symbol->bgcolour); + fprintf(fsvg, " fill=\"#%s\"", bgcolour_string); + if (bg_alpha != 0xff) { + // This doesn't work how the user is likely to expect - more work needed! + fprintf(fsvg, " opacity=\"%.3f\"", (float) bg_alpha / 255.0); + } } else { - fprintf(fsvg, " \n", circle->x, circle->y, circle->diameter / 2.0, symbol->fgcolour); + if (fg_alpha != 0xff) { + fprintf(fsvg, " opacity=\"%.3f\"", (float) fg_alpha / 255.0); + } } + fprintf(fsvg, " />\n"); circle = circle->next; } string = symbol->vector->strings; while (string) { fprintf(fsvg, " x, string->y); - fprintf(fsvg, " font-family=\"Helvetica\" font-size=\"%.1f\" fill=\"#%s\" >\n", string->fsize, symbol->fgcolour); + fprintf(fsvg, " font-family=\"Helvetica\" font-size=\"%.1f\"", string->fsize); + if (fg_alpha != 0xff) { + fprintf(fsvg, " opacity=\"%.3f\"", (float) fg_alpha / 255.0); + } + fprintf(fsvg, " >\n"); make_html_friendly(string->text, html_string); fprintf(fsvg, " %s\n", html_string); fprintf(fsvg, " \n"); diff --git a/backend/zint.h b/backend/zint.h index 6c65ab49..1b6de080 100644 --- a/backend/zint.h +++ b/backend/zint.h @@ -37,25 +37,12 @@ extern "C" { #endif /* __cplusplus */ - struct zint_render_line { - float x, y, length, width; - struct zint_render_line *next; /* Pointer to next line */ - }; - struct zint_vector_rect { float x, y, height, width; int colour; struct zint_vector_rect *next; }; - - struct zint_render_string { - float x, y, fsize; - float width; /* Suggested string width, may be 0 if none recommended */ - int length; - unsigned char *text; - struct zint_render_string *next; /* Pointer to next character */ - }; - + struct zint_vector_string { float x, y, fsize; float width; /* Suggested string width, may be 0 if none recommended */ @@ -64,35 +51,17 @@ extern "C" { struct zint_vector_string *next; /* Pointer to next character */ }; - struct zint_render_ring { - float x, y, radius, line_width; - struct zint_render_ring *next; /* Pointer to next ring */ - }; - struct zint_vector_circle { float x, y, diameter; int colour; struct zint_vector_circle *next; /* Pointer to next circle */ }; - struct zint_render_hexagon { - float x, y, height; - struct zint_render_hexagon *next; /* Pointer to next hexagon */ - }; - struct zint_vector_hexagon { float x, y, diameter; struct zint_vector_hexagon *next; /* Pointer to next hexagon */ }; - struct zint_render { - float width, height; - struct zint_render_line *lines; /* Pointer to first line */ - struct zint_render_string *strings; /* Pointer to first string */ - struct zint_render_ring *rings; /* Pointer to first ring */ - struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */ - }; - struct zint_vector { float width, height; struct zint_vector_rect *rectangles; /* Pointer to first rectangle */ @@ -108,7 +77,9 @@ extern "C" { int border_width; int output_options; char fgcolour[10]; + char *fgcolor; // pointer to fgcolour char bgcolour[10]; + char *bgcolor; // pointer to bgcolour char outfile[256]; float scale; int option_1; @@ -128,6 +99,7 @@ extern "C" { unsigned char *bitmap; int bitmap_width; int bitmap_height; + unsigned char *alphamap; unsigned int bitmap_byte_length; float dot_size; struct zint_vector *vector; diff --git a/docs/manual.txt b/docs/manual.txt index 535cc179..b56451dd 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -1,6 +1,7 @@ ******************************************************************************* * For reference the following is a text-only version of the Zint manual. * -* The full version can be accessed at http://zint.org.uk/Manual.aspx * +* The HTML version can be accessed at http://zint.org.uk/Manual.aspx * +* however this text file is more likely to be up-to-date. * ******************************************************************************* Zint Barcode Generator and Zint Barcode Studio User Manual @@ -402,6 +403,24 @@ zint --fg=004700 -d "This" alters the symbol to a dark green. +Zint also supports RGBA colour information for some output file formats which +support alpha channels (currently only PNG and SVG) in a RRGGBBAA format. +For example: + +zint --fg=00ff0055 -d "This" + +will produce a semi-transparent green foreground with standard (white) +background. Note that transparency is handled differently for raster and +vector files so that... + +zint --bg=ff0000 --fg=ffffff00 ... + +will give different results for PNG and SVG. Experimentation is advised! +Also note that these options don't work properly with Maxicode yet. + +In addition the --nobackground option will simply remove the background from +PNG, SVG and EMF files. + 4.8 Rotating the Symbol ----------------------- The symbol can be rotated through four orientations using the --rotate= option @@ -827,15 +846,19 @@ output_options | integer | Set various output file | 0 (none) | | parameters (see section | | | 5.8). | fgcolour | character | Foreground (ink) colour as | "000000" - | string | RGB hexadecimal string. | - | | Must be 6 characters | - | | followed by terminating | - | | \0 character. | + | string | RGB/RGBA hexadecimal | + | | string. Must be 6 or 8 | + | | characters followed by | + | | terminating \0. | +fgcolor | pointer | Points to fgcolour allowing | + | | alternate spelling. | bgcolour | character | Background (paper) colour | "ffffff" - | string | as RGB hexadecimal | - | | string. Must be 6 chara- | - | | ters followed by termin- | - | | ating \0 character. | + | string | as RGB/RGBA hexadecimal | + | | string. Must be 6 or 8 | + | | characters followed by | + | | terminating \0. | +bgcolor | pointer | Points to bgcolour allowing | + | | alternate spelling. | outfile | character | Contains the name of the | "out.png" | string | file to output a result- | | | ing barcode symbol to. | @@ -903,6 +926,11 @@ int main(int argc, char **argv) return 0; } +Background removal for PNG, SVG and EMF files can be achieved by setting the +background alpha to "00" where the values for R, G and B will be ignored: + +strcpy(my_symbol->bgcolour, "55555500"); + 5.6 Handling Errors ------------------- If errors occur during encoding an integer value is passed back to the calling diff --git a/frontend/main.c b/frontend/main.c index 58b72d88..80b4f089 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -108,6 +108,7 @@ static void usage(void) { " --init Create reader initialisation/programming symbol\n" " --mirror Use batch data to determine filename\n" " --mode=NUMBER Set encoding mode (Maxicode/Composite)\n" + " --nobackground Remove background (PNG/SVG/EPS only)\n" " --notext Remove human readable text\n" " -o, --output=FILE Send output to FILE. Default is out.png\n" " --primary=STRING Set structured primary message (Maxicode/Composite)\n" @@ -508,6 +509,7 @@ int main(int argc, char **argv) { {"gssep", 0, 0, 0}, {"binary", 0, 0, 0}, {"fullmultibyte", 0, 0, 0}, + {"nobackground", 0, 0, 0}, {"notext", 0, 0, 0}, {"square", 0, 0, 0}, {"dmre", 0, 0, 0}, @@ -574,10 +576,10 @@ int main(int argc, char **argv) { } } if (!strcmp(long_options[option_index].name, "fg")) { - strncpy(my_symbol->fgcolour, optarg, 7); + strncpy(my_symbol->fgcolour, optarg, 9); } if (!strcmp(long_options[option_index].name, "bg")) { - strncpy(my_symbol->bgcolour, optarg, 7); + strncpy(my_symbol->bgcolour, optarg, 9); } if (!strcmp(long_options[option_index].name, "fullmultibyte")) { fullmultibyte = 1; @@ -806,6 +808,9 @@ int main(int argc, char **argv) { fflush(stderr); } } + if (!strcmp(long_options[option_index].name, "nobackground")) { + strcpy(my_symbol->bgcolour, "ffffff00"); + } break; case 'h':