xref: /aosp_15_r20/external/skia/src/pdf/SkClusterator.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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