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-2020 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