// ========================================================== // Multi-Page functions // // Design and implementation by // - Floris van den Berg (flvdberg@wxs.nl) // // 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! // ========================================================== #ifndef FREEIMAGE_CACHEFILE_H #define FREEIMAGE_CACHEFILE_H // ---------------------------------------------------------- #include "FreeImage.h" #include "Utilities.h" // ---------------------------------------------------------- static const int CACHE_SIZE = 32; static const int BLOCK_SIZE = (64 * 1024) - 8; // ---------------------------------------------------------- #ifdef _WIN32 #pragma pack(push, 1) #else #pragma pack(1) #endif // _WIN32 struct Block { unsigned nr; unsigned next; uint8_t *data; }; #ifdef _WIN32 #pragma pack(pop) #else #pragma pack() #endif // _WIN32 // ---------------------------------------------------------- class CacheFile { typedef std::list PageCache; typedef std::list::iterator PageCacheIt; typedef std::map PageMap; typedef std::map::iterator PageMapIt; public : CacheFile(); ~CacheFile(); BOOL open(const std::string& filename = "", BOOL keep_in_memory = TRUE); void close(); BOOL readFile(uint8_t *data, int nr, int size); int writeFile(uint8_t *data, int size); void deleteFile(int nr); private : void cleanupMemCache(); int allocateBlock(); Block *lockBlock(int nr); BOOL unlockBlock(int nr); BOOL deleteBlock(int nr); private : FILE *m_file; std::string m_filename; std::list m_free_pages; PageCache m_page_cache_mem; PageCache m_page_cache_disk; PageMap m_page_map; int m_page_count; Block *m_current_block; BOOL m_keep_in_memory; }; #endif // FREEIMAGE_CACHEFILE_H