// ========================================================== // FreeImage implementation // // Design and implementation by // - Floris van den Berg (flvdberg@wxs.nl) // - Hervé Drolon (drolon@infonie.fr) // - Karl-Heinz Bussian (khbussian@moss.de) // // 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! // ========================================================== #ifdef _WIN32 #include #endif #include "FreeImage.h" #include "Utilities.h" //---------------------------------------------------------------------- static const char *s_copyright = "This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details"; //---------------------------------------------------------------------- #if defined(_WIN32) && !defined(__MINGW32__) #ifndef FREEIMAGE_LIB BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH : FreeImage_Initialise(FALSE); break; case DLL_PROCESS_DETACH : FreeImage_DeInitialise(); break; case DLL_THREAD_ATTACH : case DLL_THREAD_DETACH : break; } return TRUE; } #endif // FREEIMAGE_LIB #else // !_WIN32 #ifndef FREEIMAGE_LIB void FreeImage_SO_Initialise() __attribute__((constructor)); void FreeImage_SO_DeInitialise() __attribute__((destructor)); void FreeImage_SO_Initialise() { FreeImage_Initialise(FALSE); } void FreeImage_SO_DeInitialise() { FreeImage_DeInitialise(); } #endif // FREEIMAGE_LIB #endif // _WIN32 //---------------------------------------------------------------------- const char * DLL_CALLCONV FreeImage_GetVersion() { static char s_version[16]; sprintf(s_version, "%d.%d.%d", FREEIMAGE_MAJOR_VERSION, FREEIMAGE_MINOR_VERSION, FREEIMAGE_RELEASE_SERIAL); return s_version; } const char * DLL_CALLCONV FreeImage_GetCopyrightMessage() { return s_copyright; } //---------------------------------------------------------------------- BOOL DLL_CALLCONV FreeImage_IsLittleEndian() { union { DWORD i; BYTE c[4]; } u; u.i = 1; return (u.c[0] != 0); } //---------------------------------------------------------------------- static FreeImage_OutputMessageFunction freeimage_outputmessage_proc = NULL; static FreeImage_OutputMessageFunctionStdCall freeimage_outputmessagestdcall_proc = NULL; void DLL_CALLCONV FreeImage_SetOutputMessage(FreeImage_OutputMessageFunction omf) { freeimage_outputmessage_proc = omf; } void DLL_CALLCONV FreeImage_SetOutputMessageStdCall(FreeImage_OutputMessageFunctionStdCall omf) { freeimage_outputmessagestdcall_proc = omf; } void DLL_CALLCONV FreeImage_OutputMessageProc(int fif, const char *fmt, ...) { const int MSG_SIZE = 512; // 512 bytes should be more than enough for a short message if ((fmt != NULL) && ((freeimage_outputmessage_proc != NULL) || (freeimage_outputmessagestdcall_proc != NULL))) { char message[MSG_SIZE]; memset(message, 0, MSG_SIZE); // initialize the optional parameter list va_list arg; va_start(arg, fmt); // check the length of the format string int str_length = (int)( (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt)); // parse the format string and put the result in 'message' for (int i = 0, j = 0; i < str_length; ++i) { if (fmt[i] == '%') { if (i + 1 < str_length) { switch(tolower(fmt[i + 1])) { case '%' : message[j++] = '%'; break; case 'o' : // octal numbers { char tmp[16]; _itoa(va_arg(arg, int), tmp, 8); strcat(message, tmp); j += (int)strlen(tmp); ++i; break; } case 'i' : // decimal numbers case 'd' : { char tmp[16]; _itoa(va_arg(arg, int), tmp, 10); strcat(message, tmp); j += (int)strlen(tmp); ++i; break; } case 'x' : // hexadecimal numbers { char tmp[16]; _itoa(va_arg(arg, int), tmp, 16); strcat(message, tmp); j += (int)strlen(tmp); ++i; break; } case 's' : // strings { char *tmp = va_arg(arg, char*); strcat(message, tmp); j += (int)strlen(tmp); ++i; break; } }; } else { message[j++] = fmt[i]; } } else { message[j++] = fmt[i]; }; } // deinitialize the optional parameter list va_end(arg); // output the message to the user program if (freeimage_outputmessage_proc != NULL) freeimage_outputmessage_proc((FREE_IMAGE_FORMAT)fif, message); if (freeimage_outputmessagestdcall_proc != NULL) freeimage_outputmessagestdcall_proc((FREE_IMAGE_FORMAT)fif, message); } }