Home | History | Annotate | Download | only in gl
      1 #ifndef SkGLTextCache_DEFINED
      2 #define SkGLTextCache_DEFINED
      3 
      4 #include "SkGL.h"
      5 
      6 class SkGlyph;
      7 
      8 class SkGLTextCache {
      9 public:
     10     SkGLTextCache();
     11     ~SkGLTextCache();
     12 
     13     /** Delete all of the strikes in the cache. Pass true if the texture IDs are
     14         still valid, in which case glDeleteTextures will be called. Pass false
     15         if they are invalid (e.g. the gl-context has changed), in which case
     16         they will just be abandoned.
     17     */
     18     void deleteAllStrikes(bool texturesAreValid);
     19 
     20     class Strike {
     21     public:
     22         int width() const { return fStrikeWidth; }
     23         int height() const { return fStrikeHeight; }
     24         GLuint texture() const { return fTexName; }
     25         int widthShift() const { return fStrikeWidthShift; }
     26         int heightShift() const { return fStrikeHeightShift; }
     27 
     28         // call this to force us to ignore the texture name in our destructor
     29         // only call it right before our destructor
     30         void abandonTexture() { fTexName = 0; }
     31 
     32     private:
     33         // if next is non-null, its height must match our height
     34         Strike(Strike* next, int width, int height);
     35         ~Strike();
     36 
     37         Strike* findGlyph(const SkGlyph&, int* offset);
     38         Strike* addGlyphAndBind(const SkGlyph&, const uint8_t*, int* offset);
     39 
     40         enum {
     41             kMinStrikeWidth = 1024,
     42             kMaxGlyphCount = 256
     43         };
     44 
     45         Strike*     fNext;
     46         GLuint      fTexName;
     47         uint32_t    fGlyphIDArray[kMaxGlyphCount];  // stores glyphIDs
     48         uint16_t    fGlyphOffsetX[kMaxGlyphCount];  // stores x-offsets
     49         uint16_t    fGlyphCount;
     50         uint16_t    fNextFreeOffsetX;
     51         uint16_t    fStrikeWidth;
     52         uint16_t    fStrikeHeight;
     53         uint8_t     fStrikeWidthShift;      // pow2(fStrikeWidth)
     54         uint8_t     fStrikeHeightShift;     // pow2(fStrikeHeight)
     55 
     56         friend class SkGLTextCache;
     57     };
     58 
     59     /** If found, returns the exact strike containing it (there may be more than
     60         one with a given height), and sets offset to the offset for that glyph
     61         (if not null). Does NOT bind the texture.
     62         If not found, returns null and ignores offset param.
     63     */
     64     Strike* findGlyph(const SkGlyph&, int* offset);
     65 
     66     /** Adds the specified glyph to this list of strikes, returning the new
     67         head of the list. If offset is not null, it is set to the offset
     68         for this glyph within the strike. The associated texture is bound
     69         to the gl context.
     70      */
     71     Strike* addGlyphAndBind(const SkGlyph&, const uint8_t image[], int* offset);
     72 
     73 private:
     74     enum {
     75         // greater than this we won't cache
     76         kMaxGlyphHeightShift = 9,
     77 
     78         kMaxGlyphHeight = 1 << kMaxGlyphHeightShift,
     79         kMaxStrikeListCount = kMaxGlyphHeightShift + 1
     80     };
     81 
     82     // heads of the N families, one for each pow2 height
     83     Strike* fStrikeList[kMaxStrikeListCount];
     84 };
     85 
     86 #endif
     87