xref: /aosp_15_r20/frameworks/native/include/android/font_matcher.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker /**
18*38e8c45fSAndroid Build Coastguard Worker  * @addtogroup Font
19*38e8c45fSAndroid Build Coastguard Worker  * @{
20*38e8c45fSAndroid Build Coastguard Worker  */
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker /**
23*38e8c45fSAndroid Build Coastguard Worker  * @file font_matcher.h
24*38e8c45fSAndroid Build Coastguard Worker  * @brief Provides the font matching logic with various inputs.
25*38e8c45fSAndroid Build Coastguard Worker  *
26*38e8c45fSAndroid Build Coastguard Worker  * You can use this class for deciding what font is to be used for drawing text.
27*38e8c45fSAndroid Build Coastguard Worker  *
28*38e8c45fSAndroid Build Coastguard Worker  * A matcher is created from text style, locales and UI compatibility. The match function for
29*38e8c45fSAndroid Build Coastguard Worker  * matcher object can be called multiple times until close function is called.
30*38e8c45fSAndroid Build Coastguard Worker  *
31*38e8c45fSAndroid Build Coastguard Worker  * Even if no font can render the given text, the match function will return a non-null result for
32*38e8c45fSAndroid Build Coastguard Worker  * drawing Tofu character.
33*38e8c45fSAndroid Build Coastguard Worker  *
34*38e8c45fSAndroid Build Coastguard Worker  * Examples:
35*38e8c45fSAndroid Build Coastguard Worker  * \code{.cpp}
36*38e8c45fSAndroid Build Coastguard Worker  *  // Simple font query for the ASCII character.
37*38e8c45fSAndroid Build Coastguard Worker  *  std::vector<uint16_t> text = { 'A' };
38*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher* matcher = AFontMatcher_create("sans-serif");
39*38e8c45fSAndroid Build Coastguard Worker  *  AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
40*38e8c45fSAndroid Build Coastguard Worker  *  // runLength will be 1 and the font will points a valid font file.
41*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher_destroy(matcher);
42*38e8c45fSAndroid Build Coastguard Worker  *
43*38e8c45fSAndroid Build Coastguard Worker  *  // Querying font for CJK characters
44*38e8c45fSAndroid Build Coastguard Worker  *  std::vector<uint16_t> text = { 0x9AA8 };
45*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher* matcher = AFontMatcher_create("sans-serif");
46*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher_setLocales(matcher, "zh-CN,ja-JP");
47*38e8c45fSAndroid Build Coastguard Worker  *  AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
48*38e8c45fSAndroid Build Coastguard Worker  *  // runLength will be 1 and the font will points a Simplified Chinese font.
49*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher_setLocales(matcher, "ja-JP,zh-CN");
50*38e8c45fSAndroid Build Coastguard Worker  *  AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
51*38e8c45fSAndroid Build Coastguard Worker  *  // runLength will be 1 and the font will points a Japanese font.
52*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher_destroy(matcher);
53*38e8c45fSAndroid Build Coastguard Worker  *
54*38e8c45fSAndroid Build Coastguard Worker  *  // Querying font for text/color emoji
55*38e8c45fSAndroid Build Coastguard Worker  *  std::vector<uint16_t> text = { 0xD83D, 0xDC68, 0x200D, 0x2764, 0xFE0F, 0x200D, 0xD83D, 0xDC68 };
56*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher* matcher = AFontMatcher_create("sans-serif");
57*38e8c45fSAndroid Build Coastguard Worker  *  AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
58*38e8c45fSAndroid Build Coastguard Worker  *  // runLength will be 8 and the font will points a color emoji font.
59*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher_destroy(matcher);
60*38e8c45fSAndroid Build Coastguard Worker  *
61*38e8c45fSAndroid Build Coastguard Worker  *  // Mixture of multiple script of characters.
62*38e8c45fSAndroid Build Coastguard Worker  *  // 0x05D0 is a Hebrew character and 0x0E01 is a Thai character.
63*38e8c45fSAndroid Build Coastguard Worker  *  std::vector<uint16_t> text = { 0x05D0, 0x0E01 };
64*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher* matcher = AFontMatcher_create("sans-serif");
65*38e8c45fSAndroid Build Coastguard Worker  *  AFont* font = AFontMatcher_match(text.data(), text.length(), &runLength);
66*38e8c45fSAndroid Build Coastguard Worker  *  // runLength will be 1 and the font will points a Hebrew font.
67*38e8c45fSAndroid Build Coastguard Worker  *  AFontMatcher_destroy(matcher);
68*38e8c45fSAndroid Build Coastguard Worker  * \endcode
69*38e8c45fSAndroid Build Coastguard Worker  *
70*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
71*38e8c45fSAndroid Build Coastguard Worker  */
72*38e8c45fSAndroid Build Coastguard Worker 
73*38e8c45fSAndroid Build Coastguard Worker #ifndef ANDROID_FONT_MATCHER_H
74*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_FONT_MATCHER_H
75*38e8c45fSAndroid Build Coastguard Worker 
76*38e8c45fSAndroid Build Coastguard Worker #include <stdbool.h>
77*38e8c45fSAndroid Build Coastguard Worker #include <stddef.h>
78*38e8c45fSAndroid Build Coastguard Worker #include <stdint.h>
79*38e8c45fSAndroid Build Coastguard Worker #include <sys/cdefs.h>
80*38e8c45fSAndroid Build Coastguard Worker 
81*38e8c45fSAndroid Build Coastguard Worker #include <android/font.h>
82*38e8c45fSAndroid Build Coastguard Worker 
83*38e8c45fSAndroid Build Coastguard Worker /******************************************************************
84*38e8c45fSAndroid Build Coastguard Worker  *
85*38e8c45fSAndroid Build Coastguard Worker  * IMPORTANT NOTICE:
86*38e8c45fSAndroid Build Coastguard Worker  *
87*38e8c45fSAndroid Build Coastguard Worker  *   This file is part of Android's set of stable system headers
88*38e8c45fSAndroid Build Coastguard Worker  *   exposed by the Android NDK (Native Development Kit).
89*38e8c45fSAndroid Build Coastguard Worker  *
90*38e8c45fSAndroid Build Coastguard Worker  *   Third-party source AND binary code relies on the definitions
91*38e8c45fSAndroid Build Coastguard Worker  *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
92*38e8c45fSAndroid Build Coastguard Worker  *
93*38e8c45fSAndroid Build Coastguard Worker  *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
94*38e8c45fSAndroid Build Coastguard Worker  *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
95*38e8c45fSAndroid Build Coastguard Worker  *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
96*38e8c45fSAndroid Build Coastguard Worker  *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
97*38e8c45fSAndroid Build Coastguard Worker  */
98*38e8c45fSAndroid Build Coastguard Worker 
99*38e8c45fSAndroid Build Coastguard Worker __BEGIN_DECLS
100*38e8c45fSAndroid Build Coastguard Worker 
101*38e8c45fSAndroid Build Coastguard Worker enum {
102*38e8c45fSAndroid Build Coastguard Worker     /** A family variant value for the system default variant. */
103*38e8c45fSAndroid Build Coastguard Worker     AFAMILY_VARIANT_DEFAULT = 0,
104*38e8c45fSAndroid Build Coastguard Worker 
105*38e8c45fSAndroid Build Coastguard Worker     /**
106*38e8c45fSAndroid Build Coastguard Worker      * A family variant value for the compact font family variant.
107*38e8c45fSAndroid Build Coastguard Worker      *
108*38e8c45fSAndroid Build Coastguard Worker      * The compact font family has Latin-based vertical metrics.
109*38e8c45fSAndroid Build Coastguard Worker      */
110*38e8c45fSAndroid Build Coastguard Worker     AFAMILY_VARIANT_COMPACT = 1,
111*38e8c45fSAndroid Build Coastguard Worker 
112*38e8c45fSAndroid Build Coastguard Worker     /**
113*38e8c45fSAndroid Build Coastguard Worker      * A family variant value for the elegant font family variant.
114*38e8c45fSAndroid Build Coastguard Worker      *
115*38e8c45fSAndroid Build Coastguard Worker      * The elegant font family may have larger vertical metrics than Latin font.
116*38e8c45fSAndroid Build Coastguard Worker      */
117*38e8c45fSAndroid Build Coastguard Worker     AFAMILY_VARIANT_ELEGANT = 2,
118*38e8c45fSAndroid Build Coastguard Worker };
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker struct AFontMatcher;
121*38e8c45fSAndroid Build Coastguard Worker /**
122*38e8c45fSAndroid Build Coastguard Worker  * AFontMatcher performs match operation on given parameters and available font files.
123*38e8c45fSAndroid Build Coastguard Worker  * This matcher is not a thread-safe object. Do not pass this matcher to other threads.
124*38e8c45fSAndroid Build Coastguard Worker  */
125*38e8c45fSAndroid Build Coastguard Worker typedef struct AFontMatcher AFontMatcher;
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker /**
128*38e8c45fSAndroid Build Coastguard Worker  * Select the best font from given parameters.
129*38e8c45fSAndroid Build Coastguard Worker  *
130*38e8c45fSAndroid Build Coastguard Worker  */
131*38e8c45fSAndroid Build Coastguard Worker 
132*38e8c45fSAndroid Build Coastguard Worker /**
133*38e8c45fSAndroid Build Coastguard Worker  * Creates a new AFontMatcher object.
134*38e8c45fSAndroid Build Coastguard Worker  *
135*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
136*38e8c45fSAndroid Build Coastguard Worker  */
137*38e8c45fSAndroid Build Coastguard Worker AFontMatcher* _Nonnull AFontMatcher_create() __INTRODUCED_IN(29);
138*38e8c45fSAndroid Build Coastguard Worker 
139*38e8c45fSAndroid Build Coastguard Worker /**
140*38e8c45fSAndroid Build Coastguard Worker  * Destroy the matcher object.
141*38e8c45fSAndroid Build Coastguard Worker  *
142*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
143*38e8c45fSAndroid Build Coastguard Worker  *
144*38e8c45fSAndroid Build Coastguard Worker  * \param matcher a matcher object. Passing NULL is not allowed.
145*38e8c45fSAndroid Build Coastguard Worker  */
146*38e8c45fSAndroid Build Coastguard Worker void AFontMatcher_destroy(AFontMatcher* _Nonnull matcher) __INTRODUCED_IN(29);
147*38e8c45fSAndroid Build Coastguard Worker 
148*38e8c45fSAndroid Build Coastguard Worker /**
149*38e8c45fSAndroid Build Coastguard Worker  * Set font style to matcher.
150*38e8c45fSAndroid Build Coastguard Worker  *
151*38e8c45fSAndroid Build Coastguard Worker  * If this function is not called, the matcher performs with {@link AFONT_WEIGHT_NORMAL}
152*38e8c45fSAndroid Build Coastguard Worker  * with non-italic style.
153*38e8c45fSAndroid Build Coastguard Worker  *
154*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
155*38e8c45fSAndroid Build Coastguard Worker  *
156*38e8c45fSAndroid Build Coastguard Worker  * \param matcher a matcher object. Passing NULL is not allowed.
157*38e8c45fSAndroid Build Coastguard Worker  * \param weight a font weight value. Only from 0 to 1000 value is valid
158*38e8c45fSAndroid Build Coastguard Worker  * \param italic true if italic, otherwise false.
159*38e8c45fSAndroid Build Coastguard Worker  */
160*38e8c45fSAndroid Build Coastguard Worker void AFontMatcher_setStyle(
161*38e8c45fSAndroid Build Coastguard Worker         AFontMatcher* _Nonnull matcher,
162*38e8c45fSAndroid Build Coastguard Worker         uint16_t weight,
163*38e8c45fSAndroid Build Coastguard Worker         bool italic) __INTRODUCED_IN(29);
164*38e8c45fSAndroid Build Coastguard Worker 
165*38e8c45fSAndroid Build Coastguard Worker /**
166*38e8c45fSAndroid Build Coastguard Worker  * Set font locales to matcher.
167*38e8c45fSAndroid Build Coastguard Worker  *
168*38e8c45fSAndroid Build Coastguard Worker  * If this function is not called, the matcher performs with empty locale list.
169*38e8c45fSAndroid Build Coastguard Worker  *
170*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
171*38e8c45fSAndroid Build Coastguard Worker  *
172*38e8c45fSAndroid Build Coastguard Worker  * \param matcher a matcher object. Passing NULL is not allowed.
173*38e8c45fSAndroid Build Coastguard Worker  * \param languageTags a null character terminated comma separated IETF BCP47 compliant language
174*38e8c45fSAndroid Build Coastguard Worker  *                     tags.
175*38e8c45fSAndroid Build Coastguard Worker  */
176*38e8c45fSAndroid Build Coastguard Worker void AFontMatcher_setLocales(
177*38e8c45fSAndroid Build Coastguard Worker         AFontMatcher* _Nonnull matcher,
178*38e8c45fSAndroid Build Coastguard Worker         const char* _Nonnull languageTags) __INTRODUCED_IN(29);
179*38e8c45fSAndroid Build Coastguard Worker 
180*38e8c45fSAndroid Build Coastguard Worker /**
181*38e8c45fSAndroid Build Coastguard Worker  * Set family variant to matcher.
182*38e8c45fSAndroid Build Coastguard Worker  *
183*38e8c45fSAndroid Build Coastguard Worker  * If this function is not called, the matcher performs with {@link AFAMILY_VARIANT_DEFAULT}.
184*38e8c45fSAndroid Build Coastguard Worker  *
185*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
186*38e8c45fSAndroid Build Coastguard Worker  *
187*38e8c45fSAndroid Build Coastguard Worker  * \param matcher a matcher object. Passing NULL is not allowed.
188*38e8c45fSAndroid Build Coastguard Worker  * \param familyVariant Must be one of {@link AFAMILY_VARIANT_DEFAULT},
189*38e8c45fSAndroid Build Coastguard Worker  *                      {@link AFAMILY_VARIANT_COMPACT} or {@link AFAMILY_VARIANT_ELEGANT} is valid.
190*38e8c45fSAndroid Build Coastguard Worker  */
191*38e8c45fSAndroid Build Coastguard Worker void AFontMatcher_setFamilyVariant(
192*38e8c45fSAndroid Build Coastguard Worker         AFontMatcher* _Nonnull matcher,
193*38e8c45fSAndroid Build Coastguard Worker         uint32_t familyVariant) __INTRODUCED_IN(29);
194*38e8c45fSAndroid Build Coastguard Worker 
195*38e8c45fSAndroid Build Coastguard Worker /**
196*38e8c45fSAndroid Build Coastguard Worker  * Performs the matching from the generic font family for the text and select one font.
197*38e8c45fSAndroid Build Coastguard Worker  *
198*38e8c45fSAndroid Build Coastguard Worker  * For more information about generic font families, read [W3C spec](https://www.w3.org/TR/css-fonts-4/#generic-font-families)
199*38e8c45fSAndroid Build Coastguard Worker  *
200*38e8c45fSAndroid Build Coastguard Worker  * Even if no font can render the given text, this function will return a non-null result for
201*38e8c45fSAndroid Build Coastguard Worker  * drawing Tofu character.
202*38e8c45fSAndroid Build Coastguard Worker  *
203*38e8c45fSAndroid Build Coastguard Worker  * Available since API level 29.
204*38e8c45fSAndroid Build Coastguard Worker  *
205*38e8c45fSAndroid Build Coastguard Worker  * \param matcher a matcher object. Passing NULL is not allowed.
206*38e8c45fSAndroid Build Coastguard Worker  * \param familyName a null character terminated font family name
207*38e8c45fSAndroid Build Coastguard Worker  * \param text a UTF-16 encoded text buffer to be rendered. Do not pass empty string.
208*38e8c45fSAndroid Build Coastguard Worker  * \param textLength a length of the given text buffer. This must not be zero.
209*38e8c45fSAndroid Build Coastguard Worker  * \param runLengthOut if not null, the font run length will be filled.
210*38e8c45fSAndroid Build Coastguard Worker  * \return a font to be used for given text and params. You need to release the returned font by
211*38e8c45fSAndroid Build Coastguard Worker  *         AFont_close when it is no longer needed.
212*38e8c45fSAndroid Build Coastguard Worker  */
213*38e8c45fSAndroid Build Coastguard Worker AFont* _Nonnull AFontMatcher_match(
214*38e8c45fSAndroid Build Coastguard Worker         const AFontMatcher* _Nonnull matcher,
215*38e8c45fSAndroid Build Coastguard Worker         const char* _Nonnull familyName,
216*38e8c45fSAndroid Build Coastguard Worker         const uint16_t* _Nonnull text,
217*38e8c45fSAndroid Build Coastguard Worker         const uint32_t textLength,
218*38e8c45fSAndroid Build Coastguard Worker         uint32_t* _Nullable runLengthOut) __INTRODUCED_IN(29);
219*38e8c45fSAndroid Build Coastguard Worker 
220*38e8c45fSAndroid Build Coastguard Worker __END_DECLS
221*38e8c45fSAndroid Build Coastguard Worker 
222*38e8c45fSAndroid Build Coastguard Worker #endif // ANDROID_FONT_MATCHER_H
223*38e8c45fSAndroid Build Coastguard Worker 
224*38e8c45fSAndroid Build Coastguard Worker /** @} */
225