SkFontMgr.cpp revision a1193e4b0e34a7e4e1bd33e9708d7341679f8321
1e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman/*
2e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman * Copyright 2015 Google Inc.
3e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman *
4e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman * Use of this source code is governed by a BSD-style license that can be
5e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman * found in the LICENSE file.
6e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman */
7e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
8e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman#include "SkFontMgr.h"
9e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman#include "SkLazyPtr.h"
10a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo#include "SkStream.h"
11e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman#include "SkTypes.h"
12e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
13e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanclass SkFontStyle;
14e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanclass SkTypeface;
15e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
16e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanclass SkEmptyFontStyleSet : public SkFontStyleSet {
17e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanpublic:
18e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    int count() SK_OVERRIDE { return 0; }
19e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    void getStyle(int, SkFontStyle*, SkString*) SK_OVERRIDE {
20e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        SkDEBUGFAIL("SkFontStyleSet::getStyle called on empty set");
21e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
22e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkTypeface* createTypeface(int index) SK_OVERRIDE {
23e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        SkDEBUGFAIL("SkFontStyleSet::createTypeface called on empty set");
24e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
25e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
26e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkTypeface* matchStyle(const SkFontStyle&) SK_OVERRIDE {
27e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
28e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
29e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman};
30e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
31e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkFontStyleSet* SkFontStyleSet::CreateEmpty() {
32e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return SkNEW(SkEmptyFontStyleSet);
33e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
34e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
35e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman///////////////////////////////////////////////////////////////////////////////
36e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
37e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanclass SkEmptyFontMgr : public SkFontMgr {
38e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanprotected:
39e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    int onCountFamilies() const SK_OVERRIDE {
40e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return 0;
41e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
42e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    void onGetFamilyName(int index, SkString* familyName) const SK_OVERRIDE {
43e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        SkDEBUGFAIL("onGetFamilyName called with bad index");
44e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
45e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE {
46e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        SkDEBUGFAIL("onCreateStyleSet called with bad index");
47e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
48e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
49e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkFontStyleSet* onMatchFamily(const char[]) const SK_OVERRIDE {
50e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return SkFontStyleSet::CreateEmpty();
51e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
52e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
53e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    virtual SkTypeface* onMatchFamilyStyle(const char[],
54e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                           const SkFontStyle&) const SK_OVERRIDE {
55e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
56e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
57e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
58e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                                    const SkFontStyle& style,
59e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                                    const char* bcp47[],
60e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                                    int bcp47Count,
61e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                                    SkUnichar character) const SK_OVERRIDE {
62e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
63e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
64e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    virtual SkTypeface* onMatchFaceStyle(const SkTypeface*,
65e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                         const SkFontStyle&) const SK_OVERRIDE {
66e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
67e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
68e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkTypeface* onCreateFromData(SkData*, int) const SK_OVERRIDE {
69e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
70e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
71a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo    SkTypeface* onCreateFromStream(SkStream* stream, int) const SK_OVERRIDE {
72a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo        SkDELETE(stream);
73e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
74e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
75e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkTypeface* onCreateFromFile(const char[], int) const SK_OVERRIDE {
76e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
77e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
78e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkTypeface* onLegacyCreateTypeface(const char [], unsigned) const SK_OVERRIDE {
79e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
80e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
81e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman};
82e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
83e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanstatic SkFontStyleSet* emptyOnNull(SkFontStyleSet* fsset) {
84e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    if (NULL == fsset) {
85e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        fsset = SkFontStyleSet::CreateEmpty();
86e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
87e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return fsset;
88e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
89e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
90e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanint SkFontMgr::countFamilies() const {
91e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onCountFamilies();
92e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
93e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
94e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanvoid SkFontMgr::getFamilyName(int index, SkString* familyName) const {
95e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    this->onGetFamilyName(index, familyName);
96e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
97e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
98e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkFontStyleSet* SkFontMgr::createStyleSet(int index) const {
99e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return emptyOnNull(this->onCreateStyleSet(index));
100e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
101e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
102e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkFontStyleSet* SkFontMgr::matchFamily(const char familyName[]) const {
103e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return emptyOnNull(this->onMatchFamily(familyName));
104e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
105e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
106e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::matchFamilyStyle(const char familyName[],
107e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                        const SkFontStyle& fs) const {
108e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onMatchFamilyStyle(familyName, fs);
109e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
110e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
111e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::matchFamilyStyleCharacter(const char familyName[], const SkFontStyle& style,
112e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                                 const char* bcp47[], int bcp47Count,
113e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                                 SkUnichar character) const {
114e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onMatchFamilyStyleCharacter(familyName, style, bcp47, bcp47Count, character);
115e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
116e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
117e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::matchFaceStyle(const SkTypeface* face,
118e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                      const SkFontStyle& fs) const {
119e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onMatchFaceStyle(face, fs);
120e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
121e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
122e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::createFromData(SkData* data, int ttcIndex) const {
123e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    if (NULL == data) {
124e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
125e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
126e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onCreateFromData(data, ttcIndex);
127e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
128e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
129e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::createFromStream(SkStream* stream, int ttcIndex) const {
130e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    if (NULL == stream) {
131e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
132e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
133e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onCreateFromStream(stream, ttcIndex);
134e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
135e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
136e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::createFromFile(const char path[], int ttcIndex) const {
137e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    if (NULL == path) {
138e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman        return NULL;
139e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    }
140e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onCreateFromFile(path, ttcIndex);
141e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
142e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
143e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkTypeface* SkFontMgr::legacyCreateTypeface(const char familyName[],
144e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman                                            unsigned styleBits) const {
145e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return this->onLegacyCreateTypeface(familyName, styleBits);
146e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
147e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
148e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman// As a template argument this must have external linkage.
149e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkFontMgr* sk_fontmgr_create_default() {
150e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    SkFontMgr* fm = SkFontMgr::Factory();
151e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return fm ? fm : SkNEW(SkEmptyFontMgr);
152e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
153e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
154e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSK_DECLARE_STATIC_LAZY_PTR(SkFontMgr, singleton, sk_fontmgr_create_default);
155e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman
156e1a828c555223e75ebf83d0674daa2e6fd5889a3bungemanSkFontMgr* SkFontMgr::RefDefault() {
157e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman    return SkRef(singleton.get());
158e1a828c555223e75ebf83d0674daa2e6fd5889a3bungeman}
159