blob: c7fc713029e17d06cfd1cab0901d3c85ede1740e [file] [log] [blame]
Werner Lemberg4e6dd852000-06-05 05:26:15 +00001/***************************************************************************/
2/* */
3/* sfdriver.c */
4/* */
5/* High-level SFNT driver interface (body). */
6/* */
Werner Lemberge7930922005-03-01 02:13:50 +00007/* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */
Werner Lemberg4e6dd852000-06-05 05:26:15 +00008/* David Turner, Robert Wilhelm, and Werner Lemberg. */
9/* */
10/* This file is part of the FreeType project, and may only be used, */
11/* modified, and distributed under the terms of the FreeType project */
12/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13/* this file you indicate that you have read the license and */
14/* understand and accept it fully. */
15/* */
16/***************************************************************************/
17
Werner Lembergcc069be2000-12-08 16:17:16 +000018
David Turner19ed8af2000-12-08 02:42:29 +000019#include <ft2build.h>
20#include FT_INTERNAL_SFNT_H
21#include FT_INTERNAL_OBJECTS_H
Werner Lemberg4e6dd852000-06-05 05:26:15 +000022
David Turner8d3a4012001-03-20 11:14:24 +000023#include "sfdriver.h"
24#include "ttload.h"
David Turner8d3a4012001-03-20 11:14:24 +000025#include "sfobjs.h"
Werner Lemberg7fa51b52000-07-08 19:51:42 +000026
Werner Lemberg754d5582003-09-12 20:32:51 +000027#include "sferrors.h"
28
Werner Lembergf1ca2342000-11-29 15:18:54 +000029#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
David Turner8d3a4012001-03-20 11:14:24 +000030#include "ttsbit.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000031#endif
32
33#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
David Turner8d3a4012001-03-20 11:14:24 +000034#include "ttpost.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000035#endif
36
David Turner89a2a4b2005-12-14 20:38:15 +000037#ifdef TT_CONFIG_OPTION_BDF
38#include "ttbdf.h"
39#include FT_SERVICE_BDF_H
40#endif
41
Werner Lemberg4b8397c2004-08-29 16:50:09 +000042#include "ttcmap.h"
Werner Lembergf13516c2005-03-03 17:09:08 +000043#include "ttkern.h"
Werner Lemberg91a67472003-12-17 14:28:22 +000044
David Turnerc313c502003-09-11 19:51:54 +000045#include FT_SERVICE_GLYPH_DICT_H
46#include FT_SERVICE_POSTSCRIPT_NAME_H
Werner Lemberg82906bf2003-11-04 18:24:20 +000047#include FT_SERVICE_SFNT_H
Werner Lemberg91a67472003-12-17 14:28:22 +000048#include FT_SERVICE_TT_CMAP_H
Werner Lemberg82906bf2003-11-04 18:24:20 +000049
50
51 /*
52 * SFNT TABLE SERVICE
53 *
54 */
Werner Lemberga929ba92000-06-25 06:47:11 +000055
Werner Lemberg52005c32001-06-27 23:25:46 +000056 static void*
57 get_sfnt_table( TT_Face face,
58 FT_Sfnt_Tag tag )
David Turner2e421312000-05-26 22:13:17 +000059 {
60 void* table;
61
David Turner2e421312000-05-26 22:13:17 +000062
Werner Lemberg4e6dd852000-06-05 05:26:15 +000063 switch ( tag )
64 {
65 case ft_sfnt_head:
66 table = &face->header;
67 break;
68
69 case ft_sfnt_hhea:
70 table = &face->horizontal;
71 break;
72
73 case ft_sfnt_vhea:
74 table = face->vertical_info ? &face->vertical : 0;
75 break;
76
77 case ft_sfnt_os2:
Werner Lembergb7b163c2002-03-31 18:48:24 +000078 table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
Werner Lemberg4e6dd852000-06-05 05:26:15 +000079 break;
80
81 case ft_sfnt_post:
82 table = &face->postscript;
83 break;
84
85 case ft_sfnt_maxp:
86 table = &face->max_profile;
87 break;
88
89 case ft_sfnt_pclt:
90 table = face->pclt.Version ? &face->pclt : 0;
91 break;
92
93 default:
94 table = 0;
David Turner2e421312000-05-26 22:13:17 +000095 }
Werner Lemberg4e6dd852000-06-05 05:26:15 +000096
David Turner2e421312000-05-26 22:13:17 +000097 return table;
98 }
99
100
Werner Lemberg17439422004-08-11 05:25:37 +0000101 static FT_Error
102 sfnt_table_info( TT_Face face,
103 FT_UInt idx,
104 FT_ULong *tag,
105 FT_ULong *length )
106 {
107 if ( !tag || !length )
108 return SFNT_Err_Invalid_Argument;
109
110 if ( idx >= face->num_tables )
111 return SFNT_Err_Table_Missing;
112
113 *tag = face->dir_tables[idx].Tag;
114 *length = face->dir_tables[idx].Length;
115
116 return SFNT_Err_Ok;
117 }
118
119
Werner Lemberg82906bf2003-11-04 18:24:20 +0000120 static const FT_Service_SFNT_TableRec sfnt_service_sfnt_table =
121 {
122 (FT_SFNT_TableLoadFunc)tt_face_load_any,
Werner Lemberg17439422004-08-11 05:25:37 +0000123 (FT_SFNT_TableGetFunc) get_sfnt_table,
124 (FT_SFNT_TableInfoFunc)sfnt_table_info
Werner Lemberg82906bf2003-11-04 18:24:20 +0000125 };
126
127
David Turner6930b452000-07-19 17:13:03 +0000128#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
Werner Lembergd060a752000-07-20 06:57:41 +0000129
David Turnerc313c502003-09-11 19:51:54 +0000130 /*
131 * GLYPH DICT SERVICE
132 *
133 */
David Turner17dd0632003-09-21 16:04:05 +0000134
Werner Lemberg52005c32001-06-27 23:25:46 +0000135 static FT_Error
David Turnerc313c502003-09-11 19:51:54 +0000136 sfnt_get_glyph_name( TT_Face face,
Werner Lemberg52005c32001-06-27 23:25:46 +0000137 FT_UInt glyph_index,
138 FT_Pointer buffer,
139 FT_UInt buffer_max )
David Turner6930b452000-07-19 17:13:03 +0000140 {
141 FT_String* gname;
142 FT_Error error;
Werner Lemberge4b32a52000-10-31 20:42:18 +0000143
Werner Lembergd060a752000-07-20 06:57:41 +0000144
David Turnerb08fe2d2002-08-27 20:20:29 +0000145 error = tt_face_get_ps_name( face, glyph_index, &gname );
Werner Lembergd060a752000-07-20 06:57:41 +0000146 if ( !error && buffer_max > 0 )
David Turner6930b452000-07-19 17:13:03 +0000147 {
David Turnerd15bc0d2002-04-12 09:31:48 +0000148 FT_UInt len = (FT_UInt)( ft_strlen( gname ) );
Werner Lemberge4b32a52000-10-31 20:42:18 +0000149
Werner Lembergd060a752000-07-20 06:57:41 +0000150
151 if ( len >= buffer_max )
152 len = buffer_max - 1;
Werner Lemberge4b32a52000-10-31 20:42:18 +0000153
David Turnere459d742002-03-22 13:52:37 +0000154 FT_MEM_COPY( buffer, gname, len );
David Turner6930b452000-07-19 17:13:03 +0000155 ((FT_Byte*)buffer)[len] = 0;
156 }
Werner Lemberge4b32a52000-10-31 20:42:18 +0000157
David Turner6930b452000-07-19 17:13:03 +0000158 return error;
Werner Lemberge4b32a52000-10-31 20:42:18 +0000159 }
Werner Lembergd060a752000-07-20 06:57:41 +0000160
161
David Turnerc313c502003-09-11 19:51:54 +0000162 static const FT_Service_GlyphDictRec sfnt_service_glyph_dict =
163 {
Werner Lemberg013efd12003-09-17 05:26:33 +0000164 (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name,
165 (FT_GlyphDict_NameIndexFunc)NULL
David Turnerc313c502003-09-11 19:51:54 +0000166 };
167
168#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
169
Werner Lemberg013efd12003-09-17 05:26:33 +0000170
David Turnerc313c502003-09-11 19:51:54 +0000171 /*
172 * POSTSCRIPT NAME SERVICE
173 *
174 */
David Turner17dd0632003-09-21 16:04:05 +0000175
David Turner23bcde12001-10-17 13:48:10 +0000176 static const char*
David Turnerc313c502003-09-11 19:51:54 +0000177 sfnt_get_ps_name( TT_Face face )
David Turner23bcde12001-10-17 13:48:10 +0000178 {
Werner Lembergb7b163c2002-03-31 18:48:24 +0000179 FT_Int n, found_win, found_apple;
David Turner678e0d42002-03-20 10:47:38 +0000180 const char* result = NULL;
David Turner23bcde12001-10-17 13:48:10 +0000181
Werner Lembergc3b21602001-12-05 01:22:05 +0000182
183 /* shouldn't happen, but just in case to avoid memory leaks */
David Turnerc313c502003-09-11 19:51:54 +0000184 if ( face->postscript_name )
185 return face->postscript_name;
David Turner23bcde12001-10-17 13:48:10 +0000186
Werner Lemberg8880f2c2002-01-25 16:05:39 +0000187 /* scan the name table to see whether we have a Postscript name here, */
188 /* either in Macintosh or Windows platform encodings */
Werner Lembergb7b163c2002-03-31 18:48:24 +0000189 found_win = -1;
190 found_apple = -1;
David Turner791d83a2002-05-27 23:52:01 +0000191
David Turner23bcde12001-10-17 13:48:10 +0000192 for ( n = 0; n < face->num_names; n++ )
193 {
David Turnerb5713c52002-03-14 11:26:29 +0000194 TT_NameEntryRec* name = face->name_table.names + n;
Werner Lembergc3b21602001-12-05 01:22:05 +0000195
196
David Turner791d83a2002-05-27 23:52:01 +0000197 if ( name->nameID == 6 && name->stringLength > 0 )
David Turner23bcde12001-10-17 13:48:10 +0000198 {
David Turner28ea6f62002-03-05 16:12:57 +0000199 if ( name->platformID == 3 &&
200 name->encodingID == 1 &&
201 name->languageID == 0x409 )
202 found_win = n;
David Turner791d83a2002-05-27 23:52:01 +0000203
David Turner28ea6f62002-03-05 16:12:57 +0000204 if ( name->platformID == 1 &&
205 name->encodingID == 0 &&
206 name->languageID == 0 )
207 found_apple = n;
David Turner23bcde12001-10-17 13:48:10 +0000208 }
209 }
David Turner791d83a2002-05-27 23:52:01 +0000210
Werner Lemberg2282f342002-03-28 14:21:15 +0000211 if ( found_win != -1 )
David Turner28ea6f62002-03-05 16:12:57 +0000212 {
Werner Lembergb7b163c2002-03-31 18:48:24 +0000213 FT_Memory memory = face->root.memory;
David Turnerb5713c52002-03-14 11:26:29 +0000214 TT_NameEntryRec* name = face->name_table.names + found_win;
Werner Lembergb7b163c2002-03-31 18:48:24 +0000215 FT_UInt len = name->stringLength / 2;
Werner Lemberg779afe42003-06-22 15:33:53 +0000216 FT_Error error = SFNT_Err_Ok;
Werner Lemberg319c00d2003-04-23 19:48:24 +0000217
218 FT_UNUSED( error );
Werner Lembergb7b163c2002-03-31 18:48:24 +0000219
David Turner791d83a2002-05-27 23:52:01 +0000220
Werner Lemberg877ff672002-05-28 06:03:10 +0000221 if ( !FT_ALLOC( result, name->stringLength + 1 ) )
David Turner28ea6f62002-03-05 16:12:57 +0000222 {
David Turner791d83a2002-05-27 23:52:01 +0000223 FT_Stream stream = face->name_table.stream;
Werner Lemberg877ff672002-05-28 06:03:10 +0000224 FT_String* r = (FT_String*)result;
225 FT_Byte* p = (FT_Byte*)name->string;
David Turner791d83a2002-05-27 23:52:01 +0000226
227
228 if ( FT_STREAM_SEEK( name->stringOffset ) ||
229 FT_FRAME_ENTER( name->stringLength ) )
230 {
231 FT_FREE( result );
232 name->stringLength = 0;
233 name->stringOffset = 0;
234 FT_FREE( name->string );
Werner Lemberg877ff672002-05-28 06:03:10 +0000235
David Turner791d83a2002-05-27 23:52:01 +0000236 goto Exit;
237 }
238
Werner Lemberg877ff672002-05-28 06:03:10 +0000239 p = (FT_Byte*)stream->cursor;
Werner Lembergb7b163c2002-03-31 18:48:24 +0000240
David Turner28ea6f62002-03-05 16:12:57 +0000241 for ( ; len > 0; len--, p += 2 )
242 {
243 if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
244 *r++ = p[1];
245 }
246 *r = '\0';
David Turner791d83a2002-05-27 23:52:01 +0000247
248 FT_FRAME_EXIT();
David Turner28ea6f62002-03-05 16:12:57 +0000249 }
David Turner678e0d42002-03-20 10:47:38 +0000250 goto Exit;
David Turner28ea6f62002-03-05 16:12:57 +0000251 }
252
Werner Lemberg2282f342002-03-28 14:21:15 +0000253 if ( found_apple != -1 )
David Turner28ea6f62002-03-05 16:12:57 +0000254 {
David Turner678e0d42002-03-20 10:47:38 +0000255 FT_Memory memory = face->root.memory;
Werner Lemberg2282f342002-03-28 14:21:15 +0000256 TT_NameEntryRec* name = face->name_table.names + found_apple;
David Turner678e0d42002-03-20 10:47:38 +0000257 FT_UInt len = name->stringLength;
Werner Lemberg779afe42003-06-22 15:33:53 +0000258 FT_Error error = SFNT_Err_Ok;
Werner Lemberg319c00d2003-04-23 19:48:24 +0000259
260 FT_UNUSED( error );
David Turner94dbf7f2002-03-26 02:38:39 +0000261
Werner Lembergb7b163c2002-03-31 18:48:24 +0000262
263 if ( !FT_ALLOC( result, len + 1 ) )
David Turner28ea6f62002-03-05 16:12:57 +0000264 {
David Turner791d83a2002-05-27 23:52:01 +0000265 FT_Stream stream = face->name_table.stream;
266
267
268 if ( FT_STREAM_SEEK( name->stringOffset ) ||
269 FT_STREAM_READ( result, len ) )
270 {
271 name->stringOffset = 0;
272 name->stringLength = 0;
273 FT_FREE( name->string );
274 FT_FREE( result );
275 goto Exit;
276 }
David Turner94dbf7f2002-03-26 02:38:39 +0000277 ((char*)result)[len] = '\0';
David Turner28ea6f62002-03-05 16:12:57 +0000278 }
David Turner28ea6f62002-03-05 16:12:57 +0000279 }
Werner Lembergc3b21602001-12-05 01:22:05 +0000280
David Turner678e0d42002-03-20 10:47:38 +0000281 Exit:
David Turnerc313c502003-09-11 19:51:54 +0000282 face->postscript_name = result;
David Turner678e0d42002-03-20 10:47:38 +0000283 return result;
David Turner23bcde12001-10-17 13:48:10 +0000284 }
285
Werner Lemberg40bb0962003-11-01 14:36:20 +0000286 static const FT_Service_PsFontNameRec sfnt_service_ps_name =
David Turnerc313c502003-09-11 19:51:54 +0000287 {
Werner Lemberg1c0b8e92003-10-23 04:54:14 +0000288 (FT_PsName_GetFunc)sfnt_get_ps_name
David Turnerc313c502003-09-11 19:51:54 +0000289 };
David Turner23bcde12001-10-17 13:48:10 +0000290
David Turnerc313c502003-09-11 19:51:54 +0000291
Werner Lemberg91a67472003-12-17 14:28:22 +0000292 /*
293 * TT CMAP INFO
294 *
295 */
296 static const FT_Service_TTCMapsRec tt_service_get_cmap_info =
297 {
298 (TT_CMap_Info_GetFunc)tt_get_cmap_info
299 };
300
David Turner89a2a4b2005-12-14 20:38:15 +0000301#ifdef TT_CONFIG_OPTION_BDF
302
303 static FT_Error
304 sfnt_get_charset_id( TT_Face face,
305 const char* *acharset_encoding,
306 const char* *acharset_registry )
307 {
308 BDF_PropertyRec encoding, registry;
309 FT_Error error;
310
311 /* XXX: I don't know if this is correct, since tt_face_find_bdf_prop
312 * will only return something correct if we have previously
313 * selected a size that is listed in the BDF table.
314 * should we change the BDF table format to include single
315 * offsets for "CHARSET_REGISTRY" and "CHARSET_ENCODING" ?
316 */
317 error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
318 if ( !error )
319 {
320 error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
321 if ( !error )
322 {
323 if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
324 encoding.type == BDF_PROPERTY_TYPE_ATOM )
325 {
326 *acharset_encoding = encoding.u.atom;
327 *acharset_registry = registry.u.atom;
328 }
329 else
330 error = FT_Err_Invalid_Argument;
331 }
332 }
333
334 return error;
335 }
336
337
338 static const FT_Service_BDFRec sfnt_service_bdf =
339 {
340 (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id,
341 (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop,
342 };
343
344#endif /* TT_CONFIG_OPTION_BDF */
345
David Turnerc313c502003-09-11 19:51:54 +0000346
347 /*
348 * SERVICE LIST
349 *
350 */
351
352 static const FT_ServiceDescRec sfnt_services[] =
353 {
Werner Lemberg82906bf2003-11-04 18:24:20 +0000354 { FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table },
Werner Lemberg40bb0962003-11-01 14:36:20 +0000355 { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name },
David Turnerc313c502003-09-11 19:51:54 +0000356#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
Werner Lemberg40bb0962003-11-01 14:36:20 +0000357 { FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict },
David Turner17dd0632003-09-21 16:04:05 +0000358#endif
David Turner89a2a4b2005-12-14 20:38:15 +0000359#ifdef TT_CONFIG_OPTION_BDF
360 { FT_SERVICE_ID_BDF, &sfnt_service_bdf },
361#endif
Werner Lemberg91a67472003-12-17 14:28:22 +0000362 { FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info },
David Turnerc313c502003-09-11 19:51:54 +0000363
364 { NULL, NULL }
David Turner17dd0632003-09-21 16:04:05 +0000365 };
Werner Lembergd060a752000-07-20 06:57:41 +0000366
David Turner6930b452000-07-19 17:13:03 +0000367
Werner Lemberg52005c32001-06-27 23:25:46 +0000368 FT_CALLBACK_DEF( FT_Module_Interface )
David Turnerb08fe2d2002-08-27 20:20:29 +0000369 sfnt_get_interface( FT_Module module,
Werner Lemberg5f0ee942002-04-30 06:37:52 +0000370 const char* module_interface )
David Turner2e421312000-05-26 22:13:17 +0000371 {
David Turnerc6a92202000-07-04 18:12:13 +0000372 FT_UNUSED( module );
David Turner2e421312000-05-26 22:13:17 +0000373
David Turnerc313c502003-09-11 19:51:54 +0000374 return ft_service_list_lookup( sfnt_services, module_interface );
David Turner2e421312000-05-26 22:13:17 +0000375 }
376
David Turnerd2b1f351999-12-16 23:11:37 +0000377
Werner Lemberga8bbc262000-07-01 14:06:46 +0000378 static
379 const SFNT_Interface sfnt_interface =
David Turnerd2b1f351999-12-16 23:11:37 +0000380 {
David Turnerb08fe2d2002-08-27 20:20:29 +0000381 tt_face_goto_table,
David Turnere49ab252000-05-16 23:44:38 +0000382
David Turnerb08fe2d2002-08-27 20:20:29 +0000383 sfnt_init_face,
384 sfnt_load_face,
385 sfnt_done_face,
386 sfnt_get_interface,
David Turner2e421312000-05-26 22:13:17 +0000387
David Turnerb08fe2d2002-08-27 20:20:29 +0000388 tt_face_load_any,
389 tt_face_load_sfnt_header,
390 tt_face_load_directory,
David Turnerd2b1f351999-12-16 23:11:37 +0000391
David Turnerb08fe2d2002-08-27 20:20:29 +0000392 tt_face_load_header,
393 tt_face_load_metrics_header,
394 tt_face_load_cmap,
395 tt_face_load_max_profile,
396 tt_face_load_os2,
397 tt_face_load_postscript,
David Turnerd2b1f351999-12-16 23:11:37 +0000398
David Turnerb08fe2d2002-08-27 20:20:29 +0000399 tt_face_load_names,
400 tt_face_free_names,
David Turnerd2b1f351999-12-16 23:11:37 +0000401
David Turnerb08fe2d2002-08-27 20:20:29 +0000402 tt_face_load_hdmx,
403 tt_face_free_hdmx,
David Turnerd2b1f351999-12-16 23:11:37 +0000404
David Turnerb08fe2d2002-08-27 20:20:29 +0000405 tt_face_load_kern,
406 tt_face_load_gasp,
407 tt_face_load_pclt,
David Turnerd2b1f351999-12-16 23:11:37 +0000408
409#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
Werner Lemberga8bbc262000-07-01 14:06:46 +0000410
Werner Lemberg4b680072000-11-07 06:30:29 +0000411 /* see `ttload.h' */
David Turnerb08fe2d2002-08-27 20:20:29 +0000412 tt_face_load_bitmap_header,
David Turnerf96594f2000-11-06 23:07:51 +0000413
Werner Lembergdeadbb52004-04-13 21:08:17 +0000414 /* see `ttsbit.h' and `sfnt.h' */
David Turnerb08fe2d2002-08-27 20:20:29 +0000415 tt_face_set_sbit_strike,
416 tt_face_load_sbit_strikes,
Werner Lembergb2d65d72005-08-03 21:21:11 +0000417#ifdef FT_OPTIMIZE_MEMORY
418 0,
419 0,
420#else
421 tt_find_sbit_image,
422 tt_load_sbit_metrics,
423#endif
David Turnerb08fe2d2002-08-27 20:20:29 +0000424 tt_face_load_sbit_image,
425 tt_face_free_sbit_strikes,
Werner Lemberga8bbc262000-07-01 14:06:46 +0000426
Werner Lemberg4e6dd852000-06-05 05:26:15 +0000427#else /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
Werner Lemberga8bbc262000-07-01 14:06:46 +0000428
David Turnerd2b1f351999-12-16 23:11:37 +0000429 0,
430 0,
431 0,
David Turner6a487b52005-02-28 22:09:07 +0000432 0,
433 0,
David Turnerf96594f2000-11-06 23:07:51 +0000434 0,
435 0,
Werner Lemberga8bbc262000-07-01 14:06:46 +0000436
Werner Lemberg4e6dd852000-06-05 05:26:15 +0000437#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
David Turnere49ab252000-05-16 23:44:38 +0000438
David Turnere5680272005-02-26 00:12:04 +0000439 /* see `ttkern.h' */
440 tt_face_get_kerning,
441
Werner Lemberg43b057b2005-10-26 18:37:40 +0000442#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
443
Werner Lemberg4e6dd852000-06-05 05:26:15 +0000444 /* see `ttpost.h' */
David Turnerb08fe2d2002-08-27 20:20:29 +0000445 tt_face_get_ps_name,
446 tt_face_free_ps_names,
Werner Lemberga8bbc262000-07-01 14:06:46 +0000447
Werner Lemberg4e6dd852000-06-05 05:26:15 +0000448#else /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
Werner Lemberga8bbc262000-07-01 14:06:46 +0000449
David Turnerd2b1f351999-12-16 23:11:37 +0000450 0,
451 0,
Werner Lemberga8bbc262000-07-01 14:06:46 +0000452
Werner Lemberg4e6dd852000-06-05 05:26:15 +0000453#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
David Turnerd2b1f351999-12-16 23:11:37 +0000454
David Turnerd2b1f351999-12-16 23:11:37 +0000455 };
David Turnere49ab252000-05-16 23:44:38 +0000456
David Turnerd2b1f351999-12-16 23:11:37 +0000457
David Turner76a5f622000-11-04 01:55:49 +0000458 FT_CALLBACK_TABLE_DEF
459 const FT_Module_Class sfnt_module_class =
David Turnerd2b1f351999-12-16 23:11:37 +0000460 {
David Turnerf0df85b2000-06-22 00:17:42 +0000461 0, /* not a font driver or renderer */
462 sizeof( FT_ModuleRec ),
Werner Lembergfbeb41d2000-07-02 00:27:53 +0000463
David Turnerf0df85b2000-06-22 00:17:42 +0000464 "sfnt", /* driver name */
Werner Lemberga929ba92000-06-25 06:47:11 +0000465 0x10000L, /* driver version 1.0 */
466 0x20000L, /* driver requires FreeType 2.0 or higher */
Werner Lembergfbeb41d2000-07-02 00:27:53 +0000467
David Turnerf0df85b2000-06-22 00:17:42 +0000468 (const void*)&sfnt_interface, /* module specific interface */
Werner Lembergfbeb41d2000-07-02 00:27:53 +0000469
Werner Lemberga929ba92000-06-25 06:47:11 +0000470 (FT_Module_Constructor)0,
471 (FT_Module_Destructor) 0,
David Turnerb08fe2d2002-08-27 20:20:29 +0000472 (FT_Module_Requester) sfnt_get_interface
David Turnerd2b1f351999-12-16 23:11:37 +0000473 };
Werner Lembergfbeb41d2000-07-02 00:27:53 +0000474
David Turnerd2b1f351999-12-16 23:11:37 +0000475
Werner Lemberg4e6dd852000-06-05 05:26:15 +0000476/* END */