xref: /aosp_15_r20/external/skia/modules/skparagraph/include/ParagraphCache.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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