easylogo: add lzma support
authorMike Frysinger <vapier@gentoo.org>
Fri, 3 Feb 2012 16:16:59 +0000 (16:16 +0000)
committerWolfgang Denk <wd@denx.de>
Tue, 19 Jun 2012 20:33:55 +0000 (22:33 +0200)
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>
tools/easylogo/easylogo.c

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