1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/* 2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc. 3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file. 6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 8096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifndef SkFontConfigInterface_DEFINED 9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define SkFontConfigInterface_DEFINED 10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkDataTable.h" 127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkFontStyle.h" 13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkRefCnt.h" 147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h" 15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkTypeface.h" 16096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/** 18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * \class SkFontConfigInterface 19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Provides SkFontHost clients with access to fontconfig services. They will 21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * access the global instance found in RefGlobal(). 22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SK_API SkFontConfigInterface : public SkRefCnt { 24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic: 2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SK_DECLARE_INST_COUNT(SkFontConfigInterface) 2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Returns the global SkFontConfigInterface instance, and if it is not 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * NULL, calls ref() on it. The caller must balance this with a call to 30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * unref(). 31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger static SkFontConfigInterface* RefGlobal(); 33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Replace the current global instance with the specified one, safely 36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * ref'ing the new instance, and unref'ing the previous. Returns its 37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * parameter (the new global instance). 38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger static SkFontConfigInterface* SetGlobal(SkFontConfigInterface*); 40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 41096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 42096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * This should be treated as private to the impl of SkFontConfigInterface. 43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Callers should not change or expect any particular values. It is meant 44096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * to be a union of possible storage types to aid the impl. 45096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger struct FontIdentity { 47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger FontIdentity() : fID(0), fTTCIndex(0) {} 48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger bool operator==(const FontIdentity& other) const { 50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return fID == other.fID && 51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fTTCIndex == other.fTTCIndex && 52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger fString == other.fString; 53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool operator!=(const FontIdentity& other) const { 557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return !(*this == other); 567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger uint32_t fID; 59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger int32_t fTTCIndex; 60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString fString; 617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkFontStyle fStyle; 627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // If buffer is NULL, just return the number of bytes that would have 647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // been written. Will pad contents to a multiple of 4. 657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger size_t writeToMemory(void* buffer = NULL) const; 667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Recreate from a flattened buffer, returning the number of bytes read. 687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger size_t readFromMemory(const void* buffer, size_t length); 69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger }; 70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 72096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Given a familyName and style, find the best match. 73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 74096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * If a match is found, return true and set its outFontIdentifier. 75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * If outFamilyName is not null, assign the found familyName to it 76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * (which may differ from the requested familyName). 77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * If outStyle is not null, assign the found style to it 78096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * (which may differ from the requested style). 79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * If a match is not found, return false, and ignore all out parameters. 81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual bool matchFamilyName(const char familyName[], 83096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTypeface::Style requested, 84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger FontIdentity* outFontIdentifier, 85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkString* outFamilyName, 86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkTypeface::Style* outStyle) = 0; 87096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 88096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Given a FontRef, open a stream to access its data, or return null 90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * if the FontRef's data is not available. The caller is responsible for 91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * calling stream->unref() when it is done accessing the data. 92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual SkStream* openStream(const FontIdentity&) = 0; 94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger /** 96096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Return a singleton instance of a direct subclass that calls into 97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * libfontconfig. This does not affect the refcnt of the returned instance. 98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger static SkFontConfigInterface* GetSingletonDirectInterface(); 1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // New APIS, which have default impls for now (which do nothing) 1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual SkDataTable* getFamilyNames() { return SkDataTable::NewEmpty(); } 1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual bool matchFamilySet(const char inFamilyName[], 1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkString* outFamilyName, 1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkTArray<FontIdentity>*) { 1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return false; 1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 109910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger typedef SkRefCnt INHERITED; 110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}; 111096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 112096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 113