1d71fe99fe4d54230572223915166bea8efd67d85reed@google.com/* 2d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * Copyright 2013 Google Inc. 3d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * 4d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * Use of this source code is governed by a BSD-style license that can be 5d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * found in the LICENSE file. 6d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 7d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 8d71fe99fe4d54230572223915166bea8efd67d85reed@google.com#ifndef SkFontConfigInterface_DEFINED 9d71fe99fe4d54230572223915166bea8efd67d85reed@google.com#define SkFontConfigInterface_DEFINED 10d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 11027fd204ad09fe3160c7319b1e55c4ae44747947reed@google.com#include "SkDataTable.h" 1254c69147f96eedb10e430df72d71419795e81d3areed@google.com#include "SkFontStyle.h" 13d71fe99fe4d54230572223915166bea8efd67d85reed@google.com#include "SkRefCnt.h" 1480f5465083bdc5449223f5875b401648616e8e09reed@google.com#include "SkTypeface.h" 15d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 160265707c191a31dfde08dd1cd7011c1fe5b8e643bungemanclass SkFontMgr; 17e438ddbc7451ec80f953266409fea4695e78c8c2tomhudson 18d71fe99fe4d54230572223915166bea8efd67d85reed@google.com/** 19d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * \class SkFontConfigInterface 20d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * 217be2eb89cc85fc9fc05814957d152f3d20613657bungeman * A simple interface for remotable font management. 227be2eb89cc85fc9fc05814957d152f3d20613657bungeman * The global instance can be found with RefGlobal(). 23d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 2486a44b89c5bd6345790c03fba63969cd1c19e66breed@google.comclass SK_API SkFontConfigInterface : public SkRefCnt { 25d71fe99fe4d54230572223915166bea8efd67d85reed@google.compublic: 26ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org 27d71fe99fe4d54230572223915166bea8efd67d85reed@google.com /** 281ae0e01accbca4b96a10b8a8c21917dd7bf27dc3bungeman * Returns the global SkFontConfigInterface instance. If it is not 291ae0e01accbca4b96a10b8a8c21917dd7bf27dc3bungeman * nullptr, calls ref() on it. The caller must balance this with a call to 301ae0e01accbca4b96a10b8a8c21917dd7bf27dc3bungeman * unref(). The default SkFontConfigInterface is the result of calling 311ae0e01accbca4b96a10b8a8c21917dd7bf27dc3bungeman * GetSingletonDirectInterface. 32d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 33d71fe99fe4d54230572223915166bea8efd67d85reed@google.com static SkFontConfigInterface* RefGlobal(); 34d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 35d71fe99fe4d54230572223915166bea8efd67d85reed@google.com /** 36d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * Replace the current global instance with the specified one, safely 37d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * ref'ing the new instance, and unref'ing the previous. Returns its 38d71fe99fe4d54230572223915166bea8efd67d85reed@google.com * parameter (the new global instance). 39d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 40d71fe99fe4d54230572223915166bea8efd67d85reed@google.com static SkFontConfigInterface* SetGlobal(SkFontConfigInterface*); 41d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 42d71fe99fe4d54230572223915166bea8efd67d85reed@google.com /** 43f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * This should be treated as private to the impl of SkFontConfigInterface. 44f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * Callers should not change or expect any particular values. It is meant 45f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * to be a union of possible storage types to aid the impl. 46d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 47f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com struct FontIdentity { 488c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com FontIdentity() : fID(0), fTTCIndex(0) {} 498c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com 508c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com bool operator==(const FontIdentity& other) const { 518c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com return fID == other.fID && 528c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com fTTCIndex == other.fTTCIndex && 538c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com fString == other.fString; 548c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com } 55f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com bool operator!=(const FontIdentity& other) const { 56f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com return !(*this == other); 57f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com } 588c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com 598c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com uint32_t fID; 608c9737e114f13ce393f2c582b2567ac4b3e530e7reed@google.com int32_t fTTCIndex; 61f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com SkString fString; 6254c69147f96eedb10e430df72d71419795e81d3areed@google.com SkFontStyle fStyle; 63e36a168d132a70d04eb696d8b50e2aea5c725bffskia.committer@gmail.com 64f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com // If buffer is NULL, just return the number of bytes that would have 65f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com // been written. Will pad contents to a multiple of 4. 66f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com size_t writeToMemory(void* buffer = NULL) const; 67e36a168d132a70d04eb696d8b50e2aea5c725bffskia.committer@gmail.com 68f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com // Recreate from a flattened buffer, returning the number of bytes read. 69f55061fd8453e8d2b33f1f05060fc443deee3222reed@google.com size_t readFromMemory(const void* buffer, size_t length); 70f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com }; 71d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 72d71fe99fe4d54230572223915166bea8efd67d85reed@google.com /** 73f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * Given a familyName and style, find the best match. 74f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * 75f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * If a match is found, return true and set its outFontIdentifier. 76f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * If outFamilyName is not null, assign the found familyName to it 77f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * (which may differ from the requested familyName). 78f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * If outStyle is not null, assign the found style to it 79f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * (which may differ from the requested style). 80f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * 81f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * If a match is not found, return false, and ignore all out parameters. 82d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 8311a77c6e0634e2feb6fe4e74806db2fdd2a799ecbungeman virtual bool matchFamilyName(const char familyName[], 8411a77c6e0634e2feb6fe4e74806db2fdd2a799ecbungeman SkFontStyle requested, 8511a77c6e0634e2feb6fe4e74806db2fdd2a799ecbungeman FontIdentity* outFontIdentifier, 8611a77c6e0634e2feb6fe4e74806db2fdd2a799ecbungeman SkString* outFamilyName, 8711a77c6e0634e2feb6fe4e74806db2fdd2a799ecbungeman SkFontStyle* outStyle) = 0; 88d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 89d71fe99fe4d54230572223915166bea8efd67d85reed@google.com /** 90f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * Given a FontRef, open a stream to access its data, or return null 91f71a2335f9b64442c65b45d1f703cd4ffb84129dreed@google.com * if the FontRef's data is not available. The caller is responsible for 925f213d9627d2eefa7da81cd97f36754f75eb4ae9bungeman * deleting the stream when it is done accessing the data. 93d71fe99fe4d54230572223915166bea8efd67d85reed@google.com */ 945f213d9627d2eefa7da81cd97f36754f75eb4ae9bungeman virtual SkStreamAsset* openStream(const FontIdentity&) = 0; 95d66045ec7d37720309dae4879efc01793c3e746areed@google.com 96d66045ec7d37720309dae4879efc01793c3e746areed@google.com /** 979b137dc54e668ca5552bab8a1c550edc02214db4fmalita * Return an SkTypeface for the given FontIdentity. 989b137dc54e668ca5552bab8a1c550edc02214db4fmalita * 999b137dc54e668ca5552bab8a1c550edc02214db4fmalita * The default implementation simply returns a new typeface built using data obtained from 1009b137dc54e668ca5552bab8a1c550edc02214db4fmalita * openStream(), but derived classes may implement more complex caching schemes. 1019b137dc54e668ca5552bab8a1c550edc02214db4fmalita */ 10213b9c95295f4c5732e34574789e721a6bc08f7b4bungeman virtual sk_sp<SkTypeface> makeTypeface(const FontIdentity& identity) { 10313b9c95295f4c5732e34574789e721a6bc08f7b4bungeman return SkTypeface::MakeFromStream(this->openStream(identity), identity.fTTCIndex); 10413b9c95295f4c5732e34574789e721a6bc08f7b4bungeman } 1059b137dc54e668ca5552bab8a1c550edc02214db4fmalita 1069b137dc54e668ca5552bab8a1c550edc02214db4fmalita /** 107d66045ec7d37720309dae4879efc01793c3e746areed@google.com * Return a singleton instance of a direct subclass that calls into 108d66045ec7d37720309dae4879efc01793c3e746areed@google.com * libfontconfig. This does not affect the refcnt of the returned instance. 109d66045ec7d37720309dae4879efc01793c3e746areed@google.com */ 1100265707c191a31dfde08dd1cd7011c1fe5b8e643bungeman static SkFontConfigInterface* GetSingletonDirectInterface(); 11154c69147f96eedb10e430df72d71419795e81d3areed@google.com 112ab1c13864df34aecfd4840ea7d1e4f8730b44f4ecommit-bot@chromium.org typedef SkRefCnt INHERITED; 113d71fe99fe4d54230572223915166bea8efd67d85reed@google.com}; 114d71fe99fe4d54230572223915166bea8efd67d85reed@google.com 115d71fe99fe4d54230572223915166bea8efd67d85reed@google.com#endif 116