blob: ae37ab76ec4ba6cfd4984087606eb78f40030f08 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.com2f3dc9d2011-05-02 17:33:45 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@google.com2f3dc9d2011-05-02 17:33:45 +00007 */
8
9
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
reed@google.com2f3dc9d2011-05-02 17:33:45 +000011#ifndef SkTypefaceCache_DEFINED
12#define SkTypefaceCache_DEFINED
13
14#include "SkTypeface.h"
15#include "SkTDArray.h"
16
17/* TODO
18 * Provide std way to cache name+requestedStyle aliases to the same typeface.
19 *
20 * The current mechanism ends up create a diff typeface for each one, even if
21 * they map to the same internal obj (e.g. CTFontRef on the mac)
22 */
23
24class SkTypefaceCache {
25public:
reed@google.com03b87812013-08-13 14:59:17 +000026 SkTypefaceCache();
27 ~SkTypefaceCache();
28
bungeman@google.comee51d1a2012-02-16 12:40:48 +000029 /**
30 * Callback for FindByProc. Returns true if the given typeface is a match
31 * for the given context. The passed typeface is owned by the cache and is
bungeman@google.coma02bc152012-05-16 18:21:56 +000032 * not additionally ref()ed. The typeface may be in the disposed state.
bungeman@google.comee51d1a2012-02-16 12:40:48 +000033 */
reed@google.com2f3dc9d2011-05-02 17:33:45 +000034 typedef bool (*FindProc)(SkTypeface*, SkTypeface::Style, void* context);
35
36 /**
reed@google.com2f3dc9d2011-05-02 17:33:45 +000037 * Add a typeface to the cache. This ref()s the typeface, so that the
bungeman@google.comee51d1a2012-02-16 12:40:48 +000038 * cache is also an owner. Later, if we need to purge the cache, typefaces
39 * whose refcnt is 1 (meaning only the cache is an owner) will be
40 * unref()ed.
reed@google.com2f3dc9d2011-05-02 17:33:45 +000041 */
reed@google.com03b87812013-08-13 14:59:17 +000042 void add(SkTypeface*, SkTypeface::Style requested, bool strong = true);
reed@google.com2f3dc9d2011-05-02 17:33:45 +000043
44 /**
45 * Search the cache for a typeface with the specified fontID (uniqueID).
46 * If one is found, return it (its reference count is unmodified). If none
bungeman@google.comee51d1a2012-02-16 12:40:48 +000047 * is found, return NULL. The reference count is unmodified as it is
48 * assumed that the stack will contain a ref to the typeface.
reed@google.com2f3dc9d2011-05-02 17:33:45 +000049 */
reed@google.com03b87812013-08-13 14:59:17 +000050 SkTypeface* findByID(SkFontID findID) const;
reed@google.com2f3dc9d2011-05-02 17:33:45 +000051
52 /**
53 * Iterate through the cache, calling proc(typeface, ctx) with each
bungeman@google.comee51d1a2012-02-16 12:40:48 +000054 * typeface. If proc returns true, then we return that typeface (this
55 * ref()s the typeface). If it never returns true, we return NULL.
reed@google.com2f3dc9d2011-05-02 17:33:45 +000056 */
reed@google.com03b87812013-08-13 14:59:17 +000057 SkTypeface* findByProcAndRef(FindProc proc, void* ctx) const;
reed@google.com2f3dc9d2011-05-02 17:33:45 +000058
59 /**
bungeman@google.comee51d1a2012-02-16 12:40:48 +000060 * This will unref all of the typefaces in the cache for which the cache
61 * is the only owner. Normally this is handled automatically as needed.
62 * This function is exposed for clients that explicitly want to purge the
63 * cache (e.g. to look for leaks).
reed@google.comd40da642011-10-20 13:18:37 +000064 */
reed@google.com03b87812013-08-13 14:59:17 +000065 void purgeAll();
66
67 /**
68 * Helper: returns a unique fontID to pass to the constructor of
69 * your subclass of SkTypeface
70 */
71 static SkFontID NewFontID();
72
73 // These are static wrappers around a global instance of a cache.
74
75 static void Add(SkTypeface*,
76 SkTypeface::Style requested,
77 bool strong = true);
78 static SkTypeface* FindByID(SkFontID fontID);
79 static SkTypeface* FindByProcAndRef(FindProc proc, void* ctx);
reed@google.comd40da642011-10-20 13:18:37 +000080 static void PurgeAll();
81
82 /**
reed@google.com2f3dc9d2011-05-02 17:33:45 +000083 * Debugging only: dumps the status of the typefaces in the cache
84 */
85 static void Dump();
86
87private:
88 static SkTypefaceCache& Get();
89
reed@google.com2f3dc9d2011-05-02 17:33:45 +000090 void purge(int count);
reed@google.com2f3dc9d2011-05-02 17:33:45 +000091
92 struct Rec {
93 SkTypeface* fFace;
bungeman@google.coma02bc152012-05-16 18:21:56 +000094 bool fStrong;
reed@google.com2f3dc9d2011-05-02 17:33:45 +000095 SkTypeface::Style fRequestedStyle;
96 };
97 SkTDArray<Rec> fArray;
98};
99
100#endif