1 /**************************************************************************** 2 * 3 * ftsnames.h 4 * 5 * Simple interface to access SFNT 'name' tables (which are used 6 * to hold font names, copyright info, notices, etc.) (specification). 7 * 8 * This is _not_ used to retrieve glyph names! 9 * 10 * Copyright (C) 1996-2023 by 11 * David Turner, Robert Wilhelm, and Werner Lemberg. 12 * 13 * This file is part of the FreeType project, and may only be used, 14 * modified, and distributed under the terms of the FreeType project 15 * license, LICENSE.TXT. By continuing to use, modify, or distribute 16 * this file you indicate that you have read the license and 17 * understand and accept it fully. 18 * 19 */ 20 21 22 #ifndef FTSNAMES_H_ 23 #define FTSNAMES_H_ 24 25 26 #include <freetype/freetype.h> 27 #include <freetype/ftparams.h> 28 29 #ifdef FREETYPE_H 30 #error "freetype.h of FreeType 1 has been loaded!" 31 #error "Please fix the directory search order for header files" 32 #error "so that freetype.h of FreeType 2 is found first." 33 #endif 34 35 36 FT_BEGIN_HEADER 37 38 39 /************************************************************************** 40 * 41 * @section: 42 * sfnt_names 43 * 44 * @title: 45 * SFNT Names 46 * 47 * @abstract: 48 * Access the names embedded in TrueType and OpenType files. 49 * 50 * @description: 51 * The TrueType and OpenType specifications allow the inclusion of a 52 * special names table ('name') in font files. This table contains 53 * textual (and internationalized) information regarding the font, like 54 * family name, copyright, version, etc. 55 * 56 * The definitions below are used to access them if available. 57 * 58 * Note that this has nothing to do with glyph names! 59 * 60 */ 61 62 63 /************************************************************************** 64 * 65 * @struct: 66 * FT_SfntName 67 * 68 * @description: 69 * A structure used to model an SFNT 'name' table entry. 70 * 71 * @fields: 72 * platform_id :: 73 * The platform ID for `string`. See @TT_PLATFORM_XXX for possible 74 * values. 75 * 76 * encoding_id :: 77 * The encoding ID for `string`. See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, 78 * @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX for possible 79 * values. 80 * 81 * language_id :: 82 * The language ID for `string`. See @TT_MAC_LANGID_XXX and 83 * @TT_MS_LANGID_XXX for possible values. 84 * 85 * Registered OpenType values for `language_id` are always smaller than 86 * 0x8000; values equal or larger than 0x8000 usually indicate a 87 * language tag string (introduced in OpenType version 1.6). Use 88 * function @FT_Get_Sfnt_LangTag with `language_id` as its argument to 89 * retrieve the associated language tag. 90 * 91 * name_id :: 92 * An identifier for `string`. See @TT_NAME_ID_XXX for possible 93 * values. 94 * 95 * string :: 96 * The 'name' string. Note that its format differs depending on the 97 * (platform,encoding) pair, being either a string of bytes (without a 98 * terminating `NULL` byte) or containing UTF-16BE entities. 99 * 100 * string_len :: 101 * The length of `string` in bytes. 102 * 103 * @note: 104 * Please refer to the TrueType or OpenType specification for more 105 * details. 106 */ 107 typedef struct FT_SfntName_ 108 { 109 FT_UShort platform_id; 110 FT_UShort encoding_id; 111 FT_UShort language_id; 112 FT_UShort name_id; 113 114 FT_Byte* string; /* this string is *not* null-terminated! */ 115 FT_UInt string_len; /* in bytes */ 116 117 } FT_SfntName; 118 119 120 /************************************************************************** 121 * 122 * @function: 123 * FT_Get_Sfnt_Name_Count 124 * 125 * @description: 126 * Retrieve the number of name strings in the SFNT 'name' table. 127 * 128 * @input: 129 * face :: 130 * A handle to the source face. 131 * 132 * @return: 133 * The number of strings in the 'name' table. 134 * 135 * @note: 136 * This function always returns an error if the config macro 137 * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. 138 */ 139 FT_EXPORT( FT_UInt ) 140 FT_Get_Sfnt_Name_Count( FT_Face face ); 141 142 143 /************************************************************************** 144 * 145 * @function: 146 * FT_Get_Sfnt_Name 147 * 148 * @description: 149 * Retrieve a string of the SFNT 'name' table for a given index. 150 * 151 * @input: 152 * face :: 153 * A handle to the source face. 154 * 155 * idx :: 156 * The index of the 'name' string. 157 * 158 * @output: 159 * aname :: 160 * The indexed @FT_SfntName structure. 161 * 162 * @return: 163 * FreeType error code. 0~means success. 164 * 165 * @note: 166 * The `string` array returned in the `aname` structure is not 167 * null-terminated. Note that you don't have to deallocate `string` by 168 * yourself; FreeType takes care of it if you call @FT_Done_Face. 169 * 170 * Use @FT_Get_Sfnt_Name_Count to get the total number of available 171 * 'name' table entries, then do a loop until you get the right platform, 172 * encoding, and name ID. 173 * 174 * 'name' table format~1 entries can use language tags also, see 175 * @FT_Get_Sfnt_LangTag. 176 * 177 * This function always returns an error if the config macro 178 * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. 179 */ 180 FT_EXPORT( FT_Error ) 181 FT_Get_Sfnt_Name( FT_Face face, 182 FT_UInt idx, 183 FT_SfntName *aname ); 184 185 186 /************************************************************************** 187 * 188 * @struct: 189 * FT_SfntLangTag 190 * 191 * @description: 192 * A structure to model a language tag entry from an SFNT 'name' table. 193 * 194 * @fields: 195 * string :: 196 * The language tag string, encoded in UTF-16BE (without trailing 197 * `NULL` bytes). 198 * 199 * string_len :: 200 * The length of `string` in **bytes**. 201 * 202 * @note: 203 * Please refer to the TrueType or OpenType specification for more 204 * details. 205 * 206 * @since: 207 * 2.8 208 */ 209 typedef struct FT_SfntLangTag_ 210 { 211 FT_Byte* string; /* this string is *not* null-terminated! */ 212 FT_UInt string_len; /* in bytes */ 213 214 } FT_SfntLangTag; 215 216 217 /************************************************************************** 218 * 219 * @function: 220 * FT_Get_Sfnt_LangTag 221 * 222 * @description: 223 * Retrieve the language tag associated with a language ID of an SFNT 224 * 'name' table entry. 225 * 226 * @input: 227 * face :: 228 * A handle to the source face. 229 * 230 * langID :: 231 * The language ID, as returned by @FT_Get_Sfnt_Name. This is always a 232 * value larger than 0x8000. 233 * 234 * @output: 235 * alangTag :: 236 * The language tag associated with the 'name' table entry's language 237 * ID. 238 * 239 * @return: 240 * FreeType error code. 0~means success. 241 * 242 * @note: 243 * The `string` array returned in the `alangTag` structure is not 244 * null-terminated. Note that you don't have to deallocate `string` by 245 * yourself; FreeType takes care of it if you call @FT_Done_Face. 246 * 247 * Only 'name' table format~1 supports language tags. For format~0 248 * tables, this function always returns FT_Err_Invalid_Table. For 249 * invalid format~1 language ID values, FT_Err_Invalid_Argument is 250 * returned. 251 * 252 * This function always returns an error if the config macro 253 * `TT_CONFIG_OPTION_SFNT_NAMES` is not defined in `ftoption.h`. 254 * 255 * @since: 256 * 2.8 257 */ 258 FT_EXPORT( FT_Error ) 259 FT_Get_Sfnt_LangTag( FT_Face face, 260 FT_UInt langID, 261 FT_SfntLangTag *alangTag ); 262 263 264 /* */ 265 266 267 FT_END_HEADER 268 269 #endif /* FTSNAMES_H_ */ 270 271 272 /* END */ 273