Home | History | Annotate | Download | only in gpu
      1 
      2 /*
      3  * Copyright 2010 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.
      7  */
      8 
      9 
     10 
     11 #ifndef GrTextStrike_DEFINED
     12 #define GrTextStrike_DEFINED
     13 
     14 #include "GrAllocPool.h"
     15 #include "GrFontScaler.h"
     16 #include "GrTHashTable.h"
     17 #include "GrPoint.h"
     18 #include "GrGlyph.h"
     19 #include "GrDrawTarget.h"
     20 #include "GrAtlas.h"
     21 
     22 class GrFontCache;
     23 class GrGpu;
     24 class GrFontPurgeListener;
     25 
     26 /**
     27  *  The textcache maps a hostfontscaler instance to a dictionary of
     28  *  glyphid->strike
     29  */
     30 class GrTextStrike {
     31 public:
     32     GrTextStrike(GrFontCache*, const GrKey* fontScalerKey, GrMaskFormat, GrAtlasMgr*);
     33     ~GrTextStrike();
     34 
     35     const GrKey* getFontScalerKey() const { return fFontScalerKey; }
     36     GrFontCache* getFontCache() const { return fFontCache; }
     37     GrMaskFormat getMaskFormat() const { return fMaskFormat; }
     38 
     39     inline GrGlyph* getGlyph(GrGlyph::PackedID, GrFontScaler*);
     40     bool getGlyphAtlas(GrGlyph*, GrFontScaler*);
     41 
     42     // testing
     43     int countGlyphs() const { return fCache.getArray().count(); }
     44     const GrGlyph* glyphAt(int index) const {
     45         return fCache.getArray()[index];
     46     }
     47 
     48     // returns true if a plot was removed
     49     bool removeUnusedPlots();
     50 
     51 public:
     52     // for LRU
     53     GrTextStrike*   fPrev;
     54     GrTextStrike*   fNext;
     55 
     56 private:
     57     class Key;
     58     GrTHashTable<GrGlyph, Key, 7> fCache;
     59     const GrKey* fFontScalerKey;
     60     GrTAllocPool<GrGlyph> fPool;
     61 
     62     GrFontCache*    fFontCache;
     63     GrAtlasMgr*     fAtlasMgr;
     64     GrMaskFormat    fMaskFormat;
     65 #if SK_DISTANCEFIELD_FONTS
     66     bool            fUseDistanceField;
     67 #endif
     68 
     69     GrAtlas         fAtlas;
     70 
     71     GrGlyph* generateGlyph(GrGlyph::PackedID packed, GrFontScaler* scaler);
     72 
     73     friend class GrFontCache;
     74 };
     75 
     76 class GrFontCache {
     77 public:
     78     GrFontCache(GrGpu*);
     79     ~GrFontCache();
     80 
     81 #if SK_DISTANCEFIELD_FONTS
     82     inline GrTextStrike* getStrike(GrFontScaler*, bool useDistanceField);
     83 #else
     84     inline GrTextStrike* getStrike(GrFontScaler*);
     85 #endif
     86 
     87     void freeAll();
     88 
     89     void purgeExceptFor(GrTextStrike*);
     90 
     91     // remove an unused plot and its strike (if necessary)
     92     void freePlotExceptFor(GrTextStrike*);
     93 
     94     // testing
     95     int countStrikes() const { return fCache.getArray().count(); }
     96     const GrTextStrike* strikeAt(int index) const {
     97         return fCache.getArray()[index];
     98     }
     99     GrTextStrike* getHeadStrike() const { return fHead; }
    100 
    101 #ifdef SK_DEBUG
    102     void validate() const;
    103 #else
    104     void validate() const {}
    105 #endif
    106 
    107 #ifdef SK_DEVELOPER
    108     void dump() const;
    109 #endif
    110 
    111     enum AtlasType {
    112         kA8_AtlasType,   //!< 1-byte per pixel
    113         k565_AtlasType,  //!< 2-bytes per pixel
    114         k8888_AtlasType, //!< 4-bytes per pixel
    115 
    116         kLast_AtlasType = k8888_AtlasType
    117     };
    118     static const int kAtlasCount = kLast_AtlasType + 1;
    119 
    120 private:
    121     friend class GrFontPurgeListener;
    122 
    123     class Key;
    124     GrTHashTable<GrTextStrike, Key, 8> fCache;
    125     // for LRU
    126     GrTextStrike* fHead;
    127     GrTextStrike* fTail;
    128 
    129     GrGpu*      fGpu;
    130     GrAtlasMgr* fAtlasMgr[kAtlasCount];
    131 
    132     GrTextStrike* generateStrike(GrFontScaler*, const Key&);
    133     inline void detachStrikeFromList(GrTextStrike*);
    134     void purgeStrike(GrTextStrike* strike);
    135 };
    136 
    137 #endif
    138