summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/core/SkStrikeCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/core/SkStrikeCache.h')
-rw-r--r--gfx/skia/skia/src/core/SkStrikeCache.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/core/SkStrikeCache.h b/gfx/skia/skia/src/core/SkStrikeCache.h
new file mode 100644
index 0000000000..76d7d1eb98
--- /dev/null
+++ b/gfx/skia/skia/src/core/SkStrikeCache.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkStrikeCache_DEFINED
+#define SkStrikeCache_DEFINED
+
+#include "include/core/SkDrawable.h"
+#include "include/private/SkSpinlock.h"
+#include "include/private/base/SkLoadUserConfig.h" // IWYU pragma: keep
+#include "include/private/base/SkMutex.h"
+#include "src/core/SkDescriptor.h"
+#include "src/core/SkStrikeSpec.h"
+#include "src/text/StrikeForGPU.h"
+
+class SkStrike;
+class SkStrikePinner;
+class SkTraceMemoryDump;
+
+// SK_DEFAULT_FONT_CACHE_COUNT_LIMIT and SK_DEFAULT_FONT_CACHE_LIMIT can be set using -D on your
+// compiler commandline, or by using the defines in SkUserConfig.h
+#ifndef SK_DEFAULT_FONT_CACHE_COUNT_LIMIT
+ #define SK_DEFAULT_FONT_CACHE_COUNT_LIMIT 2048
+#endif
+
+#ifndef SK_DEFAULT_FONT_CACHE_LIMIT
+ #define SK_DEFAULT_FONT_CACHE_LIMIT (2 * 1024 * 1024)
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+
+class SkStrikeCache final : public sktext::StrikeForGPUCacheInterface {
+public:
+ SkStrikeCache() = default;
+
+ static SkStrikeCache* GlobalStrikeCache();
+
+ sk_sp<SkStrike> findStrike(const SkDescriptor& desc) SK_EXCLUDES(fLock);
+
+ sk_sp<SkStrike> createStrike(
+ const SkStrikeSpec& strikeSpec,
+ SkFontMetrics* maybeMetrics = nullptr,
+ std::unique_ptr<SkStrikePinner> = nullptr) SK_EXCLUDES(fLock);
+
+ sk_sp<SkStrike> findOrCreateStrike(const SkStrikeSpec& strikeSpec) SK_EXCLUDES(fLock);
+
+ sk_sp<sktext::StrikeForGPU> findOrCreateScopedStrike(
+ const SkStrikeSpec& strikeSpec) override SK_EXCLUDES(fLock);
+
+ static void PurgeAll();
+ static void Dump();
+
+ // Dump memory usage statistics of all the attaches caches in the process using the
+ // SkTraceMemoryDump interface.
+ static void DumpMemoryStatistics(SkTraceMemoryDump* dump);
+
+ void purgeAll() SK_EXCLUDES(fLock); // does not change budget
+
+ int getCacheCountLimit() const SK_EXCLUDES(fLock);
+ int setCacheCountLimit(int limit) SK_EXCLUDES(fLock);
+ int getCacheCountUsed() const SK_EXCLUDES(fLock);
+
+ size_t getCacheSizeLimit() const SK_EXCLUDES(fLock);
+ size_t setCacheSizeLimit(size_t limit) SK_EXCLUDES(fLock);
+ size_t getTotalMemoryUsed() const SK_EXCLUDES(fLock);
+
+private:
+ friend class SkStrike; // for SkStrike::updateDelta
+ static constexpr char kGlyphCacheDumpName[] = "skia/sk_glyph_cache";
+ sk_sp<SkStrike> internalFindStrikeOrNull(const SkDescriptor& desc) SK_REQUIRES(fLock);
+ sk_sp<SkStrike> internalCreateStrike(
+ const SkStrikeSpec& strikeSpec,
+ SkFontMetrics* maybeMetrics = nullptr,
+ std::unique_ptr<SkStrikePinner> = nullptr) SK_REQUIRES(fLock);
+
+ // The following methods can only be called when mutex is already held.
+ void internalRemoveStrike(SkStrike* strike) SK_REQUIRES(fLock);
+ void internalAttachToHead(sk_sp<SkStrike> strike) SK_REQUIRES(fLock);
+
+ // Checkout budgets, modulated by the specified min-bytes-needed-to-purge,
+ // and attempt to purge caches to match.
+ // Returns number of bytes freed.
+ size_t internalPurge(size_t minBytesNeeded = 0) SK_REQUIRES(fLock);
+
+ // A simple accounting of what each glyph cache reports and the strike cache total.
+ void validate() const SK_REQUIRES(fLock);
+
+ void forEachStrike(std::function<void(const SkStrike&)> visitor) const SK_EXCLUDES(fLock);
+
+ mutable SkMutex fLock;
+ SkStrike* fHead SK_GUARDED_BY(fLock) {nullptr};
+ SkStrike* fTail SK_GUARDED_BY(fLock) {nullptr};
+ struct StrikeTraits {
+ static const SkDescriptor& GetKey(const sk_sp<SkStrike>& strike);
+ static uint32_t Hash(const SkDescriptor& descriptor);
+ };
+ SkTHashTable<sk_sp<SkStrike>, SkDescriptor, StrikeTraits> fStrikeLookup SK_GUARDED_BY(fLock);
+
+ size_t fCacheSizeLimit{SK_DEFAULT_FONT_CACHE_LIMIT};
+ size_t fTotalMemoryUsed SK_GUARDED_BY(fLock) {0};
+ int32_t fCacheCountLimit{SK_DEFAULT_FONT_CACHE_COUNT_LIMIT};
+ int32_t fCacheCount SK_GUARDED_BY(fLock) {0};
+};
+
+#endif // SkStrikeCache_DEFINED