easylogo: add support for 16-bit RGB565
authorMichael Hennerich <michael.hennerich@analog.com>
Sat, 19 Dec 2009 13:19:09 +0000 (08:19 -0500)
committerWolfgang Denk <wd@denx.de>
Sun, 17 Jan 2010 23:21:05 +0000 (00:21 +0100)
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
tools/easylogo/easylogo.c

index 41e5838..d9b33fa 100644 (file)
@@ -276,6 +276,35 @@ int image_rgb_to_yuyv (image_t * rgb_image, image_t * yuyv_image)
        return 0;
 }
 
+int image_rgb888_to_rgb565(image_t *rgb888_image, image_t *rgb565_image)
+{
+       rgb_t *rgb_ptr = (rgb_t *) rgb888_image->data;
+       unsigned short *dest;
+       int count = 0;
+
+       rgb565_image->pixel_size = 2;
+       rgb565_image->bpp = 16;
+       rgb565_image->yuyv = 0;
+       rgb565_image->width = rgb888_image->width;
+       rgb565_image->height = rgb888_image->height;
+       rgb565_image->pixels = rgb565_image->width * rgb565_image->height;
+       rgb565_image->size = rgb565_image->pixels * rgb565_image->pixel_size;
+       dest = (unsigned short *) (rgb565_image->data =
+                                  xmalloc(rgb565_image->size));
+       rgb565_image->palette = 0;
+       rgb565_image->palette_size = 0;
+
+       while ((count++) < rgb888_image->pixels) {
+
+               *dest++ = ((rgb_ptr->b & 0xF8) << 8) |
+                       ((rgb_ptr->g & 0xFC) << 3) |
+                       (rgb_ptr->r >> 3);
+               rgb_ptr++;
+       }
+
+       return 0;
+}
+
 int use_gzip = 0;
 
 int image_save_header (image_t * image, char *filename, char *varname)
@@ -434,7 +463,8 @@ static void usage (int exit_status)
                "Syntax:        easylogo [options] inputfile [outputvar [outputfile]]\n"
                "\n"
                "Options:\n"
-               "  -r     Output RGB instead of YUYV\n"
+               "  -r     Output RGB888 instead of YUYV\n"
+               "  -s     Output RGB565 instead of YUYV\n"
                "  -g     Compress with gzip\n"
                "  -b     Preallocate space in bss for decompressing image\n"
                "  -h     Help output\n"
@@ -449,20 +479,25 @@ static void usage (int exit_status)
 int main (int argc, char *argv[])
 {
        int c;
-       bool use_rgb = false;
+       bool use_rgb888 = false;
+       bool use_rgb565 = false;
        char inputfile[DEF_FILELEN],
                outputfile[DEF_FILELEN], varname[DEF_FILELEN];
 
-       image_t rgb_logo, yuyv_logo;
+       image_t rgb888_logo, rgb565_logo, yuyv_logo;
 
-       while ((c = getopt(argc, argv, "hrgb")) > 0) {
+       while ((c = getopt(argc, argv, "hrsgb")) > 0) {
                switch (c) {
                case 'h':
                        usage (0);
                        break;
                case 'r':
-                       use_rgb = true;
-                       puts ("Using 24-bit RGB Output Fromat");
+                       use_rgb888 = true;
+                       puts("Using 24-bit RGB888 Output Fromat");
+                       break;
+               case 's':
+                       use_rgb565 = true;
+                       puts("Using 16-bit RGB565 Output Fromat");
                        break;
                case 'g':
                        use_gzip |= 0x1;
@@ -512,28 +547,35 @@ int main (int argc, char *argv[])
        /* Import TGA logo */
 
        printf ("L");
-       if (image_load_tga (&rgb_logo, inputfile) < 0) {
+       if (image_load_tga(&rgb888_logo, inputfile) < 0) {
                printf ("input file not found!\n");
                exit (1);
        }
 
-       /* Convert it to YUYV format if wanted */
+       /* Convert, save, and free the image */
 
-       if (!use_rgb) {
+       if (!use_rgb888 && !use_rgb565) {
                printf ("C");
-               image_rgb_to_yuyv (&rgb_logo, &yuyv_logo);
+               image_rgb_to_yuyv(&rgb888_logo, &yuyv_logo);
+
+               printf("S");
+               image_save_header(&yuyv_logo, outputfile, varname);
+               image_free(&yuyv_logo);
+       } else if (use_rgb565) {
+               printf("C");
+               image_rgb888_to_rgb565(&rgb888_logo, &rgb565_logo);
+
+               printf("S");
+               image_save_header(&rgb565_logo, outputfile, varname);
+               image_free(&rgb565_logo);
+       } else {
+               printf("S");
+               image_save_header(&rgb888_logo, outputfile, varname);
        }
 
-       /* Save it into a header format */
-
-       printf ("S");
-       image_save_header (use_rgb ? &rgb_logo : &yuyv_logo, outputfile, varname);
-
        /* Free original image and copy */
 
-       image_free (&rgb_logo);
-       if (!use_rgb)
-               image_free (&yuyv_logo);
+       image_free(&rgb888_logo);
 
        printf ("\n");