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