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':