static BOOL DLL_CALLCONV Validate(FreeImageIO *io, fi_handle handle) { if(isTARGA20(io, handle)) { return TRUE; } // not a 2.0 image, try testing if it's a valid TGA anyway (not robust) BOOL bResult = FALSE; const long start_offset = io->tell_proc(handle); TGAHEADER header; io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle); // rewind io->seek_proc(handle, start_offset, SEEK_SET); switch(header.image_type) { case TGA_CMAP : case TGA_RGB: case TGA_MONO : case TGA_RLECMAP: case TGA_RLERGB: case TGA_RLEMONO: switch(header.is_pixel_depth) { case 8 : case 16: case 24: case 32: bResult = TRUE; break; default: bResult = FALSE; break; } break; default: bResult = FALSE; break; } return bResult; }
static BOOL DLL_CALLCONV Validate(FreeImageIO *io, fi_handle handle) { if(isTARGA20(io, handle)) { return TRUE; } // not a 2.0 image, try testing if it's a valid TGA anyway (not robust) { const long start_offset = io->tell_proc(handle); // get the header TGAHEADER header; io->read_proc(&header, sizeof(tagTGAHEADER), 1, handle); #ifdef FREEIMAGE_BIGENDIAN SwapHeader(&header); #endif // rewind io->seek_proc(handle, start_offset, SEEK_SET); // the color map type should be a 0 or a 1... if(header.color_map_type != 0 && header.color_map_type != 1) { return FALSE; } // if the color map type is 1 then we validate the map entry information... if(header.color_map_type > 0) { // it doesn't make any sense if the first entry is larger than the color map table if(header.cm_first_entry >= header.cm_length) { return FALSE; } // check header.cm_size, don't allow 0 or anything bigger than 32 if(header.cm_size == 0 || header.cm_size > 32) { return FALSE; } } // the width/height shouldn't be 0, right ? if(header.is_width == 0 || header.is_height == 0) { return FALSE; } // let's now verify all the types that are supported by FreeImage (this is our final verification) switch(header.image_type) { case TGA_CMAP: case TGA_RGB: case TGA_MONO: case TGA_RLECMAP: case TGA_RLERGB: case TGA_RLEMONO: switch(header.is_pixel_depth) { case 8 : case 16: case 24: case 32: return TRUE; default: return FALSE; } break; default: return FALSE; } } }