1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC. 2*c8dee2aaSAndroid Build Coastguard Worker #ifndef ParagraphCache_DEFINED 3*c8dee2aaSAndroid Build Coastguard Worker #define ParagraphCache_DEFINED 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMutex.h" 6*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkLRUCache.h" 7*c8dee2aaSAndroid Build Coastguard Worker #include <functional> // std::function 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker #define PARAGRAPH_CACHE_STATS 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker namespace skia { 12*c8dee2aaSAndroid Build Coastguard Worker namespace textlayout { 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker class ParagraphImpl; 15*c8dee2aaSAndroid Build Coastguard Worker class ParagraphCacheKey; 16*c8dee2aaSAndroid Build Coastguard Worker class ParagraphCacheValue; 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker class ParagraphCache { 19*c8dee2aaSAndroid Build Coastguard Worker public: 20*c8dee2aaSAndroid Build Coastguard Worker ParagraphCache(); 21*c8dee2aaSAndroid Build Coastguard Worker ~ParagraphCache(); 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker void abandon(); 24*c8dee2aaSAndroid Build Coastguard Worker void reset(); 25*c8dee2aaSAndroid Build Coastguard Worker bool updateParagraph(ParagraphImpl* paragraph); 26*c8dee2aaSAndroid Build Coastguard Worker bool findParagraph(ParagraphImpl* paragraph); 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker // For testing setChecker(std::function<void (ParagraphImpl * impl,const char *,bool)> checker)29*c8dee2aaSAndroid Build Coastguard Worker void setChecker(std::function<void(ParagraphImpl* impl, const char*, bool)> checker) { 30*c8dee2aaSAndroid Build Coastguard Worker fChecker = std::move(checker); 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker void printStatistics(); turnOn(bool value)33*c8dee2aaSAndroid Build Coastguard Worker void turnOn(bool value) { fCacheIsOn = value; } count()34*c8dee2aaSAndroid Build Coastguard Worker int count() { return fLRUCacheMap.count(); } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker bool isPossiblyTextEditing(ParagraphImpl* paragraph); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker private: 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker struct Entry; 41*c8dee2aaSAndroid Build Coastguard Worker void updateFrom(const ParagraphImpl* paragraph, Entry* entry); 42*c8dee2aaSAndroid Build Coastguard Worker void updateTo(ParagraphImpl* paragraph, const Entry* entry); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker mutable SkMutex fParagraphMutex; 45*c8dee2aaSAndroid Build Coastguard Worker std::function<void(ParagraphImpl* impl, const char*, bool)> fChecker; 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker static const int kMaxEntries = 128; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker struct KeyHash { 50*c8dee2aaSAndroid Build Coastguard Worker uint32_t operator()(const ParagraphCacheKey& key) const; 51*c8dee2aaSAndroid Build Coastguard Worker }; 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker SkLRUCache<ParagraphCacheKey, std::unique_ptr<Entry>, KeyHash> fLRUCacheMap; 54*c8dee2aaSAndroid Build Coastguard Worker bool fCacheIsOn; 55*c8dee2aaSAndroid Build Coastguard Worker ParagraphCacheValue* fLastCachedValue; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker #ifdef PARAGRAPH_CACHE_STATS 58*c8dee2aaSAndroid Build Coastguard Worker int fTotalRequests; 59*c8dee2aaSAndroid Build Coastguard Worker int fCacheMisses; 60*c8dee2aaSAndroid Build Coastguard Worker int fHashMisses; // cache hit but hash table missed 61*c8dee2aaSAndroid Build Coastguard Worker #endif 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker } // namespace textlayout 65*c8dee2aaSAndroid Build Coastguard Worker } // namespace skia 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker #endif // ParagraphCache_DEFINED 68