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