| Index: include/ports/SkFontMgr_indirect.h
|
| ===================================================================
|
| --- include/ports/SkFontMgr_indirect.h (revision 0)
|
| +++ include/ports/SkFontMgr_indirect.h (working copy)
|
| @@ -0,0 +1,107 @@
|
| +/*
|
| + * 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:
|
| + // TODO: The SkFontMgr is only used for createFromStream/File/Data.
|
| + // In the future these calls should be broken out into their own interface
|
| + // with a name like SkFontRenderer.
|
| + SkFontMgr_Indirect(SkFontMgr* impl, SkRemotableFontMgr* proxy)
|
| + : 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
|
| +
|
|
|