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