1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2018 Google LLC. 2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPDFGlyphUse_DEFINED 4*c8dee2aaSAndroid Build Coastguard Worker #define SkPDFGlyphUse_DEFINED 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 7*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkBitSet.h" 8*c8dee2aaSAndroid Build Coastguard Worker 9*c8dee2aaSAndroid Build Coastguard Worker class SkPDFGlyphUse { 10*c8dee2aaSAndroid Build Coastguard Worker public: SkPDFGlyphUse()11*c8dee2aaSAndroid Build Coastguard Worker SkPDFGlyphUse() : fBitSet(0) {} SkPDFGlyphUse(SkGlyphID firstNonZero,SkGlyphID lastGlyph)12*c8dee2aaSAndroid Build Coastguard Worker SkPDFGlyphUse(SkGlyphID firstNonZero, SkGlyphID lastGlyph) 13*c8dee2aaSAndroid Build Coastguard Worker : fBitSet(lastGlyph - firstNonZero + 2) 14*c8dee2aaSAndroid Build Coastguard Worker , fFirstNonZero(firstNonZero) 15*c8dee2aaSAndroid Build Coastguard Worker , fLastGlyph(lastGlyph) { SkASSERT(firstNonZero >= 1); } 16*c8dee2aaSAndroid Build Coastguard Worker ~SkPDFGlyphUse() = default; 17*c8dee2aaSAndroid Build Coastguard Worker SkPDFGlyphUse(SkPDFGlyphUse&&) = default; 18*c8dee2aaSAndroid Build Coastguard Worker SkPDFGlyphUse& operator=(SkPDFGlyphUse&&) = default; 19*c8dee2aaSAndroid Build Coastguard Worker firstNonZero()20*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID firstNonZero() const { return fFirstNonZero; } lastGlyph()21*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID lastGlyph() const { return fLastGlyph; } set(SkGlyphID gid)22*c8dee2aaSAndroid Build Coastguard Worker void set(SkGlyphID gid) { fBitSet.set(this->toCode(gid)); } has(SkGlyphID gid)23*c8dee2aaSAndroid Build Coastguard Worker bool has(SkGlyphID gid) const { return fBitSet.test(this->toCode(gid)); } 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker template<typename FN> getSetValues(FN f)26*c8dee2aaSAndroid Build Coastguard Worker void getSetValues(FN f) const { 27*c8dee2aaSAndroid Build Coastguard Worker if (fFirstNonZero == 1) { 28*c8dee2aaSAndroid Build Coastguard Worker return fBitSet.forEachSetIndex(std::move(f)); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker uint16_t offset = fFirstNonZero - 1; 31*c8dee2aaSAndroid Build Coastguard Worker fBitSet.forEachSetIndex([&f, offset](unsigned v) { f(v == 0 ? v : v + offset); }); 32*c8dee2aaSAndroid Build Coastguard Worker } 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker private: 35*c8dee2aaSAndroid Build Coastguard Worker SkBitSet fBitSet; 36*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID fFirstNonZero = 0; 37*c8dee2aaSAndroid Build Coastguard Worker SkGlyphID fLastGlyph = 0; 38*c8dee2aaSAndroid Build Coastguard Worker toCode(SkGlyphID gid)39*c8dee2aaSAndroid Build Coastguard Worker uint16_t toCode(SkGlyphID gid) const { 40*c8dee2aaSAndroid Build Coastguard Worker if (gid == 0 || fFirstNonZero == 1) { 41*c8dee2aaSAndroid Build Coastguard Worker return gid; 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(gid >= fFirstNonZero && gid <= fLastGlyph); 44*c8dee2aaSAndroid Build Coastguard Worker return gid - fFirstNonZero + 1; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker SkPDFGlyphUse(const SkPDFGlyphUse&) = delete; 47*c8dee2aaSAndroid Build Coastguard Worker SkPDFGlyphUse& operator=(const SkPDFGlyphUse&) = delete; 48*c8dee2aaSAndroid Build Coastguard Worker }; 49*c8dee2aaSAndroid Build Coastguard Worker #endif // SkPDFGlyphUse_DEFINED 50