--- /dev/null
+// xImaCodec.cpp : Encode Decode functions\r
+/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it\r
+ * CxImage version 6.0.0 02/Feb/2008\r
+ */\r
+\r
+#include "ximage.h"\r
+\r
+#if CXIMAGE_SUPPORT_JPG\r
+#include "ximajpg.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_GIF\r
+#include "ximagif.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_PNG\r
+#include "ximapng.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_MNG\r
+#include "ximamng.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_BMP\r
+#include "ximabmp.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_ICO\r
+#include "ximaico.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_TIF\r
+#include "ximatif.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_TGA\r
+#include "ximatga.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_PCX\r
+#include "ximapcx.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_WBMP\r
+#include "ximawbmp.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_WMF\r
+#include "ximawmf.h" // <vho> - WMF/EMF support\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_JBG\r
+#include "ximajbg.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_JASPER\r
+#include "ximajas.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_SKA\r
+#include "ximaska.h"\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_RAW\r
+#include "ximaraw.h"\r
+#endif\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+#if CXIMAGE_SUPPORT_ENCODE\r
+////////////////////////////////////////////////////////////////////////////////\r
+bool CxImage::EncodeSafeCheck(CxFile *hFile)\r
+{\r
+ if (hFile==NULL) {\r
+ strcpy(info.szLastError,CXIMAGE_ERR_NOFILE);\r
+ return true;\r
+ }\r
+\r
+ if (pDib==NULL){\r
+ strcpy(info.szLastError,CXIMAGE_ERR_NOIMAGE);\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+//#ifdef WIN32\r
+//bool CxImage::Save(LPCWSTR filename, DWORD imagetype)\r
+//{\r
+// FILE* hFile; //file handle to write the image\r
+// if ((hFile=_wfopen(filename,L"wb"))==NULL) return false;\r
+// bool bOK = Encode(hFile,imagetype);\r
+// fclose(hFile);\r
+// return bOK;\r
+//}\r
+//#endif //WIN32\r
+////////////////////////////////////////////////////////////////////////////////\r
+// For UNICODE support: char -> TCHAR\r
+/**\r
+ * Saves to disk the image in a specific format.\r
+ * \param filename: file name\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Save(const TCHAR * filename, DWORD imagetype)\r
+{\r
+ FILE* hFile; //file handle to write the image\r
+\r
+#ifdef WIN32\r
+ if ((hFile=_tfopen(filename,_T("wb")))==NULL) return false; // For UNICODE support\r
+#else\r
+ if ((hFile=fopen(filename,"wb"))==NULL) return false;\r
+#endif\r
+\r
+ bool bOK = Encode(hFile,imagetype);\r
+ fclose(hFile);\r
+ return bOK;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Saves to disk the image in a specific format.\r
+ * \param hFile: file handle, open and enabled for writing.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Encode(FILE *hFile, DWORD imagetype)\r
+{\r
+ CxIOFile file(hFile);\r
+ return Encode(&file,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Saves to memory buffer the image in a specific format.\r
+ * \param buffer: output memory buffer pointer. Must be NULL,\r
+ * the function allocates and fill the memory,\r
+ * the application must free the buffer, see also FreeMemory().\r
+ * \param size: output memory buffer size.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Encode(BYTE * &buffer, long &size, DWORD imagetype)\r
+{\r
+ if (buffer!=NULL){\r
+ strcpy(info.szLastError,"the buffer must be empty");\r
+ return false;\r
+ }\r
+ CxMemFile file;\r
+ file.Open();\r
+ if(Encode(&file,imagetype)){\r
+ buffer=file.GetBuffer();\r
+ size=file.Size();\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Saves to disk the image in a specific format.\r
+ * \param hFile: file handle (CxMemFile or CxIOFile), with write access.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ * \sa ENUM_CXIMAGE_FORMATS\r
+ */\r
+bool CxImage::Encode(CxFile *hFile, DWORD imagetype)\r
+{\r
+\r
+#if CXIMAGE_SUPPORT_BMP\r
+\r
+ if (imagetype==CXIMAGE_FORMAT_BMP){\r
+ CxImageBMP newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_ICO\r
+ if (imagetype==CXIMAGE_FORMAT_ICO){\r
+ CxImageICO newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_TIF\r
+ if (imagetype==CXIMAGE_FORMAT_TIF){\r
+ CxImageTIF newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JPG\r
+ if (imagetype==CXIMAGE_FORMAT_JPG){\r
+ CxImageJPG newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_GIF\r
+ if (imagetype==CXIMAGE_FORMAT_GIF){\r
+ CxImageGIF newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_PNG\r
+ if (imagetype==CXIMAGE_FORMAT_PNG){\r
+ CxImagePNG newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_MNG\r
+ if (imagetype==CXIMAGE_FORMAT_MNG){\r
+ CxImageMNG newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_TGA\r
+ if (imagetype==CXIMAGE_FORMAT_TGA){\r
+ CxImageTGA newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_PCX\r
+ if (imagetype==CXIMAGE_FORMAT_PCX){\r
+ CxImagePCX newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_WBMP\r
+ if (imagetype==CXIMAGE_FORMAT_WBMP){\r
+ CxImageWBMP newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS // <vho> - WMF/EMF support\r
+ if (imagetype==CXIMAGE_FORMAT_WMF){\r
+ CxImageWMF newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JBG\r
+ if (imagetype==CXIMAGE_FORMAT_JBG){\r
+ CxImageJBG newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JASPER\r
+ if (\r
+ #if CXIMAGE_SUPPORT_JP2\r
+ imagetype==CXIMAGE_FORMAT_JP2 || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_JPC\r
+ imagetype==CXIMAGE_FORMAT_JPC || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_PGX\r
+ imagetype==CXIMAGE_FORMAT_PGX || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_PNM\r
+ imagetype==CXIMAGE_FORMAT_PNM || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_RAS\r
+ imagetype==CXIMAGE_FORMAT_RAS || \r
+ #endif\r
+ false ){\r
+ CxImageJAS newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile,imagetype)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_SKA\r
+ if (imagetype==CXIMAGE_FORMAT_SKA){\r
+ CxImageSKA newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_RAW\r
+ if (imagetype==CXIMAGE_FORMAT_RAW){\r
+ CxImageRAW newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+\r
+ strcpy(info.szLastError,"Encode: Unknown format");\r
+ return false;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Saves to disk or memory pagecount images, referenced by an array of CxImage pointers.\r
+ * \param hFile: file handle.\r
+ * \param pImages: array of CxImage pointers.\r
+ * \param pagecount: number of images.\r
+ * \param imagetype: can be CXIMAGE_FORMAT_TIF or CXIMAGE_FORMAT_GIF.\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Encode(FILE * hFile, CxImage ** pImages, int pagecount, DWORD imagetype)\r
+{\r
+ CxIOFile file(hFile);\r
+ return Encode(&file, pImages, pagecount,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Saves to disk or memory pagecount images, referenced by an array of CxImage pointers.\r
+ * \param hFile: file handle (CxMemFile or CxIOFile), with write access.\r
+ * \param pImages: array of CxImage pointers.\r
+ * \param pagecount: number of images.\r
+ * \param imagetype: can be CXIMAGE_FORMAT_TIF, CXIMAGE_FORMAT_GIF or CXIMAGE_FORMAT_ICO.\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Encode(CxFile * hFile, CxImage ** pImages, int pagecount, DWORD imagetype)\r
+{\r
+#if CXIMAGE_SUPPORT_TIF\r
+ if (imagetype==CXIMAGE_FORMAT_TIF){\r
+ CxImageTIF newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile,pImages,pagecount)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_GIF\r
+ if (imagetype==CXIMAGE_FORMAT_GIF){\r
+ CxImageGIF newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile,pImages,pagecount)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_ICO\r
+ if (imagetype==CXIMAGE_FORMAT_ICO){\r
+ CxImageICO newima;\r
+ newima.Ghost(this);\r
+ if (newima.Encode(hFile,pImages,pagecount)){\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+ strcpy(info.szLastError,"Multipage Encode, Unsupported operation for this format");\r
+ return false;\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * exports the image into a RGBA buffer, Useful for OpenGL applications.\r
+ * \param buffer: output memory buffer pointer. Must be NULL,\r
+ * the function allocates and fill the memory,\r
+ * the application must free the buffer, see also FreeMemory().\r
+ * \param size: output memory buffer size.\r
+ * \param bFlipY: direction of Y axis. default = false.\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Encode2RGBA(BYTE * &buffer, long &size, bool bFlipY)\r
+{\r
+ if (buffer!=NULL){\r
+ strcpy(info.szLastError,"the buffer must be empty");\r
+ return false;\r
+ }\r
+ CxMemFile file;\r
+ file.Open();\r
+ if(Encode2RGBA(&file,bFlipY)){\r
+ buffer=file.GetBuffer();\r
+ size=file.Size();\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * exports the image into a RGBA buffer, Useful for OpenGL applications.\r
+ * \param hFile: file handle (CxMemFile or CxIOFile), with write access.\r
+ * \param bFlipY: direction of Y axis. default = false.\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Encode2RGBA(CxFile *hFile, bool bFlipY)\r
+{\r
+ if (EncodeSafeCheck(hFile)) return false;\r
+\r
+ for (long y1 = 0; y1 < head.biHeight; y1++) {\r
+ long y = bFlipY ? head.biHeight - 1 - y1 : y1;\r
+ for(long x = 0; x < head.biWidth; x++) {\r
+ RGBQUAD color = BlindGetPixelColor(x,y);\r
+ hFile->PutC(color.rgbRed);\r
+ hFile->PutC(color.rgbGreen);\r
+ hFile->PutC(color.rgbBlue);\r
+ hFile->PutC(color.rgbReserved);\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+#endif //CXIMAGE_SUPPORT_ENCODE\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+#if CXIMAGE_SUPPORT_DECODE\r
+////////////////////////////////////////////////////////////////////////////////\r
+// For UNICODE support: char -> TCHAR\r
+/**\r
+ * Reads from disk the image in a specific format.\r
+ * - If decoding fails using the specified image format,\r
+ * the function will try the automatic file format recognition.\r
+ *\r
+ * \param filename: file name\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Load(const TCHAR * filename, DWORD imagetype)\r
+//bool CxImage::Load(const char * filename, DWORD imagetype)\r
+{\r
+ /*FILE* hFile; //file handle to read the image\r
+ if ((hFile=fopen(filename,"rb"))==NULL) return false;\r
+ bool bOK = Decode(hFile,imagetype);\r
+ fclose(hFile);*/\r
+\r
+ /* automatic file type recognition */\r
+ bool bOK = false;\r
+ if ( GetTypeIndexFromId(imagetype) ){\r
+ FILE* hFile; //file handle to read the image\r
+\r
+#ifdef WIN32\r
+ if ((hFile=_tfopen(filename,_T("rb")))==NULL) return false; // For UNICODE support\r
+#else\r
+ if ((hFile=fopen(filename,"rb"))==NULL) return false;\r
+#endif\r
+\r
+ bOK = Decode(hFile,imagetype);\r
+ fclose(hFile);\r
+ if (bOK) return bOK;\r
+ }\r
+\r
+ char szError[256];\r
+ strcpy(szError,info.szLastError); //save the first error\r
+\r
+ // if failed, try automatic recognition of the file...\r
+ FILE* hFile;\r
+\r
+#ifdef WIN32\r
+ if ((hFile=_tfopen(filename,_T("rb")))==NULL) return false; // For UNICODE support\r
+#else\r
+ if ((hFile=fopen(filename,"rb"))==NULL) return false;\r
+#endif\r
+\r
+ bOK = Decode(hFile,CXIMAGE_FORMAT_UNKNOWN);\r
+ fclose(hFile);\r
+\r
+ if (!bOK && imagetype > 0) strcpy(info.szLastError,szError); //restore the first error\r
+\r
+ return bOK;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+#ifdef WIN32\r
+//bool CxImage::Load(LPCWSTR filename, DWORD imagetype)\r
+//{\r
+// /*FILE* hFile; //file handle to read the image\r
+// if ((hFile=_wfopen(filename, L"rb"))==NULL) return false;\r
+// bool bOK = Decode(hFile,imagetype);\r
+// fclose(hFile);*/\r
+//\r
+// /* automatic file type recognition */\r
+// bool bOK = false;\r
+// if ( GetTypeIndexFromId(imagetype) ){\r
+// FILE* hFile; //file handle to read the image\r
+// if ((hFile=_wfopen(filename,L"rb"))==NULL) return false;\r
+// bOK = Decode(hFile,imagetype);\r
+// fclose(hFile);\r
+// if (bOK) return bOK;\r
+// }\r
+//\r
+// char szError[256];\r
+// strcpy(szError,info.szLastError); //save the first error\r
+//\r
+// // if failed, try automatic recognition of the file...\r
+// FILE* hFile; //file handle to read the image\r
+// if ((hFile=_wfopen(filename,L"rb"))==NULL) return false;\r
+// bOK = Decode(hFile,CXIMAGE_FORMAT_UNKNOWN);\r
+// fclose(hFile);\r
+//\r
+// if (!bOK && imagetype > 0) strcpy(info.szLastError,szError); //restore the first error\r
+//\r
+// return bOK;\r
+//}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Loads an image from the application resources.\r
+ * \param hRes: the resource handle returned by FindResource().\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS.\r
+ * \param hModule: NULL for internal resource, or external application/DLL hinstance returned by LoadLibray.\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::LoadResource(HRSRC hRes, DWORD imagetype, HMODULE hModule)\r
+{\r
+ DWORD rsize=SizeofResource(hModule,hRes);\r
+ HGLOBAL hMem=::LoadResource(hModule,hRes);\r
+ if (hMem){\r
+ char* lpVoid=(char*)LockResource(hMem);\r
+ if (lpVoid){\r
+ // FILE* fTmp=tmpfile(); doesn't work with network\r
+ /*char tmpPath[MAX_PATH] = {0};\r
+ char tmpFile[MAX_PATH] = {0};\r
+ GetTempPath(MAX_PATH,tmpPath);\r
+ GetTempFileName(tmpPath,"IMG",0,tmpFile);\r
+ FILE* fTmp=fopen(tmpFile,"w+b");\r
+ if (fTmp){\r
+ fwrite(lpVoid,rsize,1,fTmp);\r
+ fseek(fTmp,0,SEEK_SET);\r
+ bool bOK = Decode(fTmp,imagetype);\r
+ fclose(fTmp);\r
+ DeleteFile(tmpFile);\r
+ return bOK;\r
+ }*/\r
+\r
+ CxMemFile fTmp((BYTE*)lpVoid,rsize);\r
+ return Decode(&fTmp,imagetype);\r
+ }\r
+ } else strcpy(info.szLastError,"Unable to load resource!");\r
+ return false;\r
+}\r
+#endif //WIN32\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Constructor from file name, see Load()\r
+ * \param filename: file name\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ */\r
+// \r
+// > filename: file name\r
+// > imagetype: specify the image format (CXIMAGE_FORMAT_BMP,...)\r
+// For UNICODE support: char -> TCHAR\r
+CxImage::CxImage(const TCHAR * filename, DWORD imagetype)\r
+//CxImage::CxImage(const char * filename, DWORD imagetype)\r
+{\r
+ Startup(imagetype);\r
+ Load(filename,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Constructor from file handle, see Decode()\r
+ * \param stream: file handle, with read access.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ */\r
+CxImage::CxImage(FILE * stream, DWORD imagetype)\r
+{\r
+ Startup(imagetype);\r
+ Decode(stream,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Constructor from CxFile object, see Decode()\r
+ * \param stream: file handle (CxMemFile or CxIOFile), with read access.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ */\r
+CxImage::CxImage(CxFile * stream, DWORD imagetype)\r
+{\r
+ Startup(imagetype);\r
+ Decode(stream,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Constructor from memory buffer, see Decode()\r
+ * \param buffer: memory buffer\r
+ * \param size: size of buffer\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ */\r
+CxImage::CxImage(BYTE * buffer, DWORD size, DWORD imagetype)\r
+{\r
+ Startup(imagetype);\r
+ CxMemFile stream(buffer,size);\r
+ Decode(&stream,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Loads an image from memory buffer\r
+ * \param buffer: memory buffer\r
+ * \param size: size of buffer\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Decode(BYTE * buffer, DWORD size, DWORD imagetype)\r
+{\r
+ CxMemFile file(buffer,size);\r
+ return Decode(&file,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Loads an image from file handle.\r
+ * \param hFile: file handle, with read access.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ */\r
+bool CxImage::Decode(FILE *hFile, DWORD imagetype)\r
+{\r
+ CxIOFile file(hFile);\r
+ return Decode(&file,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Loads an image from CxFile object\r
+ * \param hFile: file handle (CxMemFile or CxIOFile), with read access.\r
+ * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS\r
+ * \return true if everything is ok\r
+ * \sa ENUM_CXIMAGE_FORMATS\r
+ */\r
+bool CxImage::Decode(CxFile *hFile, DWORD imagetype)\r
+{\r
+ if (hFile == NULL){\r
+ strcpy(info.szLastError,CXIMAGE_ERR_NOFILE);\r
+ return false;\r
+ }\r
+\r
+ if (imagetype==CXIMAGE_FORMAT_UNKNOWN){\r
+ DWORD pos = hFile->Tell();\r
+#if CXIMAGE_SUPPORT_BMP\r
+ { CxImageBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JPG\r
+ { CxImageJPG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_ICO\r
+ { CxImageICO newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_GIF\r
+ { CxImageGIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_PNG\r
+ { CxImagePNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_TIF\r
+ { CxImageTIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_MNG\r
+ { CxImageMNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_TGA\r
+ { CxImageTGA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_PCX\r
+ { CxImagePCX newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_WBMP\r
+ { CxImageWBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS\r
+ { CxImageWMF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JBG\r
+ { CxImageJBG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JASPER\r
+ { CxImageJAS newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_SKA\r
+ { CxImageSKA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+#if CXIMAGE_SUPPORT_RAW\r
+ { CxImageRAW newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }\r
+#endif\r
+ }\r
+\r
+#if CXIMAGE_SUPPORT_BMP\r
+ if (imagetype==CXIMAGE_FORMAT_BMP){\r
+ CxImageBMP newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JPG\r
+ if (imagetype==CXIMAGE_FORMAT_JPG){\r
+ CxImageJPG newima;\r
+ newima.CopyInfo(*this); // <ignacio>\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_ICO\r
+ if (imagetype==CXIMAGE_FORMAT_ICO){\r
+ CxImageICO newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ info.nNumFrames = newima.info.nNumFrames;\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_GIF\r
+ if (imagetype==CXIMAGE_FORMAT_GIF){\r
+ CxImageGIF newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ info.nNumFrames = newima.info.nNumFrames;\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_PNG\r
+ if (imagetype==CXIMAGE_FORMAT_PNG){\r
+ CxImagePNG newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_TIF\r
+ if (imagetype==CXIMAGE_FORMAT_TIF){\r
+ CxImageTIF newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ info.nNumFrames = newima.info.nNumFrames;\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_MNG\r
+ if (imagetype==CXIMAGE_FORMAT_MNG){\r
+ CxImageMNG newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ info.nNumFrames = newima.info.nNumFrames;\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_TGA\r
+ if (imagetype==CXIMAGE_FORMAT_TGA){\r
+ CxImageTGA newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_PCX\r
+ if (imagetype==CXIMAGE_FORMAT_PCX){\r
+ CxImagePCX newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_WBMP\r
+ if (imagetype==CXIMAGE_FORMAT_WBMP){\r
+ CxImageWBMP newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS // vho - WMF support\r
+ if (imagetype == CXIMAGE_FORMAT_WMF){\r
+ CxImageWMF newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JBG\r
+ if (imagetype==CXIMAGE_FORMAT_JBG){\r
+ CxImageJBG newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_JASPER\r
+ if (\r
+ #if CXIMAGE_SUPPORT_JP2\r
+ imagetype==CXIMAGE_FORMAT_JP2 || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_JPC\r
+ imagetype==CXIMAGE_FORMAT_JPC || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_PGX\r
+ imagetype==CXIMAGE_FORMAT_PGX || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_PNM\r
+ imagetype==CXIMAGE_FORMAT_PNM || \r
+ #endif\r
+ #if CXIMAGE_SUPPORT_RAS\r
+ imagetype==CXIMAGE_FORMAT_RAS || \r
+ #endif\r
+ false ){\r
+ CxImageJAS newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile,imagetype)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+#if CXIMAGE_SUPPORT_SKA\r
+ if (imagetype==CXIMAGE_FORMAT_SKA){\r
+ CxImageSKA newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+\r
+#if CXIMAGE_SUPPORT_RAW\r
+ if (imagetype==CXIMAGE_FORMAT_RAW){\r
+ CxImageRAW newima;\r
+ newima.CopyInfo(*this);\r
+ if (newima.Decode(hFile)){\r
+ Transfer(newima);\r
+ return true;\r
+ } else {\r
+ strcpy(info.szLastError,newima.GetLastError());\r
+ return false;\r
+ }\r
+ }\r
+#endif\r
+\r
+ strcpy(info.szLastError,"Decode: Unknown or wrong format");\r
+ return false;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+/**\r
+ * Loads an image from CxFile object\r
+ * \param hFile: file handle (CxMemFile or CxIOFile), with read access.\r
+ * \param imagetype: file format, default = 0 (CXIMAGE_FORMAT_UNKNOWN)\r
+ * \return : if imagetype is not 0, the function returns true when imagetype\r
+ * matches the file image format. If imagetype is 0, the function returns true\r
+ * when the file image format is recognized as a supported format.\r
+ * If the returned value is true, use GetHeight(), GetWidth() or GetType()\r
+ * to retrieve the basic image information.\r
+ * \sa ENUM_CXIMAGE_FORMATS\r
+ */\r
+bool CxImage::CheckFormat(CxFile * hFile, DWORD imagetype)\r
+{\r
+ SetType(CXIMAGE_FORMAT_UNKNOWN);\r
+ SetEscape(-1);\r
+\r
+ if (!Decode(hFile,imagetype))\r
+ return false;\r
+\r
+ if (GetType() == CXIMAGE_FORMAT_UNKNOWN || GetType() != imagetype)\r
+ return false;\r
+\r
+ return true;\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+bool CxImage::CheckFormat(BYTE * buffer, DWORD size, DWORD imagetype)\r
+{\r
+ if (buffer==NULL || size==NULL){\r
+ strcpy(info.szLastError,"invalid or empty buffer");\r
+ return false;\r
+ }\r
+ CxMemFile file(buffer,size);\r
+ return CheckFormat(&file,imagetype);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+#endif //CXIMAGE_SUPPORT_DECODE\r
+////////////////////////////////////////////////////////////////////////////////\r