Chromium Code Reviews| Index: include/ports/SkFontMgr_indirect.h |
| =================================================================== |
| --- include/ports/SkFontMgr_indirect.h (revision 0) |
| +++ include/ports/SkFontMgr_indirect.h (working copy) |
| @@ -0,0 +1,104 @@ |
| +/* |
| + * Copyright 2014 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#ifndef SkFontMgr_indirect_DEFINED |
| +#define SkFontMgr_indirect_DEFINED |
| + |
| +#include "SkDataTable.h" |
| +#include "SkFontMgr.h" |
| +#include "SkFontStyle.h" |
| +#include "SkOnce.h" |
| +#include "SkRemotableFontMgr.h" |
| +#include "SkTArray.h" |
| +#include "SkTypeface.h" |
| + |
| +class SkData; |
| +class SkStream; |
| +class SkString; |
| +class SkTypeface; |
| + |
| +class SK_API SkFontMgr_Indirect : public SkFontMgr { |
| +public: |
| + SkFontMgr_Indirect(SkFontMgr* impl, SkRemotableFontMgr* proxy) |
|
reed1
2014/03/21 19:56:53
// Document that all we really want is createFromS
bungeman-skia
2014/03/21 22:36:12
Done.
|
| + : fImpl(SkRef(impl)), fProxy(SkRef(proxy)) |
| + { |
| + fOnce = SK_ONCE_INIT; |
| + } |
| + |
| +protected: |
| + virtual int onCountFamilies() const SK_OVERRIDE; |
| + virtual void onGetFamilyName(int index, SkString* familyName) const SK_OVERRIDE; |
| + virtual SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE; |
| + |
| + virtual SkFontStyleSet* onMatchFamily(const char familyName[]) const SK_OVERRIDE; |
| + |
| + virtual SkTypeface* onMatchFamilyStyle(const char familyName[], |
| + const SkFontStyle& fontStyle) const SK_OVERRIDE; |
| + |
| + virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], |
| + const SkFontStyle&, |
| + const char bpc47[], |
| + uint32_t character) const SK_OVERRIDE; |
| + |
| + virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
| + const SkFontStyle& fontStyle) const SK_OVERRIDE; |
| + |
| + virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const SK_OVERRIDE; |
| + virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const SK_OVERRIDE; |
| + virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OVERRIDE; |
| + |
| + virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| + unsigned styleBits) const SK_OVERRIDE; |
| + |
| +private: |
| + SkTypeface* createTypefaceFromFontId(const SkFontIdentity& fontId) const; |
| + |
| + SkAutoTUnref<SkFontMgr> fImpl; |
| + SkAutoTUnref<SkRemotableFontMgr> fProxy; |
| + |
| + struct DataEntry { |
| + int fDataId; // key1 |
| + int fTtcIndex; // key2 |
| + SkTypeface* fTypeface; // value: weak ref to typeface |
| + |
| + DataEntry() { } |
| + |
| + // This is a move!!! |
| + DataEntry(DataEntry& that) |
| + : fDataId(that.fDataId) |
| + , fTtcIndex(that.fTtcIndex) |
| + , fTypeface(that.fTypeface) |
| + { |
| + SkDEBUGCODE(that.fDataId = -1;) |
| + SkDEBUGCODE(that.fTtcIndex = -1;) |
| + that.fTypeface = NULL; |
| + } |
| + |
| + ~DataEntry() { |
| + if (fTypeface) { |
| + fTypeface->weak_unref(); |
| + } |
| + } |
| + }; |
| + /** |
| + * This cache is essentially { dataId: { ttcIndex: typeface } } |
| + * For data caching we want a mapping from data id to weak references to |
| + * typefaces with that data id. By storing the index next to the typeface, |
| + * this data cache also acts as a typeface cache. |
| + */ |
| + mutable SkTArray<DataEntry> fDataCache; |
| + mutable SkMutex fDataCacheMutex; |
| + |
| + mutable SkAutoTUnref<SkDataTable> fFamilyNames; |
| + mutable SkOnceFlag fOnce; |
| + static void set_up_family_names(const SkFontMgr_Indirect* self); |
| + |
| + friend class SkStyleSet_Indirect; |
| +}; |
| + |
| +#endif |
| + |