blob: 8e4bc2f29868a16e35a722354405e0bd5d70a00c [file] [log] [blame]
Julia Lavrova35f88222019-06-21 12:22:32 -04001// Copyright 2019 Google LLC.
2#ifndef FontIterator_DEFINED
3#define FontIterator_DEFINED
4
5#include <unicode/brkiter.h>
6#include <unicode/ubidi.h>
7#include "include/core/SkBlurTypes.h"
8#include "include/core/SkCanvas.h"
9#include "include/core/SkFontMgr.h"
10#include "include/core/SkPictureRecorder.h"
Julia Lavrova35f88222019-06-21 12:22:32 -040011#include "modules/skparagraph/src/ParagraphImpl.h"
12#include "src/core/SkSpan.h"
13#include "src/utils/SkUTF.h"
14
15namespace skia {
16namespace textlayout {
17
Julia Lavrova35f88222019-06-21 12:22:32 -040018class LangIterator final : public SkShaper::LanguageRunIterator {
19public:
Julia Lavrova5207f352019-06-21 12:22:32 -040020 LangIterator(SkSpan<const char> utf8, SkSpan<Block> styles, const TextStyle& defaultStyle)
Julia Lavrova35f88222019-06-21 12:22:32 -040021 : fText(utf8)
22 , fTextStyles(styles)
23 , fCurrentChar(utf8.begin())
24 , fCurrentStyle(fTextStyles.begin())
25 , fCurrentLocale(defaultStyle.getLocale()) {}
26
27 void consume() override {
28 SkASSERT(fCurrentChar < fText.end());
29
30 if (fCurrentStyle == fTextStyles.end()) {
31 fCurrentChar = fText.end();
32 return;
33 }
34
Julia Lavrova5207f352019-06-21 12:22:32 -040035 fCurrentChar = fText.begin() + fCurrentStyle->fRange.end;
36 fCurrentLocale = fCurrentStyle->fStyle.getLocale();
Julia Lavrova916a9042019-08-08 16:51:27 -040037 while (++fCurrentStyle != fTextStyles.end() && !fCurrentStyle->fStyle.isPlaceholder()) {
Julia Lavrova5207f352019-06-21 12:22:32 -040038 if (fCurrentStyle->fStyle.getLocale() != fCurrentLocale) {
Julia Lavrova35f88222019-06-21 12:22:32 -040039 break;
40 }
Julia Lavrova5207f352019-06-21 12:22:32 -040041 fCurrentChar = fText.begin() + fCurrentStyle->fRange.end;
Julia Lavrova35f88222019-06-21 12:22:32 -040042 }
43 }
44
45 size_t endOfCurrentRun() const override { return fCurrentChar - fText.begin(); }
Julia Lavrova916a9042019-08-08 16:51:27 -040046 bool atEnd() const override { return fCurrentChar >= fText.end(); }
Julia Lavrova35f88222019-06-21 12:22:32 -040047 const char* currentLanguage() const override { return fCurrentLocale.c_str(); }
48
49private:
50 SkSpan<const char> fText;
Julia Lavrova5207f352019-06-21 12:22:32 -040051 SkSpan<Block> fTextStyles;
Julia Lavrova35f88222019-06-21 12:22:32 -040052 const char* fCurrentChar;
Julia Lavrova5207f352019-06-21 12:22:32 -040053 Block* fCurrentStyle;
Julia Lavrova35f88222019-06-21 12:22:32 -040054 SkString fCurrentLocale;
55};
56} // namespace textlayout
57} // namespace skia
58
59#endif // FontIterator_DEFINED