blob: 6fe7e2b21310650e17f6265b6ff67a132372ccb5 [file] [log] [blame]
David Turnerd2b1f351999-12-16 23:11:37 +00001/***************************************************************************/
2/* */
3/* ttpost.c */
4/* */
Werner Lemberg920d41e2000-06-05 14:32:32 +00005/* Postcript name table processing for TrueType and OpenType fonts */
6/* (body). */
David Turnerd2b1f351999-12-16 23:11:37 +00007/* */
Werner Lemberg920d41e2000-06-05 14:32:32 +00008/* Copyright 1996-2000 by */
David Turnerd2b1f351999-12-16 23:11:37 +00009/* David Turner, Robert Wilhelm, and Werner Lemberg. */
10/* */
Werner Lemberg920d41e2000-06-05 14:32:32 +000011/* This file is part of the FreeType project, and may only be used, */
12/* modified, and distributed under the terms of the FreeType project */
David Turnerd2b1f351999-12-16 23:11:37 +000013/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
14/* this file you indicate that you have read the license and */
15/* understand and accept it fully. */
16/* */
17/***************************************************************************/
18
David Turnerd2b1f351999-12-16 23:11:37 +000019 /*************************************************************************/
20 /* */
21 /* The post table is not completely loaded by the core engine. This */
22 /* file loads the missing PS glyph names and implements an API to access */
23 /* them. */
24 /* */
25 /*************************************************************************/
26
Werner Lemberg920d41e2000-06-05 14:32:32 +000027
David Turnerefce08d2000-05-11 18:23:52 +000028#include <freetype/internal/ftstream.h>
29#include <freetype/internal/tterrors.h>
30#include <freetype/tttags.h>
David Turnerd2b1f351999-12-16 23:11:37 +000031
Werner Lemberg7fa51b52000-07-08 19:51:42 +000032
David Turnera90663f2000-07-08 00:41:13 +000033#ifdef FT_FLAT_COMPILE
Werner Lemberg7fa51b52000-07-08 19:51:42 +000034
David Turnera90663f2000-07-08 00:41:13 +000035#include "ttpost.h"
36#include "ttload.h"
Werner Lemberg7fa51b52000-07-08 19:51:42 +000037
David Turnera90663f2000-07-08 00:41:13 +000038#else
Werner Lemberg7fa51b52000-07-08 19:51:42 +000039
David Turnera90663f2000-07-08 00:41:13 +000040#include <sfnt/ttpost.h>
41#include <sfnt/ttload.h>
David Turnera90663f2000-07-08 00:41:13 +000042
Werner Lemberg7fa51b52000-07-08 19:51:42 +000043#endif
David Turnerd2b1f351999-12-16 23:11:37 +000044
Werner Lemberg78575dc2000-06-12 19:36:41 +000045
46 /*************************************************************************/
47 /* */
48 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
49 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
50 /* messages during execution. */
51 /* */
52#undef FT_COMPONENT
53#define FT_COMPONENT trace_ttpost
54
55
Werner Lembergfbeb41d2000-07-02 00:27:53 +000056 /* If this configuration macro is defined, we rely on the `PSNames' */
Werner Lemberg920d41e2000-06-05 14:32:32 +000057 /* module to grab the glyph names. */
58
David Turner74336552000-02-10 19:14:48 +000059#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
Werner Lemberg920d41e2000-06-05 14:32:32 +000060
Werner Lembergfbeb41d2000-07-02 00:27:53 +000061
David Turnerefce08d2000-05-11 18:23:52 +000062#include <freetype/internal/psnames.h>
David Turner74336552000-02-10 19:14:48 +000063
David Turnerf9b8dec2000-06-16 19:34:52 +000064#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) )
David Turner74336552000-02-10 19:14:48 +000065
Werner Lembergfbeb41d2000-07-02 00:27:53 +000066
Werner Lemberg920d41e2000-06-05 14:32:32 +000067#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
David Turner74336552000-02-10 19:14:48 +000068
Werner Lembergfbeb41d2000-07-02 00:27:53 +000069
70 /* Otherwise, we ignore the `PSNames' module, and provide our own */
Werner Lemberg920d41e2000-06-05 14:32:32 +000071 /* table of Mac names. Thus, it is possible to build a version of */
72 /* FreeType without the Type 1 driver & PSNames module. */
73
74#define MAC_NAME( x ) TT_Post_Default_Names[x]
David Turner74336552000-02-10 19:14:48 +000075
David Turnerd2b1f351999-12-16 23:11:37 +000076 /* the 258 default Mac PS glyph names */
77
David Turnerf9b8dec2000-06-16 19:34:52 +000078 FT_String* TT_Post_Default_Names[258] =
David Turnerd2b1f351999-12-16 23:11:37 +000079 {
80 /* 0 */
David Turner74336552000-02-10 19:14:48 +000081 ".notdef", ".null", "CR", "space", "exclam",
82 "quotedbl", "numbersign", "dollar", "percent", "ampersand",
David Turnerd2b1f351999-12-16 23:11:37 +000083 /* 10 */
David Turner74336552000-02-10 19:14:48 +000084 "quotesingle", "parenleft", "parenright", "asterisk", "plus",
85 "comma", "hyphen", "period", "slash", "zero",
David Turnerd2b1f351999-12-16 23:11:37 +000086 /* 20 */
David Turner74336552000-02-10 19:14:48 +000087 "one", "two", "three", "four", "five",
88 "six", "seven", "eight", "nine", "colon",
David Turnerd2b1f351999-12-16 23:11:37 +000089 /* 30 */
David Turner74336552000-02-10 19:14:48 +000090 "semicolon", "less", "equal", "greater", "question",
91 "at", "A", "B", "C", "D",
David Turnerd2b1f351999-12-16 23:11:37 +000092 /* 40 */
David Turner74336552000-02-10 19:14:48 +000093 "E", "F", "G", "H", "I",
94 "J", "K", "L", "M", "N",
David Turnerd2b1f351999-12-16 23:11:37 +000095 /* 50 */
David Turner74336552000-02-10 19:14:48 +000096 "O", "P", "Q", "R", "S",
97 "T", "U", "V", "W", "X",
David Turnerd2b1f351999-12-16 23:11:37 +000098 /* 60 */
David Turner74336552000-02-10 19:14:48 +000099 "Y", "Z", "bracketleft", "backslash", "bracketright",
100 "asciicircum", "underscore", "grave", "a", "b",
David Turnerd2b1f351999-12-16 23:11:37 +0000101 /* 70 */
David Turner74336552000-02-10 19:14:48 +0000102 "c", "d", "e", "f", "g",
103 "h", "i", "j", "k", "l",
David Turnerd2b1f351999-12-16 23:11:37 +0000104 /* 80 */
David Turner74336552000-02-10 19:14:48 +0000105 "m", "n", "o", "p", "q",
106 "r", "s", "t", "u", "v",
David Turnerd2b1f351999-12-16 23:11:37 +0000107 /* 90 */
David Turner74336552000-02-10 19:14:48 +0000108 "w", "x", "y", "z", "braceleft",
109 "bar", "braceright", "asciitilde", "Adieresis", "Aring",
David Turnerd2b1f351999-12-16 23:11:37 +0000110 /* 100 */
David Turner74336552000-02-10 19:14:48 +0000111 "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
112 "aacute", "agrave", "acircumflex", "adieresis", "atilde",
David Turnerd2b1f351999-12-16 23:11:37 +0000113 /* 110 */
David Turner74336552000-02-10 19:14:48 +0000114 "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
115 "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
David Turnerd2b1f351999-12-16 23:11:37 +0000116 /* 120 */
David Turner74336552000-02-10 19:14:48 +0000117 "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
118 "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
David Turnerd2b1f351999-12-16 23:11:37 +0000119 /* 130 */
David Turner74336552000-02-10 19:14:48 +0000120 "dagger", "degree", "cent", "sterling", "section",
121 "bullet", "paragraph", "germandbls", "registered", "copyright",
David Turnerd2b1f351999-12-16 23:11:37 +0000122 /* 140 */
David Turner74336552000-02-10 19:14:48 +0000123 "trademark", "acute", "dieresis", "notequal", "AE",
124 "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
David Turnerd2b1f351999-12-16 23:11:37 +0000125 /* 150 */
David Turner74336552000-02-10 19:14:48 +0000126 "yen", "mu", "partialdiff", "summation", "product",
127 "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
David Turnerd2b1f351999-12-16 23:11:37 +0000128 /* 160 */
David Turner74336552000-02-10 19:14:48 +0000129 "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
130 "radical", "florin", "approxequal", "Delta", "guillemotleft",
David Turnerd2b1f351999-12-16 23:11:37 +0000131 /* 170 */
David Turner74336552000-02-10 19:14:48 +0000132 "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde",
133 "Otilde", "OE", "oe", "endash", "emdash",
David Turnerd2b1f351999-12-16 23:11:37 +0000134 /* 180 */
David Turner74336552000-02-10 19:14:48 +0000135 "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
136 "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
David Turnerd2b1f351999-12-16 23:11:37 +0000137 /* 190 */
David Turner74336552000-02-10 19:14:48 +0000138 "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
139 "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
David Turnerd2b1f351999-12-16 23:11:37 +0000140 /* 200 */
David Turner74336552000-02-10 19:14:48 +0000141 "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
142 "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
David Turnerd2b1f351999-12-16 23:11:37 +0000143 /* 210 */
David Turner74336552000-02-10 19:14:48 +0000144 "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
145 "dotlessi", "circumflex", "tilde", "macron", "breve",
David Turnerd2b1f351999-12-16 23:11:37 +0000146 /* 220 */
David Turner74336552000-02-10 19:14:48 +0000147 "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
148 "caron", "Lslash", "lslash", "Scaron", "scaron",
David Turnerd2b1f351999-12-16 23:11:37 +0000149 /* 230 */
David Turner74336552000-02-10 19:14:48 +0000150 "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
151 "Yacute", "yacute", "Thorn", "thorn", "minus",
David Turnerd2b1f351999-12-16 23:11:37 +0000152 /* 240 */
David Turner74336552000-02-10 19:14:48 +0000153 "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
154 "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
David Turnerd2b1f351999-12-16 23:11:37 +0000155 /* 250 */
David Turner74336552000-02-10 19:14:48 +0000156 "Idot", "Scedilla", "scedilla", "Cacute", "cacute",
157 "Ccaron", "ccaron", "dmacron",
David Turnerd2b1f351999-12-16 23:11:37 +0000158 };
Werner Lemberg920d41e2000-06-05 14:32:32 +0000159
Werner Lembergfbeb41d2000-07-02 00:27:53 +0000160
Werner Lemberg920d41e2000-06-05 14:32:32 +0000161#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
David Turnerd2b1f351999-12-16 23:11:37 +0000162
163
164 static
David Turnerf9b8dec2000-06-16 19:34:52 +0000165 FT_Error Load_Format_20( TT_Face face,
David Turnerd2b1f351999-12-16 23:11:37 +0000166 FT_Stream stream )
167 {
168 FT_Memory memory = stream->memory;
David Turnerf9b8dec2000-06-16 19:34:52 +0000169 FT_Error error;
David Turnerd2b1f351999-12-16 23:11:37 +0000170
David Turnerf9b8dec2000-06-16 19:34:52 +0000171 FT_Int num_glyphs;
Werner Lembergddbb8e72000-10-26 10:04:16 +0000172 FT_UShort num_names;
David Turnerd2b1f351999-12-16 23:11:37 +0000173
David Turnerf9b8dec2000-06-16 19:34:52 +0000174 FT_UShort* glyph_indices = 0;
175 FT_Char** name_strings = 0;
David Turnerd2b1f351999-12-16 23:11:37 +0000176
177
178 if ( READ_UShort( num_glyphs ) )
179 goto Exit;
180
181 /* UNDOCUMENTED! The number of glyphs in this table can be smaller */
182 /* than the value in the maxp table (cf. cyberbit.ttf). */
183
184 /* There already exist fonts which have more than 32768 glyph names */
185 /* in this table, so the test for this threshold has been dropped. */
186
187 if ( num_glyphs > face->root.num_glyphs )
188 {
189 error = TT_Err_Invalid_File_Format;
190 goto Exit;
191 }
192
193 /* load the indices */
194 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000195 FT_Int n;
David Turnerd2b1f351999-12-16 23:11:37 +0000196
Werner Lemberg920d41e2000-06-05 14:32:32 +0000197
David Turnerf9b8dec2000-06-16 19:34:52 +0000198 if ( ALLOC_ARRAY ( glyph_indices, num_glyphs, FT_UShort ) ||
David Turnerd2b1f351999-12-16 23:11:37 +0000199 ACCESS_Frame( num_glyphs * 2L ) )
200 goto Fail;
201
202 for ( n = 0; n < num_glyphs; n++ )
203 glyph_indices[n] = GET_UShort();
204
205 FORGET_Frame();
206 }
207
208 /* compute number of names stored in table */
209 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000210 FT_Int n;
David Turnerd2b1f351999-12-16 23:11:37 +0000211
Werner Lemberg920d41e2000-06-05 14:32:32 +0000212
David Turnerd2b1f351999-12-16 23:11:37 +0000213 num_names = 0;
214
215 for ( n = 0; n < num_glyphs; n++ )
216 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000217 FT_Int index;
David Turnerd2b1f351999-12-16 23:11:37 +0000218
Werner Lemberg920d41e2000-06-05 14:32:32 +0000219
David Turnerd2b1f351999-12-16 23:11:37 +0000220 index = glyph_indices[n];
221 if ( index >= 258 )
222 {
223 index -= 257;
224 if ( index > num_names )
225 num_names = index;
226 }
227 }
228 }
229
230 /* now load the name strings */
231 {
Werner Lembergddbb8e72000-10-26 10:04:16 +0000232 FT_UShort n;
David Turnerd2b1f351999-12-16 23:11:37 +0000233
Werner Lemberg920d41e2000-06-05 14:32:32 +0000234
David Turnerf9b8dec2000-06-16 19:34:52 +0000235 if ( ALLOC_ARRAY( name_strings, num_names, FT_Char* ) )
David Turnerd2b1f351999-12-16 23:11:37 +0000236 goto Fail;
237
238 for ( n = 0; n < num_names; n++ )
239 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000240 FT_UInt len;
David Turnerd2b1f351999-12-16 23:11:37 +0000241
Werner Lemberg920d41e2000-06-05 14:32:32 +0000242
Werner Lembergfbeb41d2000-07-02 00:27:53 +0000243 if ( READ_Byte ( len ) ||
244 ALLOC_ARRAY( name_strings[n], len + 1, FT_Char ) ||
245 FILE_Read ( name_strings[n], len ) )
David Turnerd2b1f351999-12-16 23:11:37 +0000246 goto Fail1;
247
248 name_strings[n][len] = '\0';
249 }
250 }
251
252 /* all right, set table fields and exit successfuly */
253 {
254 TT_Post_20* table = &face->postscript_names.names.format_20;
255
Werner Lemberg920d41e2000-06-05 14:32:32 +0000256
David Turnerd2b1f351999-12-16 23:11:37 +0000257 table->num_glyphs = num_glyphs;
258 table->num_names = num_names;
259 table->glyph_indices = glyph_indices;
260 table->glyph_names = name_strings;
261 }
262 return TT_Err_Ok;
263
264
265 Fail1:
266 {
Werner Lembergddbb8e72000-10-26 10:04:16 +0000267 FT_UShort n;
David Turnerd2b1f351999-12-16 23:11:37 +0000268
Werner Lemberg920d41e2000-06-05 14:32:32 +0000269
David Turnerd2b1f351999-12-16 23:11:37 +0000270 for ( n = 0; n < num_names; n++ )
271 FREE( name_strings[n] );
272 }
273
274 Fail:
275 FREE( name_strings );
276 FREE( glyph_indices );
277
278 Exit:
279 return error;
280 }
281
282
283 static
David Turnerf9b8dec2000-06-16 19:34:52 +0000284 FT_Error Load_Format_25( TT_Face face,
David Turnerd2b1f351999-12-16 23:11:37 +0000285 FT_Stream stream )
286 {
287 FT_Memory memory = stream->memory;
David Turnerf9b8dec2000-06-16 19:34:52 +0000288 FT_Error error;
David Turnerd2b1f351999-12-16 23:11:37 +0000289
David Turnerf9b8dec2000-06-16 19:34:52 +0000290 FT_Int num_glyphs;
291 FT_Char* offset_table = 0;
David Turnerd2b1f351999-12-16 23:11:37 +0000292
293
294 /* UNDOCUMENTED! This value appears only in the Apple TT specs. */
295 if ( READ_UShort( num_glyphs ) )
296 goto Exit;
297
298 /* check the number of glyphs */
299 if ( num_glyphs > face->root.num_glyphs || num_glyphs > 258 )
300 {
301 error = TT_Err_Invalid_File_Format;
302 goto Exit;
303 }
304
305 if ( ALLOC ( offset_table, num_glyphs ) ||
306 FILE_Read( offset_table, num_glyphs ) )
307 goto Fail;
308
309 /* now check the offset table */
310 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000311 FT_Int n;
David Turnerd2b1f351999-12-16 23:11:37 +0000312
313
314 for ( n = 0; n < num_glyphs; n++ )
315 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000316 FT_Long index = (FT_Long)n + offset_table[n];
David Turnerd2b1f351999-12-16 23:11:37 +0000317
318
319 if ( index < 0 || index > num_glyphs )
320 {
321 error = TT_Err_Invalid_File_Format;
322 goto Fail;
323 }
324 }
325 }
326
327 /* OK, set table fields and exit successfuly */
328 {
329 TT_Post_25* table = &face->postscript_names.names.format_25;
330
331
332 table->num_glyphs = num_glyphs;
333 table->offsets = offset_table;
334 }
335
336 return TT_Err_Ok;
337
338 Fail:
339 FREE( offset_table );
340
341 Exit:
342 return error;
343 }
344
345
346 static
David Turnerf9b8dec2000-06-16 19:34:52 +0000347 FT_Error Load_Post_Names( TT_Face face )
David Turnerd2b1f351999-12-16 23:11:37 +0000348 {
Werner Lemberg21a27ee2000-09-01 14:36:39 +0000349 FT_Stream stream;
350 FT_Error error;
351 FT_Fixed format;
352
David Turnerd2b1f351999-12-16 23:11:37 +0000353
354 /* get a stream for the face's resource */
355 stream = face->root.stream;
356
357 /* seek to the beginning of the PS names table */
358 error = face->goto_table( face, TTAG_post, stream, 0 );
Werner Lemberg920d41e2000-06-05 14:32:32 +0000359 if ( error )
360 goto Exit;
David Turnerd2b1f351999-12-16 23:11:37 +0000361
Werner Lemberg21a27ee2000-09-01 14:36:39 +0000362 format = face->postscript.FormatType;
363
364 /* go to beginning of subtable */
365 if ( FILE_Skip( 32 ) )
366 goto Exit;
367
David Turnerd2b1f351999-12-16 23:11:37 +0000368 /* now read postscript table */
Werner Lemberg21a27ee2000-09-01 14:36:39 +0000369 switch ( format )
David Turnerd2b1f351999-12-16 23:11:37 +0000370 {
Werner Lemberg920d41e2000-06-05 14:32:32 +0000371 case 0x00020000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000372 error = Load_Format_20( face, stream );
373 break;
374
Werner Lemberg920d41e2000-06-05 14:32:32 +0000375 case 0x00028000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000376 error = Load_Format_25( face, stream );
377 break;
378
379 default:
380 error = TT_Err_Invalid_File_Format;
381 }
382
383 face->postscript_names.loaded = 1;
384
385 Exit:
386 return error;
387 }
388
389
David Turner76a5f622000-11-04 01:55:49 +0000390 FT_LOCAL_DEF
David Turnerd2b1f351999-12-16 23:11:37 +0000391 void TT_Free_Post_Names( TT_Face face )
392 {
393 FT_Memory memory = face->root.memory;
394 TT_Post_Names* names = &face->postscript_names;
395
396
397 if ( names->loaded )
398 {
399 switch ( face->postscript.FormatType )
400 {
Werner Lemberg920d41e2000-06-05 14:32:32 +0000401 case 0x00020000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000402 {
403 TT_Post_20* table = &names->names.format_20;
Werner Lembergddbb8e72000-10-26 10:04:16 +0000404 FT_UShort n;
David Turnerd2b1f351999-12-16 23:11:37 +0000405
406
407 FREE( table->glyph_indices );
408 table->num_glyphs = 0;
409
410 for ( n = 0; n < table->num_names; n++ )
411 FREE( table->glyph_names[n] );
412
413 FREE( table->glyph_names );
414 table->num_names = 0;
415 }
416 break;
417
Werner Lemberg920d41e2000-06-05 14:32:32 +0000418 case 0x00028000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000419 {
420 TT_Post_25* table = &names->names.format_25;
421
422
423 FREE( table->offsets );
424 table->num_glyphs = 0;
425 }
426 break;
427 }
428 }
429 names->loaded = 0;
430 }
431
432
433 /*************************************************************************/
434 /* */
435 /* <Function> */
436 /* TT_Get_PS_Name */
437 /* */
438 /* <Description> */
439 /* Gets the PostScript glyph name of a glyph. */
440 /* */
441 /* <Input> */
Werner Lemberg920d41e2000-06-05 14:32:32 +0000442 /* face :: A handle to the parent face. */
443 /* */
David Turnerd2b1f351999-12-16 23:11:37 +0000444 /* index :: The glyph index. */
445 /* */
446 /* PSname :: The address of a string pointer. Will be NULL in case */
447 /* of error, otherwise it is a pointer to the glyph name. */
448 /* */
449 /* You must not modify the returned string! */
450 /* */
451 /* <Output> */
Werner Lemberga929ba92000-06-25 06:47:11 +0000452 /* FreeType error code. 0 means success. */
David Turnerd2b1f351999-12-16 23:11:37 +0000453 /* */
David Turner76a5f622000-11-04 01:55:49 +0000454 FT_LOCAL_DEF
David Turnerf9b8dec2000-06-16 19:34:52 +0000455 FT_Error TT_Get_PS_Name( TT_Face face,
456 FT_UInt index,
457 FT_String** PSname )
David Turnerd2b1f351999-12-16 23:11:37 +0000458 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000459 FT_Error error;
David Turner74336552000-02-10 19:14:48 +0000460 TT_Post_Names* names;
Werner Lemberg920d41e2000-06-05 14:32:32 +0000461
David Turner63cb46d2000-02-22 13:34:26 +0000462#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
David Turner74336552000-02-10 19:14:48 +0000463 PSNames_Interface* psnames;
David Turner63cb46d2000-02-22 13:34:26 +0000464#endif
Werner Lemberg920d41e2000-06-05 14:32:32 +0000465
466
David Turnerd2b1f351999-12-16 23:11:37 +0000467 if ( !face )
468 return TT_Err_Invalid_Face_Handle;
469
David Turnerf9b8dec2000-06-16 19:34:52 +0000470 if ( index >= (FT_UInt)face->root.num_glyphs )
David Turnerd2b1f351999-12-16 23:11:37 +0000471 return TT_Err_Invalid_Glyph_Index;
472
David Turner63cb46d2000-02-22 13:34:26 +0000473#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
David Turner74336552000-02-10 19:14:48 +0000474 psnames = (PSNames_Interface*)face->psnames;
Werner Lemberg920d41e2000-06-05 14:32:32 +0000475 if ( !psnames )
David Turner74336552000-02-10 19:14:48 +0000476 return TT_Err_Unimplemented_Feature;
David Turner63cb46d2000-02-22 13:34:26 +0000477#endif
478
Werner Lemberg920d41e2000-06-05 14:32:32 +0000479 names = &face->postscript_names;
David Turnerd2b1f351999-12-16 23:11:37 +0000480
481 /* `.notdef' by default */
Werner Lemberg920d41e2000-06-05 14:32:32 +0000482 *PSname = MAC_NAME( 0 );
David Turnerd2b1f351999-12-16 23:11:37 +0000483
484 switch ( face->postscript.FormatType )
485 {
Werner Lemberg920d41e2000-06-05 14:32:32 +0000486 case 0x00010000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000487 if ( index < 258 ) /* paranoid checking */
Werner Lemberg920d41e2000-06-05 14:32:32 +0000488 *PSname = MAC_NAME( index );
David Turnerd2b1f351999-12-16 23:11:37 +0000489 break;
490
Werner Lemberg920d41e2000-06-05 14:32:32 +0000491 case 0x00020000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000492 {
493 TT_Post_20* table = &names->names.format_20;
494
495
496 if ( !names->loaded )
497 {
498 error = Load_Post_Names( face );
499 if ( error )
500 break;
501 }
502
David Turnerb1aabf42000-11-30 23:48:22 +0000503 if ( index < (FT_UInt)table->num_glyphs )
David Turnerd2b1f351999-12-16 23:11:37 +0000504 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000505 FT_UShort name_index = table->glyph_indices[index];
David Turnerd2b1f351999-12-16 23:11:37 +0000506
507
508 if ( name_index < 258 )
Werner Lemberg920d41e2000-06-05 14:32:32 +0000509 *PSname = MAC_NAME( name_index );
David Turnerd2b1f351999-12-16 23:11:37 +0000510 else
David Turnerf9b8dec2000-06-16 19:34:52 +0000511 *PSname = (FT_String*)table->glyph_names[name_index - 258];
David Turnerd2b1f351999-12-16 23:11:37 +0000512 }
513 }
514 break;
515
Werner Lemberg920d41e2000-06-05 14:32:32 +0000516 case 0x00028000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000517 {
518 TT_Post_25* table = &names->names.format_25;
519
520
521 if ( !names->loaded )
522 {
523 error = Load_Post_Names( face );
524 if ( error )
525 break;
526 }
527
David Turnerb1aabf42000-11-30 23:48:22 +0000528 if ( index < (FT_UInt)table->num_glyphs ) /* paranoid checking */
David Turnerd2b1f351999-12-16 23:11:37 +0000529 {
530 index += table->offsets[index];
Werner Lemberg920d41e2000-06-05 14:32:32 +0000531 *PSname = MAC_NAME( index );
David Turnerd2b1f351999-12-16 23:11:37 +0000532 }
533 }
534 break;
535
Werner Lemberg920d41e2000-06-05 14:32:32 +0000536 case 0x00030000L:
David Turnerd2b1f351999-12-16 23:11:37 +0000537 break; /* nothing to do */
538 }
539
540 return TT_Err_Ok;
541 }
542
543
544/* END */