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