LoadTGA is now more compliant with the TGA spec regarding colormaps (they can be...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 14 Apr 2005 08:27:36 +0000 (08:27 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 14 Apr 2005 08:27:36 +0000 (08:27 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5179 d7cf8633-e32d-0410-b094-e92efae38249

image.c

diff --git a/image.c b/image.c
index 654747e..185c66d 100644 (file)
--- a/image.c
+++ b/image.c
@@ -311,7 +311,7 @@ LoadTGA
 */
 qbyte *LoadTGA (const qbyte *f, int matchwidth, int matchheight)
 {
-       int x, y, row_inc, compressed, readpixelcount, red, green, blue, alpha, runlen, pindex;
+       int x, y, row_inc, compressed, readpixelcount, red, green, blue, alpha, runlen, pindex, alphabits;
        qbyte *pixbuf, *image_rgba;
        const qbyte *fin, *enddata;
        TargaHeader targa_header;
@@ -344,26 +344,17 @@ qbyte *LoadTGA (const qbyte *f, int matchwidth, int matchheight)
        targa_header.pixel_size = f[16];
        targa_header.attributes = f[17];
 
+       // advance to end of header
        fin = f + 18;
-       if (targa_header.id_length != 0)
-               fin += targa_header.id_length;  // skip TARGA image comment
-       if (targa_header.image_type == 2 || targa_header.image_type == 10)
-       {
-               if (targa_header.pixel_size != 24 && targa_header.pixel_size != 32)
-               {
-                       Con_Print("LoadTGA: only 24bit and 32bit pixel sizes supported for type 2 and type 10 images\n");
-                       PrintTargaHeader(&targa_header);
-                       return NULL;
-               }
-       }
-       else if (targa_header.image_type == 1 || targa_header.image_type == 9)
+
+       // skip TARGA image comment (usually 0 bytes)
+       fin += targa_header.id_length;
+
+       // read/skip the colormap if present (note: according to the TARGA spec it
+       // can be present even on truecolor or greyscale images, just not used by
+       // the image data)
+       if (targa_header.colormap_type)
        {
-               if (targa_header.pixel_size != 8)
-               {
-                       Con_Print("LoadTGA: only 8bit pixel size for type 1, 3, 9, and 11 images supported\n");
-                       PrintTargaHeader(&targa_header);
-                       return NULL;
-               }
                if (targa_header.colormap_length > 256)
                {
                        Con_Print("LoadTGA: only up to 256 colormap_length supported\n");
@@ -403,6 +394,26 @@ qbyte *LoadTGA (const qbyte *f, int matchwidth, int matchheight)
                        return NULL;
                }
        }
+
+       // check our pixel_size restrictions according to image_type
+       if (targa_header.image_type == 2 || targa_header.image_type == 10)
+       {
+               if (targa_header.pixel_size != 24 && targa_header.pixel_size != 32)
+               {
+                       Con_Print("LoadTGA: only 24bit and 32bit pixel sizes supported for type 2 and type 10 images\n");
+                       PrintTargaHeader(&targa_header);
+                       return NULL;
+               }
+       }
+       else if (targa_header.image_type == 1 || targa_header.image_type == 9)
+       {
+               if (targa_header.pixel_size != 8)
+               {
+                       Con_Print("LoadTGA: only 8bit pixel size for type 1, 3, 9, and 11 images supported\n");
+                       PrintTargaHeader(&targa_header);
+                       return NULL;
+               }
+       }
        else if (targa_header.image_type == 3 || targa_header.image_type == 11)
        {
                if (targa_header.pixel_size != 8)
@@ -444,6 +455,14 @@ qbyte *LoadTGA (const qbyte *f, int matchwidth, int matchheight)
                row_inc = 0;
        }
 
+       // number of attribute bits per pixel, we only support 0 or 8
+       alphabits = targa_header.attributes & 0x0F;
+       if (alphabits != 8 && alphabits != 0)
+       {
+               Con_Print("LoadTGA: only 0 or 8 attribute (alpha) bits supported\n");
+               return NULL;
+       }
+
        compressed = targa_header.image_type == 9 || targa_header.image_type == 10 || targa_header.image_type == 11;
        x = 0;
        y = 0;
@@ -501,6 +520,8 @@ qbyte *LoadTGA (const qbyte *f, int matchwidth, int matchheight)
                                                red = green = blue = *fin++;
                                                break;
                                        }
+                                       if (!alphabits)
+                                               alpha = 255;
                                }
                        }
                        *pixbuf++ = red;