summaryrefslogtreecommitdiff
path: root/plugins/FreeImage/src/CacheFile.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/FreeImage/src/CacheFile.h')
-rw-r--r--plugins/FreeImage/src/CacheFile.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/plugins/FreeImage/src/CacheFile.h b/plugins/FreeImage/src/CacheFile.h
new file mode 100644
index 0000000000..a1e5e782c9
--- /dev/null
+++ b/plugins/FreeImage/src/CacheFile.h
@@ -0,0 +1,92 @@
+// ==========================================================
+// 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 CACHEFILE_H
+#define 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;
+ BYTE *data;
+};
+
+#ifdef _WIN32
+#pragma pack(pop)
+#else
+#pragma pack()
+#endif // _WIN32
+
+// ----------------------------------------------------------
+
+class CacheFile {
+ typedef std::list<Block *> PageCache;
+ typedef std::list<Block *>::iterator PageCacheIt;
+ typedef std::map<int, PageCacheIt> PageMap;
+ typedef std::map<int, PageCacheIt>::iterator PageMapIt;
+
+public :
+ CacheFile(const std::string filename, BOOL keep_in_memory);
+ ~CacheFile();
+
+ BOOL open();
+ void close();
+ BOOL readFile(BYTE *data, int nr, int size);
+ int writeFile(BYTE *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<int> 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 // CACHEFILE_H