1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkCharToGlyphCache_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkCharToGlyphCache_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class SkCharToGlyphCache { 18*c8dee2aaSAndroid Build Coastguard Worker public: 19*c8dee2aaSAndroid Build Coastguard Worker SkCharToGlyphCache(); 20*c8dee2aaSAndroid Build Coastguard Worker ~SkCharToGlyphCache(); 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker // return number of unichars cached count()23*c8dee2aaSAndroid Build Coastguard Worker int count() const { 24*c8dee2aaSAndroid Build Coastguard Worker return fK32.size(); 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker void reset(); // forget all cache entries (to save memory) 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker /** 30*c8dee2aaSAndroid Build Coastguard Worker * Given a unichar, return its glyphID (if the return value is positive), else return 31*c8dee2aaSAndroid Build Coastguard Worker * ~index of where to insert the computed glyphID. 32*c8dee2aaSAndroid Build Coastguard Worker * 33*c8dee2aaSAndroid Build Coastguard Worker * int result = cache.charToGlyph(unichar); 34*c8dee2aaSAndroid Build Coastguard Worker * if (result >= 0) { 35*c8dee2aaSAndroid Build Coastguard Worker * glyphID = result; 36*c8dee2aaSAndroid Build Coastguard Worker * } else { 37*c8dee2aaSAndroid Build Coastguard Worker * glyphID = compute_glyph_using_typeface(unichar); 38*c8dee2aaSAndroid Build Coastguard Worker * cache.insertCharAndGlyph(~result, unichar, glyphID); 39*c8dee2aaSAndroid Build Coastguard Worker * } 40*c8dee2aaSAndroid Build Coastguard Worker */ 41*c8dee2aaSAndroid Build Coastguard Worker int findGlyphIndex(SkUnichar c) const; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker /** 44*c8dee2aaSAndroid Build Coastguard Worker * Insert a new char/glyph pair into the cache at the specified index. 45*c8dee2aaSAndroid Build Coastguard Worker * See charToGlyph() for how to compute the bit-not of the index. 46*c8dee2aaSAndroid Build Coastguard Worker */ 47*c8dee2aaSAndroid Build Coastguard Worker void insertCharAndGlyph(int index, SkUnichar, SkGlyphID); 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker // helper to pre-seed an entry in the cache addCharAndGlyph(SkUnichar unichar,SkGlyphID glyph)50*c8dee2aaSAndroid Build Coastguard Worker void addCharAndGlyph(SkUnichar unichar, SkGlyphID glyph) { 51*c8dee2aaSAndroid Build Coastguard Worker int index = this->findGlyphIndex(unichar); 52*c8dee2aaSAndroid Build Coastguard Worker if (index >= 0) { 53*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(SkToU16(index) == glyph); 54*c8dee2aaSAndroid Build Coastguard Worker } else { 55*c8dee2aaSAndroid Build Coastguard Worker this->insertCharAndGlyph(~index, unichar, glyph); 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker private: 60*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<int32_t> fK32; 61*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<uint16_t> fV16; 62*c8dee2aaSAndroid Build Coastguard Worker double fDenom; 63*c8dee2aaSAndroid Build Coastguard Worker }; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker #endif 66