text: 
  /*
   * 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 "SkTypeface.h"
  #include "SkTDArray.h"
  
  /*  TODO
   *  Provide std way to cache name+requestedStyle aliases to the same typeface.
   *
   *  The current mechanism ends up create a diff typeface for each one, even if
   *  they map to the same internal obj (e.g. CTFontRef on the mac)
   */
  
  class SkTypefaceCache {
  public:
      typedef bool (*FindProc)(SkTypeface*, SkTypeface::Style, void* context);
  
      /**
       *  Helper: returns a unique fontID to pass to the constructor of
       *  your subclass of SkTypeface
       */
      static SkFontID NewFontID();
  
      /**
       *  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, it will
       *  unref() typefaces whose refcnt is 1 (meaning only the cache is an owner).
       */
      static void Add(SkTypeface*, SkTypeface::Style requested);
  
      /**
       *  Search the cache for a typeface with the specified fontID (uniqueID).
       *  If one is found, return it (its reference count is unmodified). If none
       *  is found, return NULL.
       */
      static SkTypeface* FindByID(SkFontID fontID);
  
      /**
       *  Iterate through the cache, calling proc(typeface, ctx) with each
       *  typeface. If proc returns true, then we return that typeface (its
       *  reference count is unmodified). If it never returns true, we return NULL.
       */
      static SkTypeface* FindByProc(FindProc proc, void* ctx);
  
      /**
       *  This will unref all of the typefaces in the cache. Normally this is
       *  handled automatically as needed. This function is exposed for clients
       *  that explicitly want to purge the entire cache (e.g. to look for leaks).
       */
      static void PurgeAll();
  
      /**
       *  Debugging only: dumps the status of the typefaces in the cache
       */
      static void Dump();
  
  private:
      static SkTypefaceCache& Get();
  
      void add(SkTypeface*, SkTypeface::Style requested);
      SkTypeface* findByID(SkFontID findID) const;
      SkTypeface* findByProc(FindProc proc, void* ctx) const;
      void purge(int count);
      void purgeAll();
  
      struct Rec {
          SkTypeface*         fFace;
          SkTypeface::Style   fRequestedStyle;
      };
      SkTDArray<Rec> fArray;
  };
  
  #endif
  