// Copyright 2019 Google LLC. #ifndef FontIterator_DEFINED #define FontIterator_DEFINED #include "include/core/SkSpan.h" #include "include/core/SkString.h" #include "include/core/SkTypes.h" #include "modules/skparagraph/include/TextStyle.h" #include "modules/skshaper/include/SkShaper.h" namespace skia { namespace textlayout { class LangIterator final : public SkShaper::LanguageRunIterator { public: LangIterator(SkSpan utf8, SkSpan styles, const TextStyle& defaultStyle) : fText(utf8) , fTextStyles(styles) , fCurrentChar(utf8.begin()) , fCurrentStyle(fTextStyles.begin()) , fCurrentLocale(defaultStyle.getLocale()) {} void consume() override { SkASSERT(fCurrentChar < fText.end()); if (fCurrentStyle == fTextStyles.end()) { fCurrentChar = fText.end(); return; } fCurrentChar = fText.begin() + fCurrentStyle->fRange.end; fCurrentLocale = fCurrentStyle->fStyle.getLocale(); while (++fCurrentStyle != fTextStyles.end() && !fCurrentStyle->fStyle.isPlaceholder()) { if (fCurrentStyle->fStyle.getLocale() != fCurrentLocale) { break; } fCurrentChar = fText.begin() + fCurrentStyle->fRange.end; } } size_t endOfCurrentRun() const override { return fCurrentChar - fText.begin(); } bool atEnd() const override { return fCurrentChar >= fText.end(); } const char* currentLanguage() const override { return fCurrentLocale.c_str(); } private: SkSpan fText; SkSpan fTextStyles; const char* fCurrentChar; Block* fCurrentStyle; SkString fCurrentLocale; }; } // namespace textlayout } // namespace skia #endif // FontIterator_DEFINED