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