Index: skia/gl/SkTextureCache.h |
=================================================================== |
--- skia/gl/SkTextureCache.h (revision 16859) |
+++ skia/gl/SkTextureCache.h (working copy) |
@@ -1,161 +0,0 @@ |
-#ifndef SkTextureCache_DEFINED |
-#define SkTextureCache_DEFINED |
- |
-#include "SkBitmap.h" |
-#include "SkPoint.h" |
-#include "SkGL.h" |
-#include "SkTDArray.h" |
- |
-class SkTextureCache { |
-public: |
- SkTextureCache(size_t maxCount, size_t maxSize); |
- ~SkTextureCache(); |
- |
- size_t getMaxCount() { return fTexCountMax; } |
- size_t getMaxSize() { return fTexSizeMax; } |
- |
- void setMaxCount(size_t count); |
- void setMaxSize(size_t size); |
- |
- /** Deletes all the caches. Pass true if the texture IDs are still valid, |
- and if so, it will call glDeleteTextures. Pass false if the texture IDs |
- are invalid (e.g. the gl-context has changed), in which case they will |
- just be abandoned. |
- */ |
- void deleteAllCaches(bool texturesAreValid); |
- |
- static int HashMask() { return kHashMask; } |
- |
- class Key { |
- public: |
- Key(const SkBitmap& bm) { |
- fGenID = bm.getGenerationID(); |
- fOffset = bm.pixelRefOffset(); |
- fWH = (bm.width() << 16) | bm.height(); |
- this->computeHash(); |
- } |
- |
- int getHashIndex() const { return fHashIndex; } |
- |
- friend bool operator==(const Key& a, const Key& b) { |
- return a.fHash == b.fHash && |
- a.fGenID == b.fGenID && |
- a.fOffset == b.fOffset && |
- a.fWH == b.fWH; |
- } |
- |
- friend bool operator<(const Key& a, const Key& b) { |
- if (a.fHash < b.fHash) { |
- return true; |
- } else if (a.fHash > b.fHash) { |
- return false; |
- } |
- |
- if (a.fGenID < b.fGenID) { |
- return true; |
- } else if (a.fGenID > b.fGenID) { |
- return false; |
- } |
- |
- if (a.fOffset < b.fOffset) { |
- return true; |
- } else if (a.fOffset > b.fOffset) { |
- return false; |
- } |
- |
- return a.fWH < b.fWH; |
- } |
- |
- private: |
- void computeHash() { |
- uint32_t hash = fGenID ^ fOffset ^ fWH; |
- fHash = hash; |
- hash ^= hash >> 16; |
- fHashIndex = hash & SkTextureCache::HashMask(); |
- } |
- |
- uint32_t fHash; // computed from the other fields |
- uint32_t fGenID; |
- size_t fOffset; |
- uint32_t fWH; |
- // for indexing into the texturecache's fHash |
- int fHashIndex; |
- }; |
- |
- class Entry { |
- public: |
- GLuint name() const { return fName; } |
- SkPoint texSize() const { return fTexSize; } |
- size_t memSize() const { return fMemSize; } |
- const Key& getKey() const { return fKey; } |
- |
- // call this to clear the texture name, in case the context has changed |
- // in which case we should't reference or delete this texture in GL |
- void abandonTexture() { fName = 0; } |
- |
- private: |
- Entry(const SkBitmap& bitmap); |
- ~Entry(); |
- |
- int lockCount() const { return fLockCount; } |
- bool isLocked() const { return fLockCount > 0; } |
- |
- void lock() { fLockCount += 1; } |
- void unlock() { |
- SkASSERT(fLockCount > 0); |
- fLockCount -= 1; |
- } |
- |
- private: |
- GLuint fName; |
- SkPoint fTexSize; |
- Key fKey; |
- size_t fMemSize; |
- int fLockCount; |
- |
- Entry* fPrev; |
- Entry* fNext; |
- |
- friend class SkTextureCache; |
- }; |
- |
- Entry* lock(const SkBitmap&); |
- void unlock(Entry*); |
- |
-private: |
- void purgeIfNecessary(size_t extraSize); |
- |
-#ifdef SK_DEBUG |
- void validate() const; |
-#else |
- void validate() const {} |
-#endif |
- |
- Entry* fHead; |
- Entry* fTail; |
- |
- // limits for the cache |
- size_t fTexCountMax; |
- size_t fTexSizeMax; |
- |
- // current values for the cache |
- size_t fTexCount; |
- size_t fTexSize; |
- |
- enum { |
- kHashBits = 6, |
- kHashCount = 1 << kHashBits, |
- kHashMask = kHashCount - 1 |
- }; |
- mutable Entry* fHash[kHashCount]; |
- SkTDArray<Entry*> fSorted; |
- |
- /* If we find the key, return the entry and ignore index. If we don't, |
- return NULL and set index to the place to insert the entry in fSorted |
- */ |
- Entry* find(const Key&, int* index) const; |
- // returns index or <0 if not found. Does NOT update hash |
- int findInSorted(const Key& key) const; |
-}; |
- |
-#endif |