From a2cb8276e5bff36f5564290a4162f4ab29d3e23b Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Fri, 15 Nov 2019 20:09:44 +0100 Subject: [PATCH] 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;