Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/PluginIFF.cpp view on Meta::CPAN
if (t >= 0) {
// t = [0..127] => copy the next t+1 bytes literally
unsigned size_to_read = t + 1;
if((size_to_read + x) > src_size) {
// sanity check for buffer overruns
size_to_read = src_size - x;
io->read_proc(src + x, size_to_read, 1, handle);
x += (t + 1);
} else {
io->read_proc(src + x, size_to_read, 1, handle);
x += size_to_read;
}
} else if (t != -128) {
// t = [-1..-127] => replicate the next byte -t+1 times
BYTE b = 0;
io->read_proc(&b, 1, 1, handle);
unsigned size_to_copy = (unsigned)(-(int)t + 1);
if((size_to_copy + x) > src_size) {
// sanity check for buffer overruns
size_to_copy = src_size - x;
memset(src + x, b, size_to_copy);
x += (unsigned)(-(int)t + 1);
} else {
memset(src + x, b, size_to_copy);
x += size_to_copy;
}
}
// t = -128 => noop
}
} else {
io->read_proc(src, src_size, 1, handle);
}
// lazy planar->chunky...
for (unsigned x = 0; x < width; x++) {
for (unsigned n = 0; n < planes; n++) {
BYTE bit = (BYTE)( src[n * plane_size + (x / 8)] >> ((x^7) & 7) );
dest[x * pixel_size + (n / 8)] |= (bit & 1) << (n & 7);
}
}
#if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
if (depth == 24) {
for (unsigned x = 0; x < width; ++x){
INPLACESWAP(dest[x * 3], dest[x * 3 + 2]);
}
}
#endif
}
free(src);
return dib;
}
}
// Every odd-length chunk is followed by a 0 pad byte. This pad
// byte is not counted in ch_size.
if (ch_size & 1) {
ch_size++;
ch_end++;
}
io->seek_proc(handle, ch_end - io->tell_proc(handle), SEEK_CUR);
size -= ch_size + 8;
}
if (dib)
FreeImage_Unload(dib);
}
return 0;
}
// ==========================================================
// Init
// ==========================================================
void DLL_CALLCONV
InitIFF(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 = NULL;
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;
}
( run in 1.059 second using v1.01-cache-2.11-cpan-119454b85a5 )