Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginTARGA.cpp view on Meta::CPAN
}
static BOOL
isTARGA20(FreeImageIO *io, fi_handle handle) {
const unsigned sizeofSig = 18;
BYTE signature[sizeofSig];
// tga_signature = "TRUEVISION-XFILE." (TGA 2.0 only)
BYTE tga_signature[sizeofSig] = { 84, 82, 85, 69, 86, 73, 83, 73, 79, 78, 45, 88, 70, 73, 76, 69, 46, 0 };
// get the start offset
const long start_offset = io->tell_proc(handle);
// get the end-of-file
io->seek_proc(handle, 0, SEEK_END);
const long eof = io->tell_proc(handle);
// read the signature
io->seek_proc(handle, start_offset + eof - sizeofSig, SEEK_SET);
io->read_proc(&signature, 1, sizeofSig, handle);
// rewind
io->seek_proc(handle, start_offset, SEEK_SET);
return (memcmp(tga_signature, signature, sizeofSig) == 0);
}
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;
}
}
}
static BOOL DLL_CALLCONV
SupportsExportDepth(int depth) {
return (
(depth == 8) ||
(depth == 16) ||
(depth == 24) ||
(depth == 32)
);
}
static BOOL DLL_CALLCONV
SupportsExportType(FREE_IMAGE_TYPE type) {
return (type == FIT_BITMAP) ? TRUE : FALSE;
}
static BOOL DLL_CALLCONV
SupportsNoPixels() {
return TRUE;
}
// ----------------------------------------------------------
/**
Used for all 32 and 24 bit loading of uncompressed images
*/
static void
loadTrueColor(FIBITMAP* dib, int width, int height, int file_pixel_size, FreeImageIO* io, fi_handle handle, BOOL as24bit) {
const int pixel_size = as24bit ? 3 : file_pixel_size;
// input line cache
BYTE* file_line = (BYTE*)malloc( width * file_pixel_size);
if (!file_line) {
throw FI_MSG_ERROR_MEMORY;
}
for (int y = 0; y < height; y++) {
( run in 0.576 second using v1.01-cache-2.11-cpan-119454b85a5 )