172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com/* 272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * Copyright 2014 Google Inc. 372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * 472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * Use of this source code is governed by a BSD-style license that can be 572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * found in the LICENSE file. 672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com */ 772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#ifndef SkFontMgr_indirect_DEFINED 972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#define SkFontMgr_indirect_DEFINED 1072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 1172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkDataTable.h" 1272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkFontMgr.h" 1372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkFontStyle.h" 1472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkRemotableFontMgr.h" 1572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkTArray.h" 1672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkTypeface.h" 1772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 1872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comclass SkData; 1972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comclass SkStream; 2072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comclass SkString; 2172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comclass SkTypeface; 2272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 2372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comclass SK_API SkFontMgr_Indirect : public SkFontMgr { 2472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.compublic: 2572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com // TODO: The SkFontMgr is only used for createFromStream/File/Data. 2672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com // In the future these calls should be broken out into their own interface 2772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com // with a name like SkFontRenderer. 2872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com SkFontMgr_Indirect(SkFontMgr* impl, SkRemotableFontMgr* proxy) 291ba62629f4d8300eb5ff82a83807119032eb0c02bungeman@google.com : fImpl(SkRef(impl)), fProxy(SkRef(proxy)), fFamilyNamesInited(false) 301ba62629f4d8300eb5ff82a83807119032eb0c02bungeman@google.com { } 3172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 3272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comprotected: 3372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual int onCountFamilies() const SK_OVERRIDE; 3472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual void onGetFamilyName(int index, SkString* familyName) const SK_OVERRIDE; 3572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE; 3672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 3772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkFontStyleSet* onMatchFamily(const char familyName[]) const SK_OVERRIDE; 3872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 3972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onMatchFamilyStyle(const char familyName[], 4072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com const SkFontStyle& fontStyle) const SK_OVERRIDE; 4172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 4272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], 4372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com const SkFontStyle&, 4472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com const char bpc47[], 4572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com uint32_t character) const SK_OVERRIDE; 4672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 4772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, 4872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com const SkFontStyle& fontStyle) const SK_OVERRIDE; 4972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 5072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const SK_OVERRIDE; 5172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const SK_OVERRIDE; 5272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OVERRIDE; 5372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 5472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], 5572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com unsigned styleBits) const SK_OVERRIDE; 5672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 5772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comprivate: 5872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com SkTypeface* createTypefaceFromFontId(const SkFontIdentity& fontId) const; 5972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 6072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com SkAutoTUnref<SkFontMgr> fImpl; 6172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com SkAutoTUnref<SkRemotableFontMgr> fProxy; 6272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 6372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com struct DataEntry { 643d21f21cac33743e7aedace9abf0473c5063199fbungeman@google.com uint32_t fDataId; // key1 65f76cbb884819830ea51ed090c7d7d4427bcbfdf5bungeman@google.com uint32_t fTtcIndex; // key2 6672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com SkTypeface* fTypeface; // value: weak ref to typeface 6772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 6872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com DataEntry() { } 6972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 7072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com // This is a move!!! 7172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com DataEntry(DataEntry& that) 7272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com : fDataId(that.fDataId) 7372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com , fTtcIndex(that.fTtcIndex) 7472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com , fTypeface(that.fTypeface) 7572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com { 76c8f0d606e53823ab8e35bebdf2bbb023eae2bbbdbungeman@google.com SkDEBUGCODE(that.fDataId = SkFontIdentity::kInvalidDataId;) 77c8f0d606e53823ab8e35bebdf2bbb023eae2bbbdbungeman@google.com SkDEBUGCODE(that.fTtcIndex = 0xbbadbeef;) 7872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com that.fTypeface = NULL; 7972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com } 8072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 8172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com ~DataEntry() { 8272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com if (fTypeface) { 8372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com fTypeface->weak_unref(); 8472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com } 8572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com } 8672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com }; 8772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com /** 8872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * This cache is essentially { dataId: { ttcIndex: typeface } } 8972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * For data caching we want a mapping from data id to weak references to 9072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * typefaces with that data id. By storing the index next to the typeface, 9172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * this data cache also acts as a typeface cache. 9272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com */ 9372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com mutable SkTArray<DataEntry> fDataCache; 9472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com mutable SkMutex fDataCacheMutex; 9572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 9672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com mutable SkAutoTUnref<SkDataTable> fFamilyNames; 971ba62629f4d8300eb5ff82a83807119032eb0c02bungeman@google.com mutable bool fFamilyNamesInited; 981ba62629f4d8300eb5ff82a83807119032eb0c02bungeman@google.com mutable SkMutex fFamilyNamesMutex; 9972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com static void set_up_family_names(const SkFontMgr_Indirect* self); 10072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 10172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com friend class SkStyleSet_Indirect; 10272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com}; 10372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 10472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#endif 105