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 <vector> 11 #include <cstdint> 12 13 class SkGlyphRun; 14 15 /** Given the m-to-n glyph-to-character mapping data (as returned by 16 harfbuzz), iterate over the clusters. */ 17 class SkClusterator { 18 public: 19 SkClusterator(const SkGlyphRun& run); glyphCount()20 uint32_t glyphCount() const { return fGlyphCount; } reversedChars()21 bool reversedChars() const { return fReversedChars; } 22 struct Cluster { 23 const char* fUtf8Text; 24 uint32_t fTextByteLength; 25 uint32_t fGlyphIndex; 26 uint32_t fGlyphCount; 27 explicit operator bool() const { return fGlyphCount != 0; } 28 bool operator==(const SkClusterator::Cluster& o) { 29 return fUtf8Text == o.fUtf8Text 30 && fTextByteLength == o.fTextByteLength 31 && fGlyphIndex == o.fGlyphIndex 32 && fGlyphCount == o.fGlyphCount; 33 } 34 }; 35 Cluster next(); 36 37 private: 38 uint32_t const * const fClusters; 39 char const * const fUtf8Text; 40 uint32_t const fGlyphCount; 41 uint32_t const fTextByteLength; 42 bool const fReversedChars; 43 uint32_t fCurrentGlyphIndex = 0; 44 }; 45 46 47 #endif // SkClusterator_DEFINED 48