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