1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "DMFontMgr.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFontDescriptor.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace { 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic constexpr const char* kFamilyNames[] = { 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "Toy Liberation Sans", 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "Toy Liberation Serif", 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "Toy Liberation Mono", 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass FontStyleSet final : public SkFontStyleSet { 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot explicit FontStyleSet(int familyIndex) { 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot using sk_tool_utils::create_portable_typeface; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* familyName = kFamilyNames[familyIndex]; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTypefaces[0] = create_portable_typeface(familyName, SkFontStyle::Normal()); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTypefaces[1] = create_portable_typeface(familyName, SkFontStyle::Bold()); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTypefaces[2] = create_portable_typeface(familyName, SkFontStyle::Italic()); 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTypefaces[3] = create_portable_typeface(familyName, SkFontStyle::BoldItalic()); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int count() override { return 4; } 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void getStyle(int index, SkFontStyle* style, SkString* name) override { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (index) { 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 0: if (style) { *style = SkFontStyle::Normal(); } 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (name) { *name = "Normal"; } 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 1: if (style) { *style = SkFontStyle::Bold(); } 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (name) { *name = "Bold"; } 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 2: if (style) { *style = SkFontStyle::Italic(); } 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (name) { *name = "Italic"; } 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 3: if (style) { *style = SkFontStyle::BoldItalic(); } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (name) { *name = "BoldItalic"; } 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTypeface* createTypeface(int index) override { 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkRef(fTypefaces[index].get()); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTypeface* matchStyle(const SkFontStyle& pattern) override { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->matchStyleCSS3(pattern); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> fTypefaces[4]; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass FontMgr final : public SkFontMgr { 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FontMgr() { 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFamilies[0] = sk_make_sp<FontStyleSet>(0); 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFamilies[1] = sk_make_sp<FontStyleSet>(1); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFamilies[2] = sk_make_sp<FontStyleSet>(2); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int onCountFamilies() const override { return SK_ARRAY_COUNT(fFamilies); } 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onGetFamilyName(int index, SkString* familyName) const override { 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *familyName = kFamilyNames[index]; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFontStyleSet* onCreateStyleSet(int index) const override { 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkRef(fFamilies[index].get()); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFontStyleSet* onMatchFamily(const char familyName[]) const override { 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (familyName) { 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (strstr(familyName, "ans")) { return this->createStyleSet(0); } 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (strstr(familyName, "erif")) { return this->createStyleSet(1); } 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (strstr(familyName, "ono")) { return this->createStyleSet(2); } 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->createStyleSet(0); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTypeface* onMatchFamilyStyle(const char familyName[], 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkFontStyle& style) const override { 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkFontStyleSet> styleSet(this->matchFamily(familyName)); 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return styleSet->matchStyle(style); 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkFontStyle& style, 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* bcp47[], int bcp47Count, 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkUnichar character) const override { 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (void)bcp47; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (void)bcp47Count; 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (void)character; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->matchFamilyStyle(familyName, style); 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTypeface* onMatchFaceStyle(const SkTypeface* tf, 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkFontStyle& style) const override { 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString familyName; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot tf->getFamilyName(&familyName); 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->matchFamilyStyle(familyName.c_str(), style); 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData>, int ttcIndex) const override { 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>, 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int ttcIndex) const override { 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset>, 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkFontArguments&) const override { 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> onMakeFromFontData(std::unique_ptr<SkFontData>) const override { 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override { 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return nullptr; 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFontStyle style) const override { 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return sk_sp<SkTypeface>(this->matchFamilyStyle(familyName, style)); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<FontStyleSet> fFamilies[3]; 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace DM { 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotsk_sp<SkFontMgr> MakeFontMgr() { return sk_make_sp<FontMgr>(); } 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // namespace DM 148