skia2/modules/skparagraph/include/FontCollection.h
Jason Simmons 6405340609 Find and cache font family lists and the typeface lists that they map to
If none of the families in the requested list are available, then use the
platform default font family.

Change-Id: If0c69febb112c660f96a768cea8d3ae6b35ea68a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/255311
Reviewed-by: Julia Lavrova <jlavrova@google.com>
Commit-Queue: Jason Simmons <jsimmons@google.com>
2019-11-20 20:23:51 +00:00

80 lines
2.4 KiB
C++

// Copyright 2019 Google LLC.
#ifndef FontCollection_DEFINED
#define FontCollection_DEFINED
#include <memory>
#include <set>
#include "include/core/SkFontMgr.h"
#include "include/core/SkRefCnt.h"
#include "include/private/SkTHash.h"
#include "modules/skparagraph/include/ParagraphCache.h"
#include "modules/skparagraph/include/TextStyle.h"
namespace skia {
namespace textlayout {
class TextStyle;
class Paragraph;
class FontCollection : public SkRefCnt {
public:
FontCollection();
~FontCollection() = default;
size_t getFontManagersCount() const;
void setAssetFontManager(sk_sp<SkFontMgr> fontManager);
void setDynamicFontManager(sk_sp<SkFontMgr> fontManager);
void setTestFontManager(sk_sp<SkFontMgr> fontManager);
void setDefaultFontManager(sk_sp<SkFontMgr> fontManager);
void setDefaultFontManager(sk_sp<SkFontMgr> fontManager, const char defaultFamilyName[]);
sk_sp<SkFontMgr> getFallbackManager() const { return fDefaultFontManager; }
std::vector<sk_sp<SkTypeface>> findTypefaces(const std::vector<SkString>& familyNames, SkFontStyle fontStyle);
sk_sp<SkTypeface> defaultFallback(SkUnichar unicode, SkFontStyle fontStyle, const SkString& locale);
sk_sp<SkTypeface> defaultFallback();
void disableFontFallback();
void enableFontFallback();
bool fontFallbackEnabled() { return fEnableFontFallback; }
ParagraphCache* getParagraphCache() { return &fParagraphCache; }
private:
std::vector<sk_sp<SkFontMgr>> getFontManagerOrder() const;
sk_sp<SkTypeface> matchTypeface(const SkString& familyName, SkFontStyle fontStyle);
struct FamilyKey {
FamilyKey(const std::vector<SkString>& familyNames, SkFontStyle style)
: fFamilyNames(familyNames), fFontStyle(style) {}
FamilyKey() {}
std::vector<SkString> fFamilyNames;
SkFontStyle fFontStyle;
bool operator==(const FamilyKey& other) const;
struct Hasher {
size_t operator()(const FamilyKey& key) const;
};
};
bool fEnableFontFallback;
SkTHashMap<FamilyKey, std::vector<sk_sp<SkTypeface>>, FamilyKey::Hasher> fTypefaces;
sk_sp<SkFontMgr> fDefaultFontManager;
sk_sp<SkFontMgr> fAssetFontManager;
sk_sp<SkFontMgr> fDynamicFontManager;
sk_sp<SkFontMgr> fTestFontManager;
SkString fDefaultFamilyName;
ParagraphCache fParagraphCache;
};
} // namespace textlayout
} // namespace skia
#endif // FontCollection_DEFINED