| Index: src/core/SkGlyphCache.h
|
| diff --git a/src/core/SkGlyphCache.h b/src/core/SkGlyphCache.h
|
| index f3a946c7d3e0470811074557a572cab18ebba62e..1c985bf6715070bd1ff520535919aec3786429d2 100644
|
| --- a/src/core/SkGlyphCache.h
|
| +++ b/src/core/SkGlyphCache.h
|
| @@ -8,10 +8,10 @@
|
| #define SkGlyphCache_DEFINED
|
|
|
| #include "SkBitmap.h"
|
| -#include "SkChecksum.h"
|
| #include "SkChunkAlloc.h"
|
| #include "SkDescriptor.h"
|
| #include "SkGlyph.h"
|
| +#include "SkTHash.h"
|
| #include "SkScalerContext.h"
|
| #include "SkTemplates.h"
|
| #include "SkTDArray.h"
|
| @@ -20,10 +20,6 @@ class SkPaint;
|
|
|
| class SkGlyphCache_Globals;
|
|
|
| -// Enable this locally to add stats for hash-table hit rates. It also extends the dump() output
|
| -// to show those stats.
|
| -//#define SK_GLYPHCACHE_TRACK_HASH_STATS
|
| -
|
| /** \class SkGlyphCache
|
|
|
| This class represents a strike: a specific combination of typeface, size, matrix, etc., and
|
| @@ -181,9 +177,12 @@ private:
|
| kHashMask = kHashCount - 1
|
| };
|
|
|
| + typedef uint32_t PackedGlyphID; // glyph-index + subpixel-pos
|
| + typedef uint32_t PackedUnicharID; // unichar + subpixel-pos
|
| +
|
| struct CharGlyphRec {
|
| - uint32_t fID; // unichar + subpixel
|
| - uint16_t fGlyphIndex;
|
| + PackedUnicharID fPackedUnicharID;
|
| + PackedGlyphID fPackedGlyphID;
|
| };
|
|
|
| struct AuxProcRec {
|
| @@ -199,56 +198,42 @@ private:
|
| // Return the SkGlyph* associated with MakeID. The id parameter is the
|
| // combined glyph/x/y id generated by MakeID. If it is just a glyph id
|
| // then x and y are assumed to be zero.
|
| - SkGlyph* lookupByCombinedID(uint32_t id, MetricsType type);
|
| + SkGlyph* lookupByPackedGlyphID(PackedGlyphID packedGlyphID, MetricsType type);
|
|
|
| // Return a SkGlyph* associated with unicode id and position x and y.
|
| SkGlyph* lookupByChar(SkUnichar id, MetricsType type, SkFixed x = 0, SkFixed y = 0);
|
|
|
| - // Return the index of id in the fGlyphArray. If it does not exist,
|
| - // create a new one using MetricsType.
|
| - uint16_t lookupMetrics(uint32_t id, MetricsType type);
|
| + // Return a new SkGlyph for the glyph ID and subpixel position id. Limit the amount
|
| + // of work
|
| + // using type.
|
| + SkGlyph* allocateNewGlyph(PackedGlyphID packedGlyphID, MetricsType type);
|
| +
|
| static bool DetachProc(const SkGlyphCache*, void*) { return true; }
|
|
|
| // The id arg is a combined id generated by MakeID.
|
| - CharGlyphRec* getCharGlyphRec(uint32_t id);
|
| - void adjustCaches(int insertion_index);
|
| -
|
| - static inline unsigned ID2HashIndex(uint32_t h) {
|
| - return SkChecksum::CheapMix(h) & kHashMask;
|
| - }
|
| + CharGlyphRec* getCharGlyphRec(PackedUnicharID id);
|
|
|
| void invokeAndRemoveAuxProcs();
|
|
|
| inline static SkGlyphCache* FindTail(SkGlyphCache* head);
|
|
|
| - SkGlyphCache* fNext, *fPrev;
|
| - SkDescriptor* fDesc;
|
| - SkScalerContext* fScalerContext;
|
| - SkPaint::FontMetrics fFontMetrics;
|
| + SkGlyphCache* fNext;
|
| + SkGlyphCache* fPrev;
|
| + SkDescriptor* const fDesc;
|
| + SkScalerContext* const fScalerContext;
|
| + SkPaint::FontMetrics fFontMetrics;
|
|
|
| - // A quick lookup to avoid the binary search looking for glyphs in fGlyphArray.
|
| - uint16_t fGlyphHash[kHashCount];
|
| + // Map from a combined GlyphID and sub-pixel position to a SkGlyph.
|
| + SkTHashTable<SkGlyph, PackedGlyphID, SkGlyph::HashTraits> fGlyphMap;
|
|
|
| - // Contains the SkGlyphs that are used by fGlyphHash and fCharToGlyphHash. The ~0 element is
|
| - // reserved for a sentinel SkGlyph that reduces the logic to check for collisions in the hash
|
| - // arrays. The ~0 element has an fID of SkGlyph::kImpossibleID which never matches any
|
| - // combined id generated for a char or a glyph.
|
| - SkTDArray<SkGlyph> fGlyphArray;
|
| - SkChunkAlloc fGlyphAlloc;
|
| + SkChunkAlloc fGlyphAlloc;
|
|
|
| - // no reason to use the same kHashCount as fGlyphHash, but we do for now
|
| - // Dynamically allocated when chars are encountered.
|
| - SkAutoTArray<CharGlyphRec> fCharToGlyphHash;
|
| + SkAutoTArray<CharGlyphRec> fPackedUnicharIDToPackedGlyphID;
|
|
|
| // used to track (approx) how much ram is tied-up in this cache
|
| - size_t fMemoryUsed;
|
| -
|
| -#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| - int fHashHitCount;
|
| - int fHashMissCount;
|
| -#endif
|
| + size_t fMemoryUsed;
|
|
|
| - AuxProcRec* fAuxProcList;
|
| + AuxProcRec* fAuxProcList;
|
| };
|
|
|
| class SkAutoGlyphCacheBase {
|
|
|