1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2014 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkFontMgr_indirect_DEFINED 9cb93a386Sopenharmony_ci#define SkFontMgr_indirect_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkFontMgr.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 13cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 14cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 15cb93a386Sopenharmony_ci#include "include/ports/SkRemotableFontMgr.h" 16cb93a386Sopenharmony_ci#include "include/private/SkMutex.h" 17cb93a386Sopenharmony_ci#include "include/private/SkOnce.h" 18cb93a386Sopenharmony_ci#include "include/private/SkTArray.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass SkData; 21cb93a386Sopenharmony_ciclass SkFontStyle; 22cb93a386Sopenharmony_ciclass SkStreamAsset; 23cb93a386Sopenharmony_ciclass SkString; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciclass SK_API SkFontMgr_Indirect : public SkFontMgr { 26cb93a386Sopenharmony_cipublic: 27cb93a386Sopenharmony_ci // TODO: The SkFontMgr is only used for createFromStream/File/Data. 28cb93a386Sopenharmony_ci // In the future these calls should be broken out into their own interface 29cb93a386Sopenharmony_ci // with a name like SkFontRenderer. 30cb93a386Sopenharmony_ci SkFontMgr_Indirect(sk_sp<SkFontMgr> impl, sk_sp<SkRemotableFontMgr> proxy) 31cb93a386Sopenharmony_ci : fImpl(std::move(impl)), fProxy(std::move(proxy)) 32cb93a386Sopenharmony_ci { } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciprotected: 35cb93a386Sopenharmony_ci int onCountFamilies() const override; 36cb93a386Sopenharmony_ci void onGetFamilyName(int index, SkString* familyName) const override; 37cb93a386Sopenharmony_ci SkFontStyleSet* onCreateStyleSet(int index) const override; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci SkFontStyleSet* onMatchFamily(const char familyName[]) const override; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci SkTypeface* onMatchFamilyStyle(const char familyName[], 42cb93a386Sopenharmony_ci const SkFontStyle& fontStyle) const override; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], 45cb93a386Sopenharmony_ci const SkFontStyle&, 46cb93a386Sopenharmony_ci const char* bcp47[], 47cb93a386Sopenharmony_ci int bcp47Count, 48cb93a386Sopenharmony_ci SkUnichar character) const override; 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset>, int ttcIndex) const override; 51cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromStreamArgs(std::unique_ptr<SkStreamAsset> stream, 52cb93a386Sopenharmony_ci const SkFontArguments& args) const override; 53cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromFile(const char path[], int ttcIndex) const override; 54cb93a386Sopenharmony_ci sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData>, int ttcIndex) const override; 55cb93a386Sopenharmony_ci sk_sp<SkTypeface> onLegacyMakeTypeface(const char familyName[], SkFontStyle) const override; 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ciprivate: 58cb93a386Sopenharmony_ci SkTypeface* createTypefaceFromFontId(const SkFontIdentity& fontId) const; 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci sk_sp<SkFontMgr> fImpl; 61cb93a386Sopenharmony_ci sk_sp<SkRemotableFontMgr> fProxy; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci struct DataEntry { 64cb93a386Sopenharmony_ci uint32_t fDataId; // key1 65cb93a386Sopenharmony_ci uint32_t fTtcIndex; // key2 66cb93a386Sopenharmony_ci SkTypeface* fTypeface; // value: weak ref to typeface 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci DataEntry() = default; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci DataEntry(DataEntry&& that) { *this = std::move(that); } 71cb93a386Sopenharmony_ci DataEntry& operator=(DataEntry&& that) { 72cb93a386Sopenharmony_ci if (this != &that) { 73cb93a386Sopenharmony_ci fDataId = that.fDataId; 74cb93a386Sopenharmony_ci fTtcIndex = that.fTtcIndex; 75cb93a386Sopenharmony_ci fTypeface = that.fTypeface; 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci SkDEBUGCODE(that.fDataId = SkFontIdentity::kInvalidDataId;) 78cb93a386Sopenharmony_ci SkDEBUGCODE(that.fTtcIndex = 0xbbadbeef;) 79cb93a386Sopenharmony_ci that.fTypeface = nullptr; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci return *this; 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci ~DataEntry() { 85cb93a386Sopenharmony_ci if (fTypeface) { 86cb93a386Sopenharmony_ci fTypeface->weak_unref(); 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci }; 90cb93a386Sopenharmony_ci /** 91cb93a386Sopenharmony_ci * This cache is essentially { dataId: { ttcIndex: typeface } } 92cb93a386Sopenharmony_ci * For data caching we want a mapping from data id to weak references to 93cb93a386Sopenharmony_ci * typefaces with that data id. By storing the index next to the typeface, 94cb93a386Sopenharmony_ci * this data cache also acts as a typeface cache. 95cb93a386Sopenharmony_ci */ 96cb93a386Sopenharmony_ci mutable SkTArray<DataEntry> fDataCache; 97cb93a386Sopenharmony_ci mutable SkMutex fDataCacheMutex; 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci friend class SkStyleSet_Indirect; 100cb93a386Sopenharmony_ci}; 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci#endif 103