• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "SkRefCnt.h"
14 #include "SkTypeface.h"
15 #include "SkTArray.h"
16 
17 class SkTypefaceCache {
18 public:
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. This ref()s the typeface, so that the
30      *  cache is also an owner. Later, if we need to purge the cache, typefaces
31      *  whose refcnt is 1 (meaning only the cache is an owner) will be
32      *  unref()ed.
33      */
34     void add(SkTypeface*);
35 
36     /**
37      *  Iterate through the cache, calling proc(typeface, ctx) with each
38      *  typeface. If proc returns true, then we return that typeface (this
39      *  ref()s the typeface). If it never returns true, we return nullptr.
40      */
41     SkTypeface* findByProcAndRef(FindProc proc, void* ctx) const;
42 
43     /**
44      *  This will unref all of the typefaces in the cache for which the cache
45      *  is the only owner. Normally this is handled automatically as needed.
46      *  This function is exposed for clients that explicitly want to purge the
47      *  cache (e.g. to look for leaks).
48      */
49     void purgeAll();
50 
51     /**
52      *  Helper: returns a unique fontID to pass to the constructor of
53      *  your subclass of SkTypeface
54      */
55     static SkFontID NewFontID();
56 
57     // These are static wrappers around a global instance of a cache.
58 
59     static void Add(SkTypeface*);
60     static SkTypeface* FindByProcAndRef(FindProc proc, void* ctx);
61     static void PurgeAll();
62 
63     /**
64      *  Debugging only: dumps the status of the typefaces in the cache
65      */
66     static void Dump();
67 
68 private:
69     static SkTypefaceCache& Get();
70 
71     void purge(int count);
72 
73     SkTArray<sk_sp<SkTypeface>> fTypefaces;
74 };
75 
76 #endif
77