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