1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkClusterator_DEFINED 8 #define SkClusterator_DEFINED 9 10 #include <cstdint> 11 12 namespace sktext { 13 class GlyphRun; 14 } 15 16 /** Given the m-to-n glyph-to-character mapping data (as returned by 17 harfbuzz), iterate over the clusters. */ 18 class SkClusterator { 19 public: 20 SkClusterator(const sktext::GlyphRun& run); glyphCount()21 uint32_t glyphCount() const { return fGlyphCount; } reversedChars()22 bool reversedChars() const { return fReversedChars; } 23 struct Cluster { 24 const char* fUtf8Text; 25 uint32_t fTextByteLength; 26 uint32_t fGlyphIndex; 27 uint32_t fGlyphCount; 28 explicit operator bool() const { return fGlyphCount != 0; } 29 bool operator==(const SkClusterator::Cluster& o) { 30 return fUtf8Text == o.fUtf8Text 31 && fTextByteLength == o.fTextByteLength 32 && fGlyphIndex == o.fGlyphIndex 33 && fGlyphCount == o.fGlyphCount; 34 } 35 }; 36 Cluster next(); 37 38 private: 39 uint32_t const * const fClusters; 40 char const * const fUtf8Text; 41 uint32_t const fGlyphCount; 42 uint32_t const fTextByteLength; 43 bool const fReversedChars; 44 uint32_t fCurrentGlyphIndex = 0; 45 }; 46 #endif // SkClusterator_DEFINED 47