/src/FreeImage/Source/FreeImage/FreeImage.cpp
https://bitbucket.org/cabalistic/ogredeps/ · C++ · 226 lines · 132 code · 62 blank · 32 comment · 20 complexity · 178ddacd044a507228f1c8f44c1b0c5e MD5 · raw file
- // ==========================================================
- // 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 <windows.h>
- #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);
- }
- }