334a642b20
These unused comparison operators are the only users of <functional> in SkRefCnt.h, for std::less. <functional> is an expensive header to compile, and SkRefCnt.h is popular, so it helps to cut dependencies like this. Mostly we just need to add #include <functional> in a few places that were picking it up via SkRefCnt.h. In SkPixmapPriv.h, it looked simpler to template the argument, since everything was inline anyway. Change-Id: I7c125bb26a04199847357c729a1b178256c6ef8d Reviewed-on: https://skia-review.googlesource.com/c/skia/+/236942 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
87 lines
2.0 KiB
C++
87 lines
2.0 KiB
C++
// Copyright 2019 Google LLC.
|
|
#ifndef ParagraphCache_DEFINED
|
|
#define ParagraphCache_DEFINED
|
|
|
|
#include "include/private/SkMutex.h"
|
|
#include "src/core/SkLRUCache.h"
|
|
#include <functional> // std::function
|
|
|
|
#define PARAGRAPH_CACHE_STATS
|
|
|
|
namespace skia {
|
|
namespace textlayout {
|
|
|
|
struct Measurement {
|
|
SkScalar fAlphabeticBaseline;
|
|
SkScalar fIdeographicBaseline;
|
|
SkScalar fHeight;
|
|
SkScalar fWidth;
|
|
SkScalar fMaxIntrinsicWidth;
|
|
SkScalar fMinIntrinsicWidth;
|
|
};
|
|
|
|
enum InternalState {
|
|
kUnknown = 0,
|
|
kShaped = 1,
|
|
kClusterized = 2,
|
|
kMarked = 3,
|
|
kLineBroken = 4,
|
|
kFormatted = 5,
|
|
kDrawn = 6
|
|
};
|
|
|
|
class ParagraphImpl;
|
|
class ParagraphCacheKey;
|
|
class ParagraphCacheValue;
|
|
|
|
bool operator==(const ParagraphCacheKey& a, const ParagraphCacheKey& b);
|
|
|
|
class ParagraphCache {
|
|
public:
|
|
ParagraphCache();
|
|
~ParagraphCache();
|
|
|
|
void abandon();
|
|
void reset();
|
|
bool updateParagraph(ParagraphImpl* paragraph);
|
|
bool findParagraph(ParagraphImpl* paragraph);
|
|
|
|
// For testing
|
|
void setChecker(std::function<void(ParagraphImpl* impl, const char*, bool)> checker) {
|
|
fChecker = std::move(checker);
|
|
}
|
|
void printStatistics();
|
|
void turnOn(bool value) { fCacheIsOn = value; }
|
|
int count() { return fLRUCacheMap.count(); }
|
|
|
|
private:
|
|
|
|
struct Entry;
|
|
void updateFrom(const ParagraphImpl* paragraph, Entry* entry);
|
|
void updateTo(ParagraphImpl* paragraph, const Entry* entry);
|
|
|
|
mutable SkMutex fParagraphMutex;
|
|
std::function<void(ParagraphImpl* impl, const char*, bool)> fChecker;
|
|
|
|
static const int kMaxEntries = 128;
|
|
|
|
struct KeyHash {
|
|
uint32_t mix(uint32_t hash, uint32_t data) const;
|
|
uint32_t operator()(const ParagraphCacheKey& key) const;
|
|
};
|
|
|
|
SkLRUCache<ParagraphCacheKey, std::unique_ptr<Entry>, KeyHash> fLRUCacheMap;
|
|
bool fCacheIsOn;
|
|
|
|
#ifdef PARAGRAPH_CACHE_STATS
|
|
int fTotalRequests;
|
|
int fCacheMisses;
|
|
int fHashMisses; // cache hit but hash table missed
|
|
#endif
|
|
};
|
|
|
|
} // namespace textlayout
|
|
} // namespace skia
|
|
|
|
#endif // ParagraphCache_DEFINED
|