1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
9
10#ifndef SkTypefaceCache_DEFINED
11#define SkTypefaceCache_DEFINED
12
13#include "include/core/SkRefCnt.h"
14#include "include/core/SkTypeface.h"
15#include "include/private/SkTArray.h"
16
17class SkTypefaceCache {
18public:
19 SkTypefaceCache();
20
21 /**
22 * Callback for FindByProc. Returns true if the given typeface is a match
23 * for the given context. The passed typeface is owned by the cache and is
24 * not additionally ref()ed. The typeface may be in the disposed state.
25 */
26 typedef bool(*FindProc)(SkTypeface*, void* context);
27
28 /**
29 * Add a typeface to the cache. Later, if we need to purge the cache,
30 * typefaces uniquely owned by the cache will be unref()ed.
31 */
32 void add(sk_sp<SkTypeface>);
33
34 /**
35 * Iterate through the cache, calling proc(typeface, ctx) for each typeface.
36 * If proc returns true, then return that typeface.
37 * If it never returns true, return nullptr.
38 */
39 sk_sp<SkTypeface> findByProcAndRef(FindProc proc, void* ctx) const;
40
41 /**
42 * This will unref all of the typefaces in the cache for which the cache
43 * is the only owner. Normally this is handled automatically as needed.
44 * This function is exposed for clients that explicitly want to purge the
45 * cache (e.g. to look for leaks).
46 */
47 void purgeAll();
48
49 /**
50 * Helper: returns a unique fontID to pass to the constructor of
51 * your subclass of SkTypeface
52 */
53 static SkFontID NewFontID();
54
55 // These are static wrappers around a global instance of a cache.
56
57 static void Add(sk_sp<SkTypeface>);
58 static sk_sp<SkTypeface> FindByProcAndRef(FindProc proc, void* ctx);
59 static void PurgeAll();
60
61 /**
62 * Debugging only: dumps the status of the typefaces in the cache
63 */
64 static void Dump();
65
66private:
67 static SkTypefaceCache& Get();
68
69 void purge(int count);
70
71 SkTArray<sk_sp<SkTypeface>> fTypefaces;
72};
73
74#endif
75