// ========================================================== // FreeImageIO.Net // // Design and implementation by // - Marcos Pernambuco Motta (marcos.pernambuco@gmail.com) // // This file is part of FreeImage 3 // // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER // THIS DISCLAIMER. // // Use at your own risk! // ========================================================== #pragma once #include #include "FreeImage.h" using namespace System; using namespace System::IO; using namespace System::Runtime::InteropServices; extern "C" { // forward decls unsigned __stdcall ReadProc (void *buffer, unsigned size, unsigned count, fi_handle handle); unsigned __stdcall WriteProc (void *buffer, unsigned size, unsigned count, fi_handle handle); int __stdcall SeekProc (fi_handle handle, long offset, int origin); long __stdcall TellProc(fi_handle handle); #pragma pack(push, 1) __nogc struct UNMANAGED_HANDLER { UNMANAGED_HANDLER() { read_proc = &ReadProc; write_proc = WriteProc; seek_proc = SeekProc; tell_proc = TellProc; } FI_ReadProc read_proc; // pointer to the function used to read data FI_WriteProc write_proc; // pointer to the function used to write data FI_SeekProc seek_proc; // pointer to the function used to seek FI_TellProc tell_proc; // pointer to the function used to aquire the current position gcroot _stream; }; #pragma pack(pop) } #define FREEIMAGE_DLL "freeimaged.dll" namespace FreeImageIODotNet { __gc public class FreeImageStream { private: struct UNMANAGED_HANDLER* _pUnmanaged; public: FreeImageStream(System::IO::Stream* stream) { FreeImage_SaveToHandle((FREE_IMAGE_FORMAT) 1,0,0,0,0); _pUnmanaged = new struct UNMANAGED_HANDLER; _pUnmanaged->_stream = stream; } ~FreeImageStream() { _pUnmanaged->_stream = NULL; delete _pUnmanaged; } bool SaveImage(FREE_IMAGE_FORMAT fif, unsigned int dib, int flags) { return (bool)FreeImage_SaveToHandle(fif,(FIBITMAP*) dib,(FreeImageIO*)_pUnmanaged,(fi_handle)_pUnmanaged,flags); } unsigned int LoadImage(FREE_IMAGE_FORMAT fif, int flags) { return (unsigned int)FreeImage_LoadFromHandle(fif,(FreeImageIO*)_pUnmanaged,(fi_handle)_pUnmanaged,flags); } }; }