xref: /aosp_15_r20/external/skia/modules/skparagraph/src/Iterators.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker #ifndef FontIterator_DEFINED
3*c8dee2aaSAndroid Build Coastguard Worker #define FontIterator_DEFINED
4*c8dee2aaSAndroid Build Coastguard Worker 
5*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
6*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/TextStyle.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper.h"
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker namespace skia {
12*c8dee2aaSAndroid Build Coastguard Worker namespace textlayout {
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker class LangIterator final : public SkShaper::LanguageRunIterator {
15*c8dee2aaSAndroid Build Coastguard Worker public:
LangIterator(SkSpan<const char> utf8,SkSpan<Block> styles,const TextStyle & defaultStyle)16*c8dee2aaSAndroid Build Coastguard Worker     LangIterator(SkSpan<const char> utf8, SkSpan<Block> styles, const TextStyle& defaultStyle)
17*c8dee2aaSAndroid Build Coastguard Worker             : fText(utf8)
18*c8dee2aaSAndroid Build Coastguard Worker             , fTextStyles(styles)
19*c8dee2aaSAndroid Build Coastguard Worker             , fCurrentChar(utf8.begin())
20*c8dee2aaSAndroid Build Coastguard Worker             , fCurrentStyle(fTextStyles.begin())
21*c8dee2aaSAndroid Build Coastguard Worker             , fCurrentLocale(defaultStyle.getLocale()) {}
22*c8dee2aaSAndroid Build Coastguard Worker 
consume()23*c8dee2aaSAndroid Build Coastguard Worker     void consume() override {
24*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fCurrentChar < fText.end());
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker         if (fCurrentStyle == fTextStyles.end()) {
27*c8dee2aaSAndroid Build Coastguard Worker             fCurrentChar = fText.end();
28*c8dee2aaSAndroid Build Coastguard Worker             return;
29*c8dee2aaSAndroid Build Coastguard Worker         }
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker         fCurrentChar = fText.begin() + fCurrentStyle->fRange.end;
32*c8dee2aaSAndroid Build Coastguard Worker         fCurrentLocale = fCurrentStyle->fStyle.getLocale();
33*c8dee2aaSAndroid Build Coastguard Worker         while (++fCurrentStyle != fTextStyles.end() && !fCurrentStyle->fStyle.isPlaceholder()) {
34*c8dee2aaSAndroid Build Coastguard Worker             if (fCurrentStyle->fStyle.getLocale() != fCurrentLocale) {
35*c8dee2aaSAndroid Build Coastguard Worker                 break;
36*c8dee2aaSAndroid Build Coastguard Worker             }
37*c8dee2aaSAndroid Build Coastguard Worker             fCurrentChar = fText.begin() + fCurrentStyle->fRange.end;
38*c8dee2aaSAndroid Build Coastguard Worker         }
39*c8dee2aaSAndroid Build Coastguard Worker     }
40*c8dee2aaSAndroid Build Coastguard Worker 
endOfCurrentRun()41*c8dee2aaSAndroid Build Coastguard Worker     size_t endOfCurrentRun() const override { return fCurrentChar - fText.begin(); }
atEnd()42*c8dee2aaSAndroid Build Coastguard Worker     bool atEnd() const override { return fCurrentChar >= fText.end(); }
currentLanguage()43*c8dee2aaSAndroid Build Coastguard Worker     const char* currentLanguage() const override { return fCurrentLocale.c_str(); }
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker private:
46*c8dee2aaSAndroid Build Coastguard Worker     SkSpan<const char> fText;
47*c8dee2aaSAndroid Build Coastguard Worker     SkSpan<Block> fTextStyles;
48*c8dee2aaSAndroid Build Coastguard Worker     const char* fCurrentChar;
49*c8dee2aaSAndroid Build Coastguard Worker     Block* fCurrentStyle;
50*c8dee2aaSAndroid Build Coastguard Worker     SkString fCurrentLocale;
51*c8dee2aaSAndroid Build Coastguard Worker };
52*c8dee2aaSAndroid Build Coastguard Worker }  // namespace textlayout
53*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skia
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker #endif  // FontIterator_DEFINED
56