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