8 static unsigned l_ReadProc(
void *buffer,
unsigned size,
unsigned count, fi_handle handle )
10 std::istream * in = (std::istream *)handle;
11 in->read( (
char*)buffer, size * count );
15 static unsigned l_WriteProc(
void *buffer,
unsigned size,
unsigned count, fi_handle handle )
21 static int l_SeekProc( fi_handle handle,
long offset,
int origin )
23 std::ios_base::seekdir way;
24 if( origin == SEEK_SET )
25 way = std::ios_base::beg;
26 else if( origin == SEEK_CUR )
27 way = std::ios_base::cur;
29 way = std::ios_base::end;
31 std::istream * in = (std::istream *)handle;
32 in->seekg( offset, way );
36 static long l_TellProc( fi_handle handle )
38 std::istream * in = (std::istream *)handle;
42 static FreeImageIO l_IStreamIO =
44 .read_proc = l_ReadProc,
45 .write_proc = l_WriteProc,
46 .seek_proc = l_SeekProc,
47 .tell_proc = l_TellProc
53 FREE_IMAGE_FORMAT image_format = FIF_UNKNOWN;
56 image_format = FreeImage_GetFileTypeFromHandle( &l_IStreamIO, &in, 0 );
57 if( image_format == FIF_UNKNOWN )
61 if( image_format == FIF_UNKNOWN )
67 FIBITMAP * bitmap =
nullptr;
70 bitmap = FreeImage_LoadFromHandle( image_format, &l_IStreamIO, &in, 0 );
73 if( bitmap !=
nullptr )
77 #if defined( FREEIMAGE_BIGENDIAN ) || FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_RGB
86 if( FreeImage_GetImageType( bitmap ) != FIT_BITMAP || FreeImage_GetBPP( bitmap ) != 32 )
89 FIBITMAP * old_bitmap = bitmap;
90 bitmap = FreeImage_ConvertTo32Bits( bitmap );
91 FreeImage_Unload( old_bitmap );
101 metadata.
size.x = FreeImage_GetWidth( bitmap );
102 metadata.
size.y = FreeImage_GetHeight( bitmap );
104 int bpp = FreeImage_GetBPP( bitmap ) / 8;
107 f( metadata, FreeImage_GetBits( bitmap ), metadata.
size.x * metadata.
size.y * bpp );
110 FreeImage_Unload( bitmap );