/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkTypefaceCache_DEFINED #define SkTypefaceCache_DEFINED #include "SkRefCnt.h" #include "SkTypeface.h" #include "SkTArray.h" class SkTypefaceCache { public: SkTypefaceCache(); /** * Callback for FindByProc. Returns true if the given typeface is a match * for the given context. The passed typeface is owned by the cache and is * not additionally ref()ed. The typeface may be in the disposed state. */ typedef bool(*FindProc)(SkTypeface*, void* context); /** * Add a typeface to the cache. This ref()s the typeface, so that the * cache is also an owner. Later, if we need to purge the cache, typefaces * whose refcnt is 1 (meaning only the cache is an owner) will be * unref()ed. */ void add(SkTypeface*); /** * Iterate through the cache, calling proc(typeface, ctx) with each * typeface. If proc returns true, then we return that typeface (this * ref()s the typeface). If it never returns true, we return nullptr. */ SkTypeface* findByProcAndRef(FindProc proc, void* ctx) const; /** * This will unref all of the typefaces in the cache for which the cache * is the only owner. Normally this is handled automatically as needed. * This function is exposed for clients that explicitly want to purge the * cache (e.g. to look for leaks). */ void purgeAll(); /** * Helper: returns a unique fontID to pass to the constructor of * your subclass of SkTypeface */ static SkFontID NewFontID(); // These are static wrappers around a global instance of a cache. static void Add(SkTypeface*); static SkTypeface* FindByProcAndRef(FindProc proc, void* ctx); static void PurgeAll(); /** * Debugging only: dumps the status of the typefaces in the cache */ static void Dump(); private: static SkTypefaceCache& Get(); void purge(int count); SkTArray> fTypefaces; }; #endif