Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginTARGA.cpp view on Meta::CPAN
}
static const char * DLL_CALLCONV
Extension() {
return "tga,targa";
}
static const char * DLL_CALLCONV
RegExpr() {
return NULL;
}
static const char * DLL_CALLCONV
MimeType() {
return "image/x-tga";
}
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;
}
// ----------------------------------------------------------
src/Source/FreeImage/PluginTARGA.cpp view on Meta::CPAN
FIBITMAP* thumbnail = FreeImage_GetThumbnail(dib);
BYTE width = (BYTE)FreeImage_GetWidth(thumbnail);
BYTE height = (BYTE)FreeImage_GetHeight(thumbnail);
io->write_proc(&width, 1, 1, handle);
io->write_proc(&height, 1, 1, handle);
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
SwapRedBlue32(dib);
#endif
#ifdef FREEIMAGE_BIGENDIAN
swapShortPixels(dib);
#endif
const unsigned line_size = FreeImage_GetLine(thumbnail);
for (BYTE h = 0; h < height; ++h) {
BYTE* src_line = FreeImage_GetScanLine(thumbnail, height - 1 - h);
io->write_proc(src_line, 1, line_size, handle);
}
}
// (no Color Correction Table)
// write the footer
TGAFOOTER footer;
footer.extension_offset = extension_offset;
footer.developer_offset = 0;
strcpy(footer.signature, "TRUEVISION-XFILE.");
#ifdef FREEIMAGE_BIGENDIAN
SwapFooter(&footer);
#endif
io->write_proc(&footer, sizeof(footer), 1, handle);
return TRUE;
}
// ==========================================================
// Init
// ==========================================================
void DLL_CALLCONV
InitTARGA(Plugin *plugin, int format_id) {
s_format_id = format_id;
plugin->format_proc = Format;
plugin->description_proc = Description;
plugin->extension_proc = Extension;
plugin->regexpr_proc = RegExpr;
plugin->open_proc = NULL;
plugin->close_proc = NULL;
plugin->pagecount_proc = NULL;
plugin->pagecapability_proc = NULL;
plugin->load_proc = Load;
plugin->save_proc = Save;
plugin->validate_proc = Validate;
plugin->mime_proc = MimeType;
plugin->supports_export_bpp_proc = SupportsExportDepth;
plugin->supports_export_type_proc = SupportsExportType;
plugin->supports_icc_profiles_proc = NULL;
plugin->supports_no_pixels_proc = SupportsNoPixels;
}
( run in 0.631 second using v1.01-cache-2.11-cpan-d7f47b0818f )