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