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