kwo pushed a commit to branch master.

http://git.enlightenment.org/legacy/imlib2.git/commit/?id=a2cb8276e5bff36f5564290a4162f4ab29d3e23b

commit a2cb8276e5bff36f5564290a4162f4ab29d3e23b
Author: Kim Woelders <k...@woelders.dk>
Date:   Fri Nov 15 20:09:44 2019 +0100

    TGA loader: Add simple 16 bpp handling
    
    Probably not entirely correct (N alpha bits?).
---
 src/modules/loaders/loader_tga.c | 71 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 70 insertions(+), 1 deletion(-)

diff --git a/src/modules/loaders/loader_tga.c b/src/modules/loaders/loader_tga.c
index 053c695..51cb6b8 100644
--- a/src/modules/loaders/loader_tga.c
+++ b/src/modules/loaders/loader_tga.c
@@ -188,12 +188,13 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    tga_header         *header;
    tga_footer         *footer;
    int                 footer_present;
-   int                 rle, bpp, hasa, fliph, flipv;
+   int                 rle, bpp, hasa, hasc, fliph, flipv;
    unsigned long       datasize;
    unsigned char      *bufptr, *bufend, *palette = 0;
    DATA32             *dataptr;
    int                 palcnt = 0, palbpp = 0;
    unsigned char       a, r, g, b;
+   unsigned int        pix16;
 
    fd = open(im->real_file, O_RDONLY);
    if (fd < 0)
@@ -240,6 +241,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
    flipv = !(header->descriptor & TGA_DESC_VERTICAL);
 
    rle = 0;                     /* RLE compressed */
+   hasc = 0;                    /* Has color */
 
    switch (header->imageType)
      {
@@ -247,12 +249,20 @@ load(ImlibImage * im, ImlibProgressFunction progress,
         goto quit;
 
      case TGA_TYPE_MAPPED:
+        break;
      case TGA_TYPE_COLOR:
+        hasc = 1;
+        break;
      case TGA_TYPE_GRAY:
         break;
 
      case TGA_TYPE_MAPPED_RLE:
+        rle = 1;
+        break;
      case TGA_TYPE_COLOR_RLE:
+        hasc = 1;
+        rle = 1;
+        break;
      case TGA_TYPE_GRAY_RLE:
         rle = 1;
         break;
@@ -271,6 +281,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
         break;
      case 24:
         break;
+     case 16:
+        if (header->descriptor & TGA_DESC_ABITS)
+           hasa = 1;
+        break;
      case 8:
         break;
      }
@@ -367,6 +381,24 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                        *dataptr++ = PIXEL_ARGB(a, r, g, b);
                        break;
 
+                    case 16:
+                       b = *bufptr++;
+                       a = *bufptr++;
+                       if (hasc)
+                         {
+                            pix16 = b | ((unsigned short)a << 8);
+                            r = (pix16 >> 7) & 0xf8;
+                            g = (pix16 >> 2) & 0xf8;
+                            b = (pix16 << 3) & 0xf8;
+                            a = (hasa && !(pix16 & 0x8000)) ? 0x00 : 0xff;
+                         }
+                       else
+                         {
+                            r = g = b;
+                         }
+                       *dataptr++ = PIXEL_ARGB(a, r, g, b);
+                       break;
+
                     case 8:    /* 8-bit grayscale or palette */
                        b = *bufptr++;
                        a = 0xff;
@@ -431,6 +463,25 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                           *dataptr++ = PIXEL_ARGB(a, r, g, b);
                        break;
 
+                    case 16:
+                       b = *bufptr++;
+                       a = *bufptr++;
+                       if (hasc)
+                         {
+                            pix16 = b | ((unsigned short)a << 8);
+                            r = (pix16 >> 7) & 0xf8;
+                            g = (pix16 >> 2) & 0xf8;
+                            b = (pix16 << 3) & 0xf8;
+                            a = (hasa && !(pix16 & 0x8000)) ? 0x00 : 0xff;
+                         }
+                       else
+                         {
+                            r = g = b;
+                         }
+                       for (i = 0; (i < count) && (dataptr < final_pixel); i++)
+                          *dataptr++ = PIXEL_ARGB(a, r, g, b);
+                       break;
+
                     case 8:
                        b = *bufptr++;
                        a = 0xff;
@@ -476,6 +527,24 @@ load(ImlibImage * im, ImlibProgressFunction progress,
                             *dataptr++ = PIXEL_ARGB(a, r, g, b);
                             break;
 
+                         case 16:
+                            b = *bufptr++;
+                            a = *bufptr++;
+                            if (hasc)
+                              {
+                                 pix16 = b | ((unsigned short)a << 8);
+                                 r = (pix16 >> 7) & 0xf8;
+                                 g = (pix16 >> 2) & 0xf8;
+                                 b = (pix16 << 3) & 0xf8;
+                                 a = (hasa && !(pix16 & 0x8000)) ? 0x00 : 0xff;
+                              }
+                            else
+                              {
+                                 r = g = b;
+                              }
+                            *dataptr++ = PIXEL_ARGB(a, r, g, b);
+                            break;
+
                          case 8:       /* 8-bit grayscale or palette */
                             b = *bufptr++;
                             a = 0xff;

-- 


Reply via email to