FIMULTIBITMAP * DLL_CALLCONV FreeImage_LoadMultiBitmapFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags) { // retrieve the plugin list to find the node belonging to this plugin PluginList *list = FreeImage_GetPluginList(); if (list) { PluginNode *node = list->FindNodeFromFIF(fif); if (node) { FreeImageIO *io = new FreeImageIO; if (io) { SetMemoryIO(io); FIMULTIBITMAP *bitmap = new FIMULTIBITMAP; if (bitmap) { MULTIBITMAPHEADER *header = new MULTIBITMAPHEADER; header->m_filename = NULL; header->node = node; header->fif = fif; header->io = io; header->handle = (fi_handle)stream; header->changed = FALSE; header->read_only = TRUE; header->m_cachefile = NULL; header->cache_fif = fif; header->load_flags = flags; if (header) { // store the MULTIBITMAPHEADER in the surrounding FIMULTIBITMAP structure bitmap->data = header; // cache the page count header->page_count = FreeImage_InternalGetPageCount(bitmap); // allocate a continueus block to describe the bitmap header->m_blocks.push_back((BlockTypeS *)new BlockContinueus(0, header->page_count - 1)); // set up the cache return bitmap; } return NULL; } } delete io; } } return NULL; }
BOOL DLL_CALLCONV FreeImage_SaveMultiBitmapToMemory(FREE_IMAGE_FORMAT fif, FIMULTIBITMAP *bitmap, FIMEMORY *stream, int flags) { if (stream && stream->data) { FreeImageIO io; SetMemoryIO(&io); return FreeImage_SaveMultiBitmapToHandle(fif, bitmap, &io, (fi_handle)stream, flags); } return FALSE; }
FIBITMAP * DLL_CALLCONV FreeImage_LoadFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags) { if (stream && stream->data) { FreeImageIO io; SetMemoryIO(&io); return FreeImage_LoadFromHandle(fif, &io, (fi_handle)stream, flags); } return NULL; }
/** Reads data from a memory stream @param buffer Storage location for data @param size Item size in bytes @param count Maximum number of items to be read @param stream Pointer to FIMEMORY structure @return Returns the number of full items actually read, which may be less than count if an error occurs */ unsigned DLL_CALLCONV FreeImage_ReadMemory(void *buffer, unsigned size, unsigned count, FIMEMORY *stream) { FreeImageIO io; SetMemoryIO(&io); if (stream != NULL) { return io.read_proc(buffer, size, count, stream); } return 0; }
/** Gets the current position of a memory pointer @param stream Target FIMEMORY structure @return Returns the current file position if successful, -1 otherwise */ long DLL_CALLCONV FreeImage_TellMemory(FIMEMORY *stream) { FreeImageIO io; SetMemoryIO(&io); if (stream != NULL) { return io.tell_proc((fi_handle)stream); } return -1L; }
FREE_IMAGE_FORMAT DLL_CALLCONV FreeImage_GetFileTypeFromMemory(FIMEMORY *stream, int size) { FreeImageIO io; SetMemoryIO(&io); if (stream != NULL) { return FreeImage_GetFileTypeFromHandle(&io, (fi_handle)stream, size); } return FIF_UNKNOWN; }
/** Moves the memory pointer to a specified location @param stream Pointer to FIMEMORY structure @param offset Number of bytes from origin @param origin Initial position @return Returns TRUE if successful, returns FALSE otherwise */ BOOL DLL_CALLCONV FreeImage_SeekMemory(FIMEMORY *stream, long offset, int origin) { FreeImageIO io; SetMemoryIO(&io); if (stream != NULL) { int success = io.seek_proc((fi_handle)stream, offset, origin); return (success == 0) ? TRUE : FALSE; } return FALSE; }
BOOL DLL_CALLCONV FreeImage_ValidateFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream) { FreeImageIO io; SetMemoryIO(&io); if (stream != NULL) { BOOL bIsValidFIF = FreeImage_ValidateFromHandle(fif, &io, (fi_handle)stream); return bIsValidFIF; } return FALSE; }
FIMULTIBITMAP * DLL_CALLCONV FreeImage_LoadMultiBitmapFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags) { BOOL read_only = FALSE; // modifications (if any) will be stored into the memory cache // retrieve the plugin list to find the node belonging to this plugin PluginList *list = FreeImage_GetPluginList(); if (list) { PluginNode *node = list->FindNodeFromFIF(fif); if (node) { FIMULTIBITMAP *bitmap = new(std::nothrow) FIMULTIBITMAP; if (bitmap) { MULTIBITMAPHEADER *header = new(std::nothrow) MULTIBITMAPHEADER; if (header) { header->node = node; header->fif = fif; SetMemoryIO(&header->io); header->handle = (fi_handle)stream; header->read_only = read_only; header->cache_fif = fif; header->load_flags = flags; // store the MULTIBITMAPHEADER in the surrounding FIMULTIBITMAP structure bitmap->data = header; // cache the page count header->page_count = FreeImage_InternalGetPageCount(bitmap); // allocate a continueus block to describe the bitmap header->m_blocks.push_back(PageBlock(BLOCK_CONTINUEUS, 0, header->page_count - 1)); // no need to open cache - it is in-memory by default return bitmap; } delete bitmap; } } } return NULL; }
BOOL DLL_CALLCONV FreeImage_SaveToMemory(FREE_IMAGE_FORMAT fif, FIBITMAP *dib, FIMEMORY *stream, int flags) { if (stream) { FreeImageIO io; SetMemoryIO(&io); FIMEMORYHEADER *mem_header = (FIMEMORYHEADER*)(stream->data); if(mem_header->delete_me == TRUE) { return FreeImage_SaveToHandle(fif, dib, &io, (fi_handle)stream, flags); } else { // do not save in a user buffer FreeImage_OutputMessageProc(fif, "Memory buffer is read only"); } } return FALSE; }
/** Writes data to a memory stream. @param buffer Pointer to data to be written @param size Item size in bytes @param count Maximum number of items to be written @param stream Pointer to FIMEMORY structure @return Returns the number of full items actually written, which may be less than count if an error occurs */ unsigned DLL_CALLCONV FreeImage_WriteMemory(const void *buffer, unsigned size, unsigned count, FIMEMORY *stream) { if (stream != NULL) { FreeImageIO io; SetMemoryIO(&io); FIMEMORYHEADER *mem_header = (FIMEMORYHEADER*)(((FIMEMORY*)stream)->data); if(mem_header->delete_me == TRUE) { return io.write_proc((void *)buffer, size, count, stream); } else { // do not write in a user buffer FreeImage_OutputMessageProc(FIF_UNKNOWN, "Memory buffer is read only"); } } return 0; }
static BOOL getMemIO(FIMEMORY* src_stream, FIMEMORY* dst_stream, FreeImageIO* dst_io, fi_handle* src_handle, fi_handle* dst_handle) { *src_handle = NULL; *dst_handle = NULL; FreeImageIO io; SetMemoryIO (&io); if(dst_stream) { FIMEMORYHEADER *mem_header = (FIMEMORYHEADER*)(dst_stream->data); if(mem_header->delete_me != TRUE) { // do not save in a user buffer FreeImage_OutputMessageProc(FIF_JPEG, "Destination memory buffer is read only"); return FALSE; } } *dst_io = io; *src_handle = src_stream; *dst_handle = dst_stream; return TRUE; }