easylogo: add lzma support

Compressing the logos with lzma rather than gzip saves ~9kb with the
Blackfin 24bit images and ~3kb with the 16bit images.

Add a new -l option to easylogo so people can pick lzma as their
decompression routine.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
master
Mike Frysinger 13 years ago committed by Wolfgang Denk
parent feb12a1f6d
commit 1a3cb4ad64
  1. 85
      tools/easylogo/easylogo.c

@ -305,7 +305,13 @@ int image_rgb888_to_rgb565(image_t *rgb888_image, image_t *rgb565_image)
return 0; return 0;
} }
int use_gzip = 0; enum comp_t {
COMP_NONE,
COMP_GZIP,
COMP_LZMA,
};
static enum comp_t compression = COMP_NONE;
static bool bss_storage = false;
int image_save_header (image_t * image, char *filename, char *varname) int image_save_header (image_t * image, char *filename, char *varname)
{ {
@ -329,58 +335,74 @@ int image_save_header (image_t * image, char *filename, char *varname)
fprintf (file, " *\t\t'x'\t\tis the horizontal position\n"); fprintf (file, " *\t\t'x'\t\tis the horizontal position\n");
fprintf (file, " *\t\t'y'\t\tis the vertical position\n */\n\n"); fprintf (file, " *\t\t'y'\t\tis the vertical position\n */\n\n");
/* gzip compress */ /* image compress */
if (use_gzip & 0x1) { if (compression != COMP_NONE) {
const char *errstr = NULL; const char *errstr = NULL;
unsigned char *compressed; unsigned char *compressed;
const char *comp_name;
struct stat st; struct stat st;
FILE *gz; FILE *compfp;
char *gzfilename = xmalloc(strlen (filename) + 20); size_t filename_len = strlen(filename);
char *gzcmd = xmalloc(strlen (filename) + 20); char *compfilename = xmalloc(filename_len + 20);
char *compcmd = xmalloc(filename_len + 50);
sprintf (gzfilename, "%s.gz", filename);
sprintf (gzcmd, "gzip > %s", gzfilename); sprintf(compfilename, "%s.bin", filename);
gz = popen (gzcmd, "w"); switch (compression) {
if (!gz) { case COMP_GZIP:
strcpy(compcmd, "gzip");
comp_name = "GZIP";
break;
case COMP_LZMA:
strcpy(compcmd, "lzma");
comp_name = "LZMA";
break;
default:
errstr = "\nerror: unknown compression method";
goto done;
}
strcat(compcmd, " > ");
strcat(compcmd, compfilename);
compfp = popen(compcmd, "w");
if (!compfp) {
errstr = "\nerror: popen() failed"; errstr = "\nerror: popen() failed";
goto done; goto done;
} }
if (fwrite (image->data, image->size, 1, gz) != 1) { if (fwrite(image->data, image->size, 1, compfp) != 1) {
errstr = "\nerror: writing data to gzip failed"; errstr = "\nerror: writing data to gzip failed";
goto done; goto done;
} }
if (pclose (gz)) { if (pclose(compfp)) {
errstr = "\nerror: gzip process failed"; errstr = "\nerror: gzip process failed";
goto done; goto done;
} }
gz = fopen (gzfilename, "r"); compfp = fopen(compfilename, "r");
if (!gz) { if (!compfp) {
errstr = "\nerror: open() on gzip data failed"; errstr = "\nerror: open() on gzip data failed";
goto done; goto done;
} }
if (stat (gzfilename, &st)) { if (stat(compfilename, &st)) {
errstr = "\nerror: stat() on gzip file failed"; errstr = "\nerror: stat() on gzip file failed";
goto done; goto done;
} }
compressed = xmalloc (st.st_size); compressed = xmalloc(st.st_size);
if (fread (compressed, st.st_size, 1, gz) != 1) { if (fread(compressed, st.st_size, 1, compfp) != 1) {
errstr = "\nerror: reading gzip data failed"; errstr = "\nerror: reading gzip data failed";
goto done; goto done;
} }
fclose (gz); fclose(compfp);
unlink (gzfilename); unlink(compfilename);
dataptr = compressed; dataptr = compressed;
count = st.st_size; count = st.st_size;
fprintf (file, "#define EASYLOGO_ENABLE_GZIP %i\n\n", count); fprintf(file, "#define EASYLOGO_ENABLE_%s %i\n\n", comp_name, count);
if (use_gzip & 0x2) if (bss_storage)
fprintf (file, "static unsigned char EASYLOGO_DECOMP_BUFFER[%i];\n\n", image->size); fprintf (file, "static unsigned char EASYLOGO_DECOMP_BUFFER[%i];\n\n", image->size);
done: done:
free (gzfilename); free(compfilename);
free (gzcmd); free(compcmd);
if (errstr) { if (errstr) {
perror (errstr); perror (errstr);
@ -466,6 +488,7 @@ static void usage (int exit_status)
" -r Output RGB888 instead of YUYV\n" " -r Output RGB888 instead of YUYV\n"
" -s Output RGB565 instead of YUYV\n" " -s Output RGB565 instead of YUYV\n"
" -g Compress with gzip\n" " -g Compress with gzip\n"
" -l Compress with lzma\n"
" -b Preallocate space in bss for decompressing image\n" " -b Preallocate space in bss for decompressing image\n"
" -h Help output\n" " -h Help output\n"
"\n" "\n"
@ -486,7 +509,7 @@ int main (int argc, char *argv[])
image_t rgb888_logo, rgb565_logo, yuyv_logo; image_t rgb888_logo, rgb565_logo, yuyv_logo;
while ((c = getopt(argc, argv, "hrsgb")) > 0) { while ((c = getopt(argc, argv, "hrsglb")) > 0) {
switch (c) { switch (c) {
case 'h': case 'h':
usage (0); usage (0);
@ -500,12 +523,16 @@ int main (int argc, char *argv[])
puts("Using 16-bit RGB565 Output Fromat"); puts("Using 16-bit RGB565 Output Fromat");
break; break;
case 'g': case 'g':
use_gzip |= 0x1; compression = COMP_GZIP;
puts ("Compressing with gzip"); puts("Compressing with gzip");
break;
case 'l':
compression = COMP_LZMA;
puts("Compressing with lzma");
break; break;
case 'b': case 'b':
use_gzip |= 0x2; bss_storage = true;
puts ("Preallocating bss space for decompressing image"); puts("Preallocating bss space for decompressing image");
break; break;
default: default:
usage (1); usage (1);

Loading…
Cancel
Save