| // Copyright 2019 Google LLC. |
| #ifndef FontResolver_DEFINED |
| #define FontResolver_DEFINED |
| |
| #include <memory> |
| #include <set> |
| #include "include/core/SkFontMgr.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/private/SkTHash.h" |
| #include "modules/skparagraph/include/FontCollection.h" |
| #include "modules/skparagraph/include/TextStyle.h" |
| #include "modules/skparagraph/src/TextLine.h" |
| #include "src/core/SkSpan.h" |
| |
| namespace skia { |
| namespace textlayout { |
| |
| struct FontDescr { |
| FontDescr() { } |
| FontDescr(SkFont font, SkScalar height) |
| : fFont(font), fHeight(height), fStart(EMPTY_INDEX) { } |
| bool operator==(const FontDescr& a) const { |
| return this->fFont == a.fFont && this->fHeight == a.fHeight; |
| } |
| SkFont fFont; |
| SkScalar fHeight; |
| TextIndex fStart; |
| }; |
| |
| class FontResolver { |
| public: |
| |
| FontResolver() = default; |
| ~FontResolver() = default; |
| |
| void findAllFontsForAllStyledBlocks(ParagraphImpl* master); |
| bool findNext(const char* codepoint, SkFont* font, SkScalar* height); |
| void getFirstFont(SkFont* font, SkScalar* height); |
| |
| const SkTArray<FontDescr>& switches() const { return fFontSwitches; } |
| |
| bool isEmpty(); |
| |
| bool allWhitespaces() const { return fUnresolved == SkToU32(fWhitespaces.count()); } |
| |
| private: |
| void findAllFontsForStyledBlock(const TextStyle& style, TextRange textRange); |
| FontDescr makeFont(sk_sp<SkTypeface> typeface, SkScalar size, SkScalar height); |
| size_t resolveAllCharactersByFont(const FontDescr& fontDescr); |
| void addResolvedWhitespacesToMapping(); |
| void setLastResortFont(); |
| |
| struct Hash { |
| uint32_t operator()(const FontDescr& key) const { |
| return SkTypeface::UniqueID(key.fFont.getTypeface()) + |
| SkScalarCeilToInt(key.fFont.getSize()) + |
| SkScalarCeilToInt(key.fHeight); |
| } |
| }; |
| |
| SkUnichar firstUnresolved(); |
| |
| sk_sp<FontCollection> fFontCollection; |
| SkSpan<const char> fText; |
| SkSpan<Block> fStyles; |
| TextStyle fDefaultStyle; |
| |
| SkTArray<FontDescr> fFontSwitches; |
| FontDescr* fFontIterator; |
| SkTHashSet<FontDescr, Hash> fResolvedFonts; |
| FontDescr fFirstResolvedFont; |
| |
| SkTHashMap<TextIndex, FontDescr> fFontMapping; |
| SkTArray<SkUnichar> fCodepoints; |
| SkTArray<const char*> fCharacters; |
| SkTArray<size_t> fUnresolvedIndexes; |
| SkTArray<SkUnichar> fUnresolvedCodepoints; |
| SkTHashMap<size_t, FontDescr> fWhitespaces; |
| size_t fUnresolved; |
| }; |
| } // namespace textlayout |
| } // namespace skia |
| |
| #endif // FontResolver_DEFINED |