1
0
mirror of https://git.code.sf.net/p/zint/code synced 2026-01-04 02:37:27 +00:00

Better compression for Ultracode in BMP

Also corrects colour shifting bug
File size is still bigger than it needs to be for Ultracode, but now uses 4bpp
This commit is contained in:
Robin Stuart
2020-08-12 13:19:56 +01:00
parent 20f767c4b6
commit b5e27d3e0b
5 changed files with 80 additions and 95 deletions

View File

@@ -52,10 +52,11 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
bitmap_info_header_t info_header;
color_ref_t bg_color_ref;
color_ref_t fg_color_ref;
color_ref_t ultra_color_ref[8];
if (symbol->symbology == BARCODE_ULTRA) {
bits_per_pixel = 24;
colour_count = 0;
bits_per_pixel = 4;
colour_count = 9;
} else {
bits_per_pixel = 1;
colour_count = 2;
@@ -63,9 +64,7 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
row_size = 4 * ((bits_per_pixel * symbol->bitmap_width + 31) / 32);
data_size = symbol->bitmap_height * row_size;
data_offset = sizeof (bitmap_file_header_t) + sizeof (bitmap_info_header_t);
if (symbol->symbology != BARCODE_ULTRA) {
data_offset += (2 * (sizeof(color_ref_t)));
}
data_offset += (colour_count * (sizeof(color_ref_t)));
file_size = data_offset + data_size;
bitmap_file_start = (unsigned char *) malloc(file_size);
@@ -85,64 +84,44 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
bg_color_ref.green = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
bg_color_ref.blue = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
bg_color_ref.reserved = 0x00;
for (i = 0; i < 8; i++) {
ultra_color_ref[i].red = colour_to_red(i + 1);
ultra_color_ref[i].green = colour_to_green(i + 1);
ultra_color_ref[i].blue = colour_to_blue(i + 1);
ultra_color_ref[i].reserved = 0x00;
}
/* Pixel Plotting */
if (symbol->symbology == BARCODE_ULTRA) {
for (row = 0; row < symbol->bitmap_height; row++) {
for (column = 0; column < symbol->bitmap_width; column++) {
i = (3 * column) + (row * row_size);
i = (column / 2) + (row * row_size);
switch (*(pixelbuf + (symbol->bitmap_width * (symbol->bitmap_height - row - 1)) + column)) {
case 'W': // White
bitmap[i] = 255;
bitmap[i + 1] = 255;
bitmap[i + 2] = 255;
break;
case 'C': // Cyan
bitmap[i] = 255;
bitmap[i + 1] = 255;
bitmap[i + 2] = 0;
bitmap[i] += 1 << (4 * (1 - (column % 2)));
break;
case 'B': // Blue
bitmap[i] = 255;
bitmap[i + 1] = 0;
bitmap[i + 2] = 0;
bitmap[i] += 2 << (4 * (1 - (column % 2)));
break;
case 'M': // Magenta
bitmap[i] = 255;
bitmap[i + 1] = 0;
bitmap[i + 2] = 255;
bitmap[i] += 3 << (4 * (1 - (column % 2)));
break;
case 'R': // Red
bitmap[i] = 0;
bitmap[i + 1] = 0;
bitmap[i + 2] = 255;
bitmap[i] += 4 << (4 * (1 - (column % 2)));
break;
case 'Y': // Yellow
bitmap[i] = 0;
bitmap[i + 1] = 255;
bitmap[i + 2] = 255;
bitmap[i] += 5 << (4 * (1 - (column % 2)));
break;
case 'G': // Green
bitmap[i] = 0;
bitmap[i + 1] = 255;
bitmap[i + 2] = 0;
bitmap[i] += 6 << (4 * (1 - (column % 2)));
break;
case 'K': // Black
bitmap[i] = 0;
bitmap[i + 1] = 0;
bitmap[i + 2] = 0;
bitmap[i] += 7 << (4 * (1 - (column % 2)));
break;
case '1':
bitmap[i] = fg_color_ref.blue;
bitmap[i + 1] = fg_color_ref.green;
bitmap[i + 2] = fg_color_ref.red;
case 'W': // White
bitmap[i] += 8 << (4 * (1 - (column % 2)));
break;
default:
bitmap[i] = bg_color_ref.blue;
bitmap[i + 1] = bg_color_ref.green;
bitmap[i + 2] = bg_color_ref.red;
break;
}
}
}
@@ -181,9 +160,14 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
bmp_posn += sizeof (bitmap_file_header_t);
memcpy(bmp_posn, &info_header, sizeof (bitmap_info_header_t));
if (symbol->symbology != BARCODE_ULTRA) {
bmp_posn += sizeof(bitmap_info_header_t);
memcpy(bmp_posn, &bg_color_ref, sizeof(color_ref_t));
bmp_posn += sizeof(bitmap_info_header_t);
memcpy(bmp_posn, &bg_color_ref, sizeof(color_ref_t));
if (symbol->symbology == BARCODE_ULTRA) {
for (i = 0; i < 8; i++) {
bmp_posn += sizeof(color_ref_t);
memcpy(bmp_posn, &ultra_color_ref[i], sizeof(color_ref_t));
}
} else {
bmp_posn += sizeof(color_ref_t);
memcpy(bmp_posn, &fg_color_ref, sizeof(color_ref_t));
}