| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright 2013 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 | |
| 8 #ifndef SkLruImageCache_DEFINED | |
| 9 #define SkLruImageCache_DEFINED | |
| 10 | |
| 11 #include "SkImageCache.h" | |
| 12 #include "SkThread.h" | |
| 13 #include "SkTInternalLList.h" | |
| 14 | |
| 15 class CachedPixels; | |
| 16 | |
| 17 /** | |
| 18 * SkImageCache implementation that uses an LRU cache to age out old images. | |
| 19 */ | |
| 20 class SkLruImageCache : public SkImageCache { | |
| 21 | |
| 22 public: | |
| 23 SK_DECLARE_INST_COUNT(SkLruImageCache) | |
| 24 | |
| 25 SkLruImageCache(size_t budget); | |
| 26 | |
| 27 virtual ~SkLruImageCache(); | |
| 28 | |
| 29 #ifdef SK_DEBUG | |
| 30 virtual MemoryStatus getMemoryStatus(ID) const SK_OVERRIDE; | |
| 31 virtual void purgeAllUnpinnedCaches() SK_OVERRIDE; | |
| 32 #endif | |
| 33 | |
| 34 /** | |
| 35 * Set the byte limit on cached pixels. If more bytes are used than this, t
he cache will free | |
| 36 * unpinned memory until under the new limit or until all unpinned memory i
s freed. This will | |
| 37 * never free pinned memory, so the cache can potentially remain over the l
imit. The limit is | |
| 38 * enforced each time memory is allocated or released. | |
| 39 * 0 is a special flag for an infinite budget. | |
| 40 * @return size_t The previous limit. | |
| 41 */ | |
| 42 size_t setImageCacheLimit(size_t newLimit); | |
| 43 | |
| 44 /** | |
| 45 * Return the number of bytes of memory currently in use by the cache. Can
include memory that | |
| 46 * is no longer pinned, but has not been freed. | |
| 47 */ | |
| 48 size_t getImageCacheUsed() const { return fRamUsed; } | |
| 49 | |
| 50 virtual void* allocAndPinCache(size_t bytes, ID*) SK_OVERRIDE; | |
| 51 virtual void* pinCache(ID, SkImageCache::DataStatus*) SK_OVERRIDE; | |
| 52 virtual void releaseCache(ID) SK_OVERRIDE; | |
| 53 virtual void throwAwayCache(ID) SK_OVERRIDE; | |
| 54 | |
| 55 private: | |
| 56 // Linked list of recently used. Head is the most recently used, and tail is
the least. | |
| 57 SkTInternalLList<CachedPixels> fLRU; | |
| 58 typedef SkTInternalLList<CachedPixels>::Iter Iter; | |
| 59 | |
| 60 #ifdef SK_DEBUG | |
| 61 // fMutex is mutable so that getMemoryStatus can be const | |
| 62 mutable | |
| 63 #endif | |
| 64 SkMutex fMutex; | |
| 65 size_t fRamBudget; | |
| 66 size_t fRamUsed; | |
| 67 | |
| 68 /** | |
| 69 * Find the CachedPixels represented by ID, or NULL if not in the cache. Mu
tex must be locked | |
| 70 * before calling. | |
| 71 */ | |
| 72 CachedPixels* findByID(ID) const; | |
| 73 | |
| 74 /** | |
| 75 * If over budget, throw away pixels which are not currently in use until b
elow budget or there | |
| 76 * are no more pixels eligible to be thrown away. Mutex must be locked befo
re calling. | |
| 77 */ | |
| 78 void purgeIfNeeded(); | |
| 79 | |
| 80 /** | |
| 81 * Purge until below limit. Mutex must be locked before calling. | |
| 82 */ | |
| 83 void purgeTilAtOrBelow(size_t limit); | |
| 84 | |
| 85 /** | |
| 86 * Remove a set of CachedPixels. Mutex must be locked before calling. | |
| 87 */ | |
| 88 void removePixels(CachedPixels*); | |
| 89 typedef SkImageCache INHERITED; | |
| 90 }; | |
| 91 | |
| 92 #endif // SkLruImageCache_DEFINED | |
| OLD | NEW |