Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginIFF.cpp view on Meta::CPAN
static const char * DLL_CALLCONV
Description() {
return "IFF Interleaved Bitmap";
}
static const char * DLL_CALLCONV
Extension() {
return "iff,lbm";
}
static const char * DLL_CALLCONV
RegExpr() {
return NULL;
}
static const char * DLL_CALLCONV
MimeType() {
return "image/x-iff";
}
static BOOL DLL_CALLCONV
Validate(FreeImageIO *io, fi_handle handle) {
DWORD type = 0;
// read chunk type
io->read_proc(&type, 4, 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&type);
#endif
if(type != ID_FORM)
return FALSE;
// skip 4 bytes
io->read_proc(&type, 4, 1, handle);
// read chunk type
io->read_proc(&type, 4, 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&type);
#endif
// File format : ID_PBM = Packed Bitmap, ID_ILBM = Interleaved Bitmap
return (type == ID_ILBM) || (type == ID_PBM);
}
static BOOL DLL_CALLCONV
SupportsExportDepth(int depth) {
return FALSE;
}
static BOOL DLL_CALLCONV
SupportsExportType(FREE_IMAGE_TYPE type) {
return FALSE;
}
// ----------------------------------------------------------
static FIBITMAP * DLL_CALLCONV
Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
if (handle != NULL) {
FIBITMAP *dib = NULL;
DWORD type, size;
io->read_proc(&type, 4, 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&type);
#endif
if(type != ID_FORM)
return NULL;
io->read_proc(&size, 4, 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&size);
#endif
io->read_proc(&type, 4, 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&type);
#endif
if((type != ID_ILBM) && (type != ID_PBM))
return NULL;
size -= 4;
unsigned width = 0, height = 0, planes = 0, depth = 0, comp = 0;
while (size) {
DWORD ch_type,ch_size;
io->read_proc(&ch_type, 4, 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&ch_type);
#endif
io->read_proc(&ch_size,4,1,handle );
#ifndef FREEIMAGE_BIGENDIAN
SwapLong(&ch_size);
#endif
unsigned ch_end = io->tell_proc(handle) + ch_size;
if (ch_type == ID_BMHD) { // Bitmap Header
if (dib)
FreeImage_Unload(dib);
BMHD bmhd;
io->read_proc(&bmhd, sizeof(bmhd), 1, handle);
#ifndef FREEIMAGE_BIGENDIAN
SwapHeader(&bmhd);
#endif
width = bmhd.w;
height = bmhd.h;
planes = bmhd.nPlanes;
comp = bmhd.compression;
( run in 0.496 second using v1.01-cache-2.11-cpan-63c85eba8c4 )