00001 // ========================================================== 00002 // FreeImagePlus 3 00003 // 00004 // Design and implementation by 00005 // - Hervé Drolon (drolon@infonie.fr) 00006 // 00007 // This file is part of FreeImage 3 00008 // 00009 // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY 00010 // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES 00011 // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE 00012 // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED 00013 // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT 00014 // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY 00015 // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL 00016 // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER 00017 // THIS DISCLAIMER. 00018 // 00019 // Use at your own risk! 00020 // ========================================================== 00021 00022 #ifndef FREEIMAGEPLUS_H 00023 #define FREEIMAGEPLUS_H 00024 00025 #ifdef _WIN32 00026 #include <windows.h> 00027 #endif // _WIN32 00028 #include "FreeImage.h" 00029 00030 00031 // Compiler options --------------------------------------------------------- 00032 00033 #if defined(FREEIMAGE_LIB) || !defined(_WIN32) 00034 #define FIP_API 00035 #define FIP_CALLCONV 00036 #else 00037 #define WIN32_LEAN_AND_MEAN 00038 #define FIP_CALLCONV __stdcall 00039 // The following ifdef block is the standard way of creating macros which make exporting 00040 // from a DLL simpler. All files within this DLL are compiled with the FIP_EXPORTS 00041 // symbol defined on the command line. this symbol should not be defined on any project 00042 // that uses this DLL. This way any other project whose source files include this file see 00043 // FIP_API functions as being imported from a DLL, wheras this DLL sees symbols 00044 // defined with this macro as being exported. 00045 #ifdef FIP_EXPORTS 00046 #define FIP_API __declspec(dllexport) 00047 #else 00048 #define FIP_API __declspec(dllimport) 00049 #endif // FIP_EXPORTS 00050 #endif // FREEIMAGE_LIB || !_WIN32 00051 00053 00054 // ---------------------------------------------------------- 00055 00061 class FIP_API fipObject 00062 { 00063 public: 00066 00067 virtual BOOL isValid() const = 0; 00069 }; 00070 00071 // ---------------------------------------------------------- 00072 00073 class fipMemoryIO; 00074 class fipMultiPage; 00075 class fipTag; 00076 00085 class FIP_API fipImage : public fipObject 00086 { 00087 protected: 00089 FIBITMAP *_dib; 00091 mutable BOOL _bHasChanged; 00092 00093 public: 00094 friend class fipMultiPage; 00095 00096 public: 00097 00104 fipImage(FREE_IMAGE_TYPE image_type = FIT_BITMAP, WORD width = 0, WORD height = 0, WORD bpp = 0); 00106 ~fipImage(); 00111 BOOL setSize(FREE_IMAGE_TYPE image_type, WORD width, WORD height, WORD bpp, unsigned red_mask = 0, unsigned green_mask = 0, unsigned blue_mask = 0); 00113 virtual void clear(); 00115 00122 fipImage(const fipImage& src); 00127 fipImage& operator=(const fipImage& src); 00133 fipImage& operator=(FIBITMAP *dib); 00134 00135 00148 BOOL copySubImage(fipImage& dst, int left, int top, int right, int bottom) const; 00149 00163 BOOL pasteSubImage(fipImage& src, int left, int top, int alpha = 256); 00164 00175 BOOL crop(int left, int top, int right, int bottom); 00176 00177 00179 00191 BOOL load(const char* lpszPathName, int flag = 0); 00192 00197 BOOL loadU(const wchar_t* lpszPathName, int flag = 0); 00198 00207 BOOL loadFromHandle(FreeImageIO *io, fi_handle handle, int flag = 0); 00208 00216 BOOL loadFromMemory(fipMemoryIO& memIO, int flag = 0); 00217 00225 BOOL save(const char* lpszPathName, int flag = 0) const; 00226 00231 BOOL saveU(const wchar_t* lpszPathName, int flag = 0) const; 00232 00242 BOOL saveToHandle(FREE_IMAGE_FORMAT fif, FreeImageIO *io, fi_handle handle, int flag = 0) const; 00243 00252 BOOL saveToMemory(FREE_IMAGE_FORMAT fif, fipMemoryIO& memIO, int flag = 0) const; 00253 00255 00260 00265 FREE_IMAGE_TYPE getImageType() const; 00266 00271 WORD getWidth() const; 00272 00277 WORD getHeight() const; 00278 00283 WORD getScanWidth() const; 00284 00297 operator FIBITMAP*() { 00298 return _dib; 00299 } 00300 00302 BOOL isValid() const; 00303 00308 BITMAPINFO* getInfo() const; 00309 00314 BITMAPINFOHEADER* getInfoHeader() const; 00315 00321 LONG getImageSize() const; 00322 00328 WORD getBitsPerPixel() const; 00329 00335 WORD getLine() const; 00336 00341 double getHorizontalResolution() const; 00342 00347 double getVerticalResolution() const; 00348 00353 void setHorizontalResolution(double value); 00354 00359 void setVerticalResolution(double value); 00360 00362 00369 RGBQUAD* getPalette() const; 00370 00375 WORD getPaletteSize() const; 00376 00381 WORD getColorsUsed() const; 00382 00387 FREE_IMAGE_COLOR_TYPE getColorType() const; 00388 00393 BOOL isGrayscale() const; 00395 00398 00407 BYTE* accessPixels() const; 00408 00414 BYTE* getScanLine(WORD scanline) const; 00415 00424 BOOL getPixelIndex(unsigned x, unsigned y, BYTE *value) const; 00425 00434 BOOL getPixelColor(unsigned x, unsigned y, RGBQUAD *value) const; 00435 00444 BOOL setPixelIndex(unsigned x, unsigned y, BYTE *value); 00445 00454 BOOL setPixelColor(unsigned x, unsigned y, RGBQUAD *value); 00455 00457 00469 BOOL convertToType(FREE_IMAGE_TYPE image_type, BOOL scale_linear = TRUE); 00470 00477 BOOL threshold(BYTE T); 00478 00485 BOOL dither(FREE_IMAGE_DITHER algorithm); 00486 00492 BOOL convertTo4Bits(); 00493 00499 BOOL convertTo8Bits(); 00500 00507 BOOL convertToGrayscale(); 00508 00516 BOOL colorQuantize(FREE_IMAGE_QUANTIZE algorithm); 00517 00523 BOOL convertTo16Bits555(); 00524 00530 BOOL convertTo16Bits565(); 00531 00537 BOOL convertTo24Bits(); 00538 00544 BOOL convertTo32Bits(); 00545 00551 BOOL convertToRGBF(); 00552 00561 BOOL toneMapping(FREE_IMAGE_TMO tmo, double first_param = 0, double second_param = 0); 00562 00564 00567 00572 BOOL isTransparent() const; 00573 00579 unsigned getTransparencyCount() const; 00580 00586 BYTE* getTransparencyTable() const; 00587 00592 void setTransparencyTable(BYTE *table, int count); 00593 00598 BOOL hasFileBkColor() const; 00599 00608 BOOL getFileBkColor(RGBQUAD *bkcolor) const; 00609 00618 BOOL setFileBkColor(RGBQUAD *bkcolor); 00620 00629 BOOL getChannel(fipImage& image, FREE_IMAGE_COLOR_CHANNEL channel) const; 00630 00638 BOOL setChannel(fipImage& image, FREE_IMAGE_COLOR_CHANNEL channel); 00639 00648 BOOL splitChannels(fipImage& RedChannel, fipImage& GreenChannel, fipImage& BlueChannel); 00649 00657 BOOL combineChannels(fipImage& red, fipImage& green, fipImage& blue); 00659 00673 BOOL rotateEx(double angle, double x_shift, double y_shift, double x_origin, double y_origin, BOOL use_mask); 00674 00681 BOOL rotate(double angle); 00682 00687 BOOL flipHorizontal(); 00688 00693 BOOL flipVertical(); 00695 00703 BOOL invert(); 00704 00718 BOOL adjustCurve(BYTE *LUT, FREE_IMAGE_COLOR_CHANNEL channel); 00719 00726 BOOL adjustGamma(double gamma); 00727 00735 BOOL adjustBrightness(double percentage); 00736 00744 BOOL adjustContrast(double percentage); 00745 00756 BOOL getHistogram(DWORD *histo, FREE_IMAGE_COLOR_CHANNEL channel = FICC_BLACK) const; 00758 00761 00770 BOOL rescale(WORD new_width, WORD new_height, FREE_IMAGE_FILTER filter); 00771 00779 BOOL makeThumbnail(WORD max_size, BOOL convert = TRUE); 00781 00791 void setModified(BOOL bStatus = TRUE) { 00792 _bHasChanged = bStatus; 00793 } 00794 00800 BOOL isModified() { 00801 return _bHasChanged; 00802 } 00804 00812 unsigned getMetadataCount(FREE_IMAGE_MDMODEL model) const; 00821 BOOL getMetadata(FREE_IMAGE_MDMODEL model, const char *key, fipTag& tag) const; 00830 BOOL setMetadata(FREE_IMAGE_MDMODEL model, const char *key, fipTag& tag); 00832 00833 00834 protected: 00837 BOOL replace(FIBITMAP *new_dib); 00839 00840 }; 00841 00842 // ---------------------------------------------------------- 00843 00855 #ifdef _WIN32 00856 00857 class FIP_API fipWinImage : public fipImage 00858 { 00859 public: 00862 00863 fipWinImage(FREE_IMAGE_TYPE image_type = FIT_BITMAP, WORD width = 0, WORD height = 0, WORD bpp = 0); 00864 00866 ~fipWinImage(); 00867 00869 virtual void clear(); 00870 00872 BOOL isValid() const; 00874 00877 00884 fipWinImage& operator=(const fipImage& src); 00885 00892 fipWinImage& operator=(const fipWinImage& src); 00893 00900 HANDLE copyToHandle() const; 00901 00908 BOOL copyFromHandle(HANDLE hMem); 00909 00914 BOOL copyFromBitmap(HBITMAP hbmp); 00916 00925 BOOL copyToClipboard(HWND hWndNewOwner) const; 00926 00931 BOOL pasteFromClipboard(); 00933 00941 BOOL captureWindow(HWND hWndApplicationWindow, HWND hWndSelectedWindow); 00943 00944 00947 00956 void draw(HDC hDC, RECT& rcDest) const { 00957 drawEx(hDC, rcDest, FALSE, NULL, NULL); 00958 } 00959 00977 void drawEx(HDC hDC, RECT& rcDest, BOOL useFileBkg = FALSE, RGBQUAD *appBkColor = NULL, FIBITMAP *bg = NULL) const; 00978 00987 void setToneMappingOperator(FREE_IMAGE_TMO tmo, double first_param = 0, double second_param = 0); 00988 00996 void getToneMappingOperator(FREE_IMAGE_TMO *tmo, double *first_param, double *second_param) const; 00997 00999 01000 protected: 01002 mutable FIBITMAP *_display_dib; 01004 mutable BOOL _bDeleteMe; 01006 FREE_IMAGE_TMO _tmo; 01008 double _tmo_param_1; 01010 double _tmo_param_2; 01011 }; 01012 01013 #endif // _WIN32 01014 01015 // ---------------------------------------------------------- 01016 01023 class FIP_API fipMemoryIO : public fipObject 01024 { 01025 protected: 01027 FIMEMORY *_hmem; 01028 01029 public : 01039 fipMemoryIO(BYTE *data = NULL, DWORD size_in_bytes = 0); 01040 01045 ~fipMemoryIO(); 01046 01049 BOOL isValid() const; 01050 01054 FREE_IMAGE_FORMAT getFileType() const; 01055 01065 FIBITMAP* load(FREE_IMAGE_FORMAT fif, int flags = 0) const; 01074 BOOL save(FREE_IMAGE_FORMAT fif, FIBITMAP *dib, int flags = 0); 01083 unsigned read(void *buffer, unsigned size, unsigned count) const; 01092 unsigned write(const void *buffer, unsigned size, unsigned count); 01097 long tell() const; 01102 BOOL seek(long offset, int origin); 01109 BOOL acquire(BYTE **data, DWORD *size_in_bytes); 01111 01112 private: 01114 fipMemoryIO(const fipMemoryIO& src); 01116 fipMemoryIO& operator=(const fipMemoryIO& src); 01117 01118 }; 01119 01120 // ---------------------------------------------------------- 01121 01127 class FIP_API fipMultiPage : public fipObject 01128 { 01129 protected: 01131 FIMULTIBITMAP *_mpage; 01133 BOOL _bMemoryCache; 01134 01135 public: 01140 fipMultiPage(BOOL keep_cache_in_memory = FALSE); 01141 01146 ~fipMultiPage(); 01147 01149 BOOL isValid() const; 01150 01160 BOOL open(const char* lpszPathName, BOOL create_new, BOOL read_only, int flags = 0); 01161 01168 BOOL close(int flags = 0); 01169 01174 int getPageCount() const; 01175 01181 void appendPage(fipImage& image); 01182 01189 void insertPage(int page, fipImage& image); 01190 01196 void deletePage(int page); 01197 01205 BOOL movePage(int target, int source); 01206 01224 FIBITMAP* lockPage(int page); 01225 01232 void unlockPage(fipImage& image, BOOL changed); 01233 01242 BOOL getLockedPageNumbers(int *pages, int *count) const; 01243 }; 01244 01245 // ---------------------------------------------------------- 01246 01252 class FIP_API fipTag : public fipObject 01253 { 01254 protected: 01256 FITAG *_tag; 01257 01258 public: 01265 fipTag(); 01270 ~fipTag(); 01272 01279 fipTag(const fipTag& tag); 01284 fipTag& operator=(const fipTag& tag); 01290 fipTag& operator=(FITAG *tag); 01292 01298 operator FITAG*() { 01299 return _tag; 01300 } 01301 01303 BOOL isValid() const; 01304 01311 const char *getKey() const; 01316 const char *getDescription() const; 01321 WORD getID() const; 01326 FREE_IMAGE_MDTYPE getType() const; 01331 DWORD getCount() const; 01336 DWORD getLength() const; 01341 const void *getValue() const; 01347 BOOL setKey(const char *key); 01353 BOOL setDescription(const char *description); 01359 BOOL setID(WORD id); 01365 BOOL setType(FREE_IMAGE_MDTYPE type); 01371 BOOL setCount(DWORD count); 01377 BOOL setLength(DWORD length); 01383 BOOL setValue(const void *value); 01384 01386 01392 const char* toString(FREE_IMAGE_MDMODEL model, char *Make = NULL) const; 01393 01394 }; 01395 01422 class FIP_API fipMetadataFind : public fipObject 01423 { 01424 protected: 01426 FIMETADATA *_mdhandle; 01427 01428 public: 01430 fipMetadataFind(); 01435 ~fipMetadataFind(); 01445 BOOL findFirstMetadata(FREE_IMAGE_MDMODEL model, fipImage& image, fipTag& tag); 01453 BOOL findNextMetadata(fipTag& tag); 01454 01455 }; 01456 01457 #endif // FREEIMAGEPLUS_H