1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkFontConfigInterface_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkFontConfigInterface_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class SkFontMgr; 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker /** 19*c8dee2aaSAndroid Build Coastguard Worker * \class SkFontConfigInterface 20*c8dee2aaSAndroid Build Coastguard Worker * 21*c8dee2aaSAndroid Build Coastguard Worker * A simple interface for remotable font management. 22*c8dee2aaSAndroid Build Coastguard Worker * The global instance can be found with RefGlobal(). 23*c8dee2aaSAndroid Build Coastguard Worker */ 24*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkFontConfigInterface : public SkRefCnt { 25*c8dee2aaSAndroid Build Coastguard Worker public: 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** 28*c8dee2aaSAndroid Build Coastguard Worker * Returns the global SkFontConfigInterface instance. If it is not 29*c8dee2aaSAndroid Build Coastguard Worker * nullptr, calls ref() on it. The caller must balance this with a call to 30*c8dee2aaSAndroid Build Coastguard Worker * unref(). The default SkFontConfigInterface is the result of calling 31*c8dee2aaSAndroid Build Coastguard Worker * GetSingletonDirectInterface. 32*c8dee2aaSAndroid Build Coastguard Worker */ 33*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkFontConfigInterface> RefGlobal(); 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker /** 36*c8dee2aaSAndroid Build Coastguard Worker * Replace the current global instance with the specified one. 37*c8dee2aaSAndroid Build Coastguard Worker */ 38*c8dee2aaSAndroid Build Coastguard Worker static void SetGlobal(sk_sp<SkFontConfigInterface> fc); 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker /** 41*c8dee2aaSAndroid Build Coastguard Worker * This should be treated as private to the impl of SkFontConfigInterface. 42*c8dee2aaSAndroid Build Coastguard Worker * Callers should not change or expect any particular values. It is meant 43*c8dee2aaSAndroid Build Coastguard Worker * to be a union of possible storage types to aid the impl. 44*c8dee2aaSAndroid Build Coastguard Worker */ 45*c8dee2aaSAndroid Build Coastguard Worker struct FontIdentity { FontIdentityFontIdentity46*c8dee2aaSAndroid Build Coastguard Worker FontIdentity() : fID(0), fTTCIndex(0) {} 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const FontIdentity& other) const { 49*c8dee2aaSAndroid Build Coastguard Worker return fID == other.fID && 50*c8dee2aaSAndroid Build Coastguard Worker fTTCIndex == other.fTTCIndex && 51*c8dee2aaSAndroid Build Coastguard Worker fString == other.fString; 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const FontIdentity& other) const { 54*c8dee2aaSAndroid Build Coastguard Worker return !(*this == other); 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker uint32_t fID; 58*c8dee2aaSAndroid Build Coastguard Worker int32_t fTTCIndex; 59*c8dee2aaSAndroid Build Coastguard Worker SkString fString; 60*c8dee2aaSAndroid Build Coastguard Worker SkFontStyle fStyle; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker // If buffer is NULL, just return the number of bytes that would have 63*c8dee2aaSAndroid Build Coastguard Worker // been written. Will pad contents to a multiple of 4. 64*c8dee2aaSAndroid Build Coastguard Worker size_t writeToMemory(void* buffer = nullptr) const; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker // Recreate from a flattened buffer, returning the number of bytes read. 67*c8dee2aaSAndroid Build Coastguard Worker size_t readFromMemory(const void* buffer, size_t length); 68*c8dee2aaSAndroid Build Coastguard Worker }; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker /** 71*c8dee2aaSAndroid Build Coastguard Worker * Given a familyName and style, find the best match. 72*c8dee2aaSAndroid Build Coastguard Worker * 73*c8dee2aaSAndroid Build Coastguard Worker * If a match is found, return true and set its outFontIdentifier. 74*c8dee2aaSAndroid Build Coastguard Worker * If outFamilyName is not null, assign the found familyName to it 75*c8dee2aaSAndroid Build Coastguard Worker * (which may differ from the requested familyName). 76*c8dee2aaSAndroid Build Coastguard Worker * If outStyle is not null, assign the found style to it 77*c8dee2aaSAndroid Build Coastguard Worker * (which may differ from the requested style). 78*c8dee2aaSAndroid Build Coastguard Worker * 79*c8dee2aaSAndroid Build Coastguard Worker * If a match is not found, return false, and ignore all out parameters. 80*c8dee2aaSAndroid Build Coastguard Worker */ 81*c8dee2aaSAndroid Build Coastguard Worker virtual bool matchFamilyName(const char familyName[], 82*c8dee2aaSAndroid Build Coastguard Worker SkFontStyle requested, 83*c8dee2aaSAndroid Build Coastguard Worker FontIdentity* outFontIdentifier, 84*c8dee2aaSAndroid Build Coastguard Worker SkString* outFamilyName, 85*c8dee2aaSAndroid Build Coastguard Worker SkFontStyle* outStyle) = 0; 86*c8dee2aaSAndroid Build Coastguard Worker 87*c8dee2aaSAndroid Build Coastguard Worker /** 88*c8dee2aaSAndroid Build Coastguard Worker * Given a FontRef, open a stream to access its data, or return null 89*c8dee2aaSAndroid Build Coastguard Worker * if the FontRef's data is not available. The caller is responsible for 90*c8dee2aaSAndroid Build Coastguard Worker * deleting the stream when it is done accessing the data. 91*c8dee2aaSAndroid Build Coastguard Worker */ 92*c8dee2aaSAndroid Build Coastguard Worker virtual SkStreamAsset* openStream(const FontIdentity&) = 0; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker /** 95*c8dee2aaSAndroid Build Coastguard Worker * Return an SkTypeface for the given FontIdentity. 96*c8dee2aaSAndroid Build Coastguard Worker * 97*c8dee2aaSAndroid Build Coastguard Worker * The default implementation simply returns a new typeface built using data obtained from 98*c8dee2aaSAndroid Build Coastguard Worker * openStream() using the provided SkFontMgr, but derived classes may implement more 99*c8dee2aaSAndroid Build Coastguard Worker * complex caching schemes. 100*c8dee2aaSAndroid Build Coastguard Worker */ 101*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<SkTypeface> makeTypeface(const FontIdentity& identity, sk_sp<SkFontMgr> mgr); 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker /** 104*c8dee2aaSAndroid Build Coastguard Worker * Return a singleton instance of a direct subclass that calls into 105*c8dee2aaSAndroid Build Coastguard Worker * libfontconfig. This does not affect the refcnt of the returned instance. 106*c8dee2aaSAndroid Build Coastguard Worker */ 107*c8dee2aaSAndroid Build Coastguard Worker static SkFontConfigInterface* GetSingletonDirectInterface(); 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkRefCnt; 110*c8dee2aaSAndroid Build Coastguard Worker }; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker #endif 113