blob: f418b3ba784f881d9eb52930382603331e4c2bae [file] [log] [blame]
Julia Lavrova35f88222019-06-21 12:22:32 -04001// Copyright 2019 Google LLC.
2#ifndef FontIterator_DEFINED
3#define FontIterator_DEFINED
4
Ben Wagner4ca7a812020-05-28 13:48:18 -04005#include "include/core/SkString.h"
6#include "include/core/SkTypes.h"
7#include "modules/skparagraph/include/TextStyle.h"
8#include "modules/skshaper/include/SkShaper.h"
Julia Lavrova35f88222019-06-21 12:22:32 -04009#include "src/core/SkSpan.h"
Julia Lavrova35f88222019-06-21 12:22:32 -040010
11namespace skia {
12namespace textlayout {
13
Julia Lavrova35f88222019-06-21 12:22:32 -040014class LangIterator final : public SkShaper::LanguageRunIterator {
15public:
Julia Lavrova5207f352019-06-21 12:22:32 -040016 LangIterator(SkSpan<const char> utf8, SkSpan<Block> styles, const TextStyle& defaultStyle)
Julia Lavrova35f88222019-06-21 12:22:32 -040017 : fText(utf8)
18 , fTextStyles(styles)
19 , fCurrentChar(utf8.begin())
20 , fCurrentStyle(fTextStyles.begin())
21 , fCurrentLocale(defaultStyle.getLocale()) {}
22
23 void consume() override {
24 SkASSERT(fCurrentChar < fText.end());
25
26 if (fCurrentStyle == fTextStyles.end()) {
27 fCurrentChar = fText.end();
28 return;
29 }
30
Julia Lavrova5207f352019-06-21 12:22:32 -040031 fCurrentChar = fText.begin() + fCurrentStyle->fRange.end;
32 fCurrentLocale = fCurrentStyle->fStyle.getLocale();
Julia Lavrova916a9042019-08-08 16:51:27 -040033 while (++fCurrentStyle != fTextStyles.end() && !fCurrentStyle->fStyle.isPlaceholder()) {
Julia Lavrova5207f352019-06-21 12:22:32 -040034 if (fCurrentStyle->fStyle.getLocale() != fCurrentLocale) {
Julia Lavrova35f88222019-06-21 12:22:32 -040035 break;
36 }
Julia Lavrova5207f352019-06-21 12:22:32 -040037 fCurrentChar = fText.begin() + fCurrentStyle->fRange.end;
Julia Lavrova35f88222019-06-21 12:22:32 -040038 }
39 }
40
41 size_t endOfCurrentRun() const override { return fCurrentChar - fText.begin(); }
Julia Lavrova916a9042019-08-08 16:51:27 -040042 bool atEnd() const override { return fCurrentChar >= fText.end(); }
Julia Lavrova35f88222019-06-21 12:22:32 -040043 const char* currentLanguage() const override { return fCurrentLocale.c_str(); }
44
45private:
46 SkSpan<const char> fText;
Julia Lavrova5207f352019-06-21 12:22:32 -040047 SkSpan<Block> fTextStyles;
Julia Lavrova35f88222019-06-21 12:22:32 -040048 const char* fCurrentChar;
Julia Lavrova5207f352019-06-21 12:22:32 -040049 Block* fCurrentStyle;
Julia Lavrova35f88222019-06-21 12:22:32 -040050 SkString fCurrentLocale;
51};
52} // namespace textlayout
53} // namespace skia
54
55#endif // FontIterator_DEFINED