From f716f8f488d519c27082826c81b7420e7dbe1743 Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 14 Apr 2005 08:27:36 +0000 Subject: [PATCH] LoadTGA is now more compliant with the TGA spec regarding colormaps (they can be present even on a truecolor image, just not used by it) and attributebits (alpha is now ignored if attributebits is not 8 which fixes a number of malformed TGA files (though they still waste disk space) - note that attributebits is part of the attributes header byte) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5179 d7cf8633-e32d-0410-b094-e92efae38249 --- image.c | 59 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/image.c b/image.c index 654747e0..185c66d3 100644 --- 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; -- 2.39.2