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