Add alpha channel support and --nobackground option

Alpha channel for PNG and SVG and option to remove background from EMF
This commit is contained in:
Robin Stuart
2020-08-02 22:26:39 +01:00
parent 18e3b41e0f
commit 47cac63e7f
9 changed files with 195 additions and 72 deletions

View File

@ -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;
}
}