Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/MemoryIO.cpp view on Meta::CPAN
#include "FreeImage.h"
#include "Utilities.h"
#include "FreeImageIO.h"
// =====================================================================
// =====================================================================
// Open and close a memory handle
// =====================================================================
FIMEMORY * DLL_CALLCONV
FreeImage_OpenMemory(BYTE *data, DWORD size_in_bytes) {
// allocate a memory handle
FIMEMORY *stream = (FIMEMORY*)malloc(sizeof(FIMEMORY));
if(stream) {
stream->data = (BYTE*)malloc(sizeof(FIMEMORYHEADER));
if(stream->data) {
FIMEMORYHEADER *mem_header = (FIMEMORYHEADER*)(stream->data);
// initialize the memory header
memset(mem_header, 0, sizeof(FIMEMORYHEADER));
if(data && size_in_bytes) {
// wrap a user buffer
mem_header->delete_me = FALSE;
mem_header->data = (BYTE*)data;
mem_header->data_length = mem_header->file_length = size_in_bytes;
} else {
mem_header->delete_me = TRUE;
}
return stream;
}
free(stream);
}
return NULL;
}
void DLL_CALLCONV
FreeImage_CloseMemory(FIMEMORY *stream) {
if(stream && stream->data) {
FIMEMORYHEADER *mem_header = (FIMEMORYHEADER*)(stream->data);
if(mem_header->delete_me) {
free(mem_header->data);
}
free(mem_header);
free(stream);
}
}
// =====================================================================
// Memory stream load/save functions
// =====================================================================
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;
}
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;
}
// =====================================================================
// Memory stream buffer access
// =====================================================================
BOOL DLL_CALLCONV
FreeImage_AcquireMemory(FIMEMORY *stream, BYTE **data, DWORD *size_in_bytes) {
if (stream) {
FIMEMORYHEADER *mem_header = (FIMEMORYHEADER*)(stream->data);
*data = (BYTE*)mem_header->data;
*size_in_bytes = mem_header->file_length;
return TRUE;
}
return FALSE;
}
// =====================================================================
// Memory stream file type access
// =====================================================================
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;
}
// =====================================================================
// Seeking in Memory stream
// =====================================================================
/**
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);
( run in 0.678 second using v1.01-cache-2.11-cpan-63c85eba8c4 )