blob: a832ee00023528c4bd4a28e8631d9b21fbcb9d77 [file] [log] [blame]
Werner Lemberg7fa51b52000-07-08 19:51:42 +00001/***************************************************************************/
2/* */
Werner Lembergb5084e12000-10-28 17:10:06 +00003/* t1objs.c */
Werner Lemberg7fa51b52000-07-08 19:51:42 +00004/* */
Werner Lembergb5084e12000-10-28 17:10:06 +00005/* Type 1 objects manager (body). */
Werner Lemberg7fa51b52000-07-08 19:51:42 +00006/* */
Werner Lemberg9472e232004-02-14 19:21:37 +00007/* Copyright 1996-2001, 2002, 2003, 2004 by */
Werner Lemberg7fa51b52000-07-08 19:51:42 +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_DEBUG_H
21#include FT_INTERNAL_STREAM_H
Werner Lemberg8f963be2003-12-18 15:29:20 +000022#include FT_TRUETYPE_IDS_H
Werner Lembergcc069be2000-12-08 16:17:16 +000023
David Turner8d3a4012001-03-20 11:14:24 +000024#include "t1gload.h"
25#include "t1load.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000026
Werner Lemberg1f7f0e82001-06-06 17:30:41 +000027#include "t1errors.h"
28
Werner Lembergf1ca2342000-11-29 15:18:54 +000029#ifndef T1_CONFIG_OPTION_NO_AFM
David Turner8d3a4012001-03-20 11:14:24 +000030#include "t1afm.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000031#endif
Werner Lemberg7fa51b52000-07-08 19:51:42 +000032
David Turner77605952003-10-29 21:43:52 +000033#include FT_SERVICE_POSTSCRIPT_CMAPS_H
David Turner19ed8af2000-12-08 02:42:29 +000034#include FT_INTERNAL_POSTSCRIPT_AUX_H
David Turner2dfb5ac2000-01-27 14:02:04 +000035
David Turner2dfb5ac2000-01-27 14:02:04 +000036
Werner Lemberg7fa51b52000-07-08 19:51:42 +000037 /*************************************************************************/
38 /* */
39 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
40 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
41 /* messages during execution. */
42 /* */
43#undef FT_COMPONENT
Werner Lembergb5084e12000-10-28 17:10:06 +000044#define FT_COMPONENT trace_t1objs
David Turner2dfb5ac2000-01-27 14:02:04 +000045
David Turner2dfb5ac2000-01-27 14:02:04 +000046
Werner Lemberg7fa51b52000-07-08 19:51:42 +000047 /*************************************************************************/
48 /* */
Werner Lembergc3b21602001-12-05 01:22:05 +000049 /* SIZE FUNCTIONS */
David Turner5893c1b2001-10-18 11:49:26 +000050 /* */
51 /* note that we store the global hints in the size's "internal" root */
Werner Lembergc3b21602001-12-05 01:22:05 +000052 /* field */
David Turner5893c1b2001-10-18 11:49:26 +000053 /* */
54 /*************************************************************************/
55
Werner Lembergc3b21602001-12-05 01:22:05 +000056
David Turner5893c1b2001-10-18 11:49:26 +000057 static PSH_Globals_Funcs
58 T1_Size_Get_Globals_Funcs( T1_Size size )
59 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +000060 T1_Face face = (T1_Face)size->root.face;
61 PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
62 FT_Module module;
Werner Lemberg66b35092002-02-10 12:33:14 +000063
Werner Lembergc3b21602001-12-05 01:22:05 +000064
65 module = FT_Get_Module( size->root.face->driver->root.library,
66 "pshinter" );
David Turner5893c1b2001-10-18 11:49:26 +000067 return ( module && pshinter && pshinter->get_globals_funcs )
68 ? pshinter->get_globals_funcs( module )
69 : 0 ;
70 }
71
72
David Turnerbc82f1b2002-03-01 02:26:22 +000073 FT_LOCAL_DEF( void )
Werner Lembergc3b21602001-12-05 01:22:05 +000074 T1_Size_Done( T1_Size size )
David Turner5893c1b2001-10-18 11:49:26 +000075 {
76 if ( size->root.internal )
77 {
Werner Lembergc3b21602001-12-05 01:22:05 +000078 PSH_Globals_Funcs funcs;
Werner Lemberg66b35092002-02-10 12:33:14 +000079
Werner Lembergc3b21602001-12-05 01:22:05 +000080
81 funcs = T1_Size_Get_Globals_Funcs( size );
82 if ( funcs )
83 funcs->destroy( (PSH_Globals)size->root.internal );
David Turner5893c1b2001-10-18 11:49:26 +000084
85 size->root.internal = 0;
86 }
87 }
88
89
David Turnerbc82f1b2002-03-01 02:26:22 +000090 FT_LOCAL_DEF( FT_Error )
Werner Lembergc3b21602001-12-05 01:22:05 +000091 T1_Size_Init( T1_Size size )
David Turner5893c1b2001-10-18 11:49:26 +000092 {
93 FT_Error error = 0;
94 PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
Werner Lemberg66b35092002-02-10 12:33:14 +000095
Werner Lembergc3b21602001-12-05 01:22:05 +000096
David Turner5893c1b2001-10-18 11:49:26 +000097 if ( funcs )
98 {
Werner Lembergc3b21602001-12-05 01:22:05 +000099 PSH_Globals globals;
100 T1_Face face = (T1_Face)size->root.face;
Werner Lembergc3b21602001-12-05 01:22:05 +0000101
Werner Lemberg66b35092002-02-10 12:33:14 +0000102
103 error = funcs->create( size->root.face->memory,
David Turner5893c1b2001-10-18 11:49:26 +0000104 &face->type1.private_dict, &globals );
Werner Lembergc3b21602001-12-05 01:22:05 +0000105 if ( !error )
106 size->root.internal = (FT_Size_Internal)(void*)globals;
David Turner5893c1b2001-10-18 11:49:26 +0000107 }
Werner Lemberg66b35092002-02-10 12:33:14 +0000108
David Turner5893c1b2001-10-18 11:49:26 +0000109 return error;
110 }
111
112
David Turnerbc82f1b2002-03-01 02:26:22 +0000113 FT_LOCAL_DEF( FT_Error )
Werner Lembergc3b21602001-12-05 01:22:05 +0000114 T1_Size_Reset( T1_Size size )
David Turner5893c1b2001-10-18 11:49:26 +0000115 {
Werner Lembergc3b21602001-12-05 01:22:05 +0000116 PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
David Turner5893c1b2001-10-18 11:49:26 +0000117 FT_Error error = 0;
Werner Lembergc3b21602001-12-05 01:22:05 +0000118
Werner Lemberg66b35092002-02-10 12:33:14 +0000119
Werner Lembergc3b21602001-12-05 01:22:05 +0000120 if ( funcs )
121 error = funcs->set_scale( (PSH_Globals)size->root.internal,
Werner Lembergb5e8c902003-07-03 13:56:28 +0000122 size->root.metrics.x_scale,
123 size->root.metrics.y_scale,
124 0, 0 );
David Turner3a664fc2001-12-21 15:26:19 +0000125 return error;
David Turner5893c1b2001-10-18 11:49:26 +0000126 }
127
128
129 /*************************************************************************/
130 /* */
131 /* SLOT FUNCTIONS */
132 /* */
133 /*************************************************************************/
134
David Turnerbc82f1b2002-03-01 02:26:22 +0000135 FT_LOCAL_DEF( void )
David Turner5893c1b2001-10-18 11:49:26 +0000136 T1_GlyphSlot_Done( T1_GlyphSlot slot )
137 {
138 slot->root.internal->glyph_hints = 0;
139 }
140
141
David Turnerbc82f1b2002-03-01 02:26:22 +0000142 FT_LOCAL_DEF( FT_Error )
Werner Lembergefa99612002-04-01 22:01:46 +0000143 T1_GlyphSlot_Init( T1_GlyphSlot slot )
Werner Lemberg66b35092002-02-10 12:33:14 +0000144 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000145 T1_Face face;
David Turner4e7eeee2002-02-28 16:10:29 +0000146 PSHinter_Service pshinter;
Werner Lemberg66b35092002-02-10 12:33:14 +0000147
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000148
149 face = (T1_Face)slot->root.face;
150 pshinter = (PSHinter_Service)face->pshinter;
151
152 if ( pshinter )
David Turner5893c1b2001-10-18 11:49:26 +0000153 {
154 FT_Module module;
Werner Lemberg66b35092002-02-10 12:33:14 +0000155
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000156
David Turner5893c1b2001-10-18 11:49:26 +0000157 module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
158 if (module)
159 {
160 T1_Hints_Funcs funcs;
Werner Lemberg66b35092002-02-10 12:33:14 +0000161
David Turner5893c1b2001-10-18 11:49:26 +0000162 funcs = pshinter->get_t1_funcs( module );
163 slot->root.internal->glyph_hints = (void*)funcs;
164 }
165 }
166 return 0;
167 }
Werner Lemberg66b35092002-02-10 12:33:14 +0000168
169
David Turner5893c1b2001-10-18 11:49:26 +0000170 /*************************************************************************/
171 /* */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000172 /* FACE FUNCTIONS */
173 /* */
174 /*************************************************************************/
175
176
177 /*************************************************************************/
178 /* */
179 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000180 /* T1_Face_Done */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000181 /* */
182 /* <Description> */
183 /* The face object destructor. */
184 /* */
185 /* <Input> */
186 /* face :: A typeless pointer to the face object to destroy. */
187 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000188 FT_LOCAL_DEF( void )
Werner Lembergc3b21602001-12-05 01:22:05 +0000189 T1_Face_Done( T1_Face face )
David Turner2dfb5ac2000-01-27 14:02:04 +0000190 {
191 FT_Memory memory;
Werner Lembergefa99612002-04-01 22:01:46 +0000192 T1_Font type1 = &face->type1;
David Turner2dfb5ac2000-01-27 14:02:04 +0000193
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000194
195 if ( face )
David Turner2dfb5ac2000-01-27 14:02:04 +0000196 {
197 memory = face->root.memory;
David Turner4d3e5632000-05-05 12:33:23 +0000198
Werner Lembergb5084e12000-10-28 17:10:06 +0000199#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
David Turner7c388ba2000-05-26 02:07:40 +0000200 /* release multiple masters information */
Werner Lembergb5084e12000-10-28 17:10:06 +0000201 T1_Done_Blend( face );
David Turner7c388ba2000-05-26 02:07:40 +0000202 face->blend = 0;
203#endif
204
David Turnere49ab252000-05-16 23:44:38 +0000205 /* release font info strings */
David Turner4d3e5632000-05-05 12:33:23 +0000206 {
Werner Lembergefa99612002-04-01 22:01:46 +0000207 PS_FontInfo info = &type1->font_info;
David Turnere49ab252000-05-16 23:44:38 +0000208
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000209
David Turnere459d742002-03-22 13:52:37 +0000210 FT_FREE( info->version );
211 FT_FREE( info->notice );
212 FT_FREE( info->full_name );
213 FT_FREE( info->family_name );
214 FT_FREE( info->weight );
David Turner4d3e5632000-05-05 12:33:23 +0000215 }
216
David Turnere49ab252000-05-16 23:44:38 +0000217 /* release top dictionary */
David Turnere459d742002-03-22 13:52:37 +0000218 FT_FREE( type1->charstrings_len );
219 FT_FREE( type1->charstrings );
220 FT_FREE( type1->glyph_names );
David Turner4d3e5632000-05-05 12:33:23 +0000221
David Turnere459d742002-03-22 13:52:37 +0000222 FT_FREE( type1->subrs );
223 FT_FREE( type1->subrs_len );
David Turnere49ab252000-05-16 23:44:38 +0000224
David Turnere459d742002-03-22 13:52:37 +0000225 FT_FREE( type1->subrs_block );
226 FT_FREE( type1->charstrings_block );
227 FT_FREE( type1->glyph_names_block );
David Turner4d3e5632000-05-05 12:33:23 +0000228
David Turnere459d742002-03-22 13:52:37 +0000229 FT_FREE( type1->encoding.char_index );
230 FT_FREE( type1->encoding.char_name );
231 FT_FREE( type1->font_name );
David Turnere49ab252000-05-16 23:44:38 +0000232
Werner Lembergb5084e12000-10-28 17:10:06 +0000233#ifndef T1_CONFIG_OPTION_NO_AFM
David Turner4d3e5632000-05-05 12:33:23 +0000234 /* release afm data if present */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000235 if ( face->afm_data )
Werner Lembergb5084e12000-10-28 17:10:06 +0000236 T1_Done_AFM( memory, (T1_AFM*)face->afm_data );
David Turner4d3e5632000-05-05 12:33:23 +0000237#endif
238
239 /* release unicode map, if any */
David Turnere459d742002-03-22 13:52:37 +0000240 FT_FREE( face->unicode_map.maps );
David Turner4d3e5632000-05-05 12:33:23 +0000241 face->unicode_map.num_maps = 0;
242
243 face->root.family_name = 0;
244 face->root.style_name = 0;
David Turner2dfb5ac2000-01-27 14:02:04 +0000245 }
246 }
247
David Turner2dfb5ac2000-01-27 14:02:04 +0000248
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000249 /*************************************************************************/
250 /* */
251 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000252 /* T1_Face_Init */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000253 /* */
254 /* <Description> */
255 /* The face object constructor. */
256 /* */
257 /* <Input> */
258 /* stream :: input stream where to load font data. */
259 /* */
260 /* face_index :: The index of the font face in the resource. */
261 /* */
262 /* num_params :: Number of additional generic parameters. Ignored. */
263 /* */
264 /* params :: Additional generic parameters. Ignored. */
265 /* */
266 /* <InOut> */
267 /* face :: The face record to build. */
268 /* */
269 /* <Return> */
270 /* FreeType error code. 0 means success. */
271 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000272 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000273 T1_Face_Init( FT_Stream stream,
Werner Lemberg4a2305c2001-06-28 07:17:51 +0000274 T1_Face face,
275 FT_Int face_index,
276 FT_Int num_params,
277 FT_Parameter* params )
David Turner2dfb5ac2000-01-27 14:02:04 +0000278 {
Werner Lemberg40bb0962003-11-01 14:36:20 +0000279 FT_Error error;
David Turner77605952003-10-29 21:43:52 +0000280 FT_Service_PsCMaps psnames;
Werner Lemberg40bb0962003-11-01 14:36:20 +0000281 PSAux_Service psaux;
282 T1_Font type1 = &face->type1;
283 PS_FontInfo info = &type1->font_info;
David Turner2dfb5ac2000-01-27 14:02:04 +0000284
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000285 FT_UNUSED( num_params );
286 FT_UNUSED( params );
287 FT_UNUSED( face_index );
288 FT_UNUSED( stream );
289
David Turner2dfb5ac2000-01-27 14:02:04 +0000290
291 face->root.num_faces = 1;
292
David Turner77605952003-10-29 21:43:52 +0000293 FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
David Turnerb72d8a82003-09-29 20:33:37 +0000294 face->psnames = psnames;
David Turner95bec282000-02-15 12:55:57 +0000295
Werner Lemberg1305f262002-03-28 08:07:16 +0000296 face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
297 "psaux" );
298 psaux = (PSAux_Service)face->psaux;
David Turnerc3128612000-06-23 05:02:13 +0000299
Werner Lemberg1305f262002-03-28 08:07:16 +0000300 face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
301 "pshinter" );
David Turner97488072000-08-22 22:36:33 +0000302
Werner Lembergfdc042b2003-06-12 04:59:07 +0000303 /* open the tokenizer; this will also check the font format */
Werner Lembergb5084e12000-10-28 17:10:06 +0000304 error = T1_Open_Face( face );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000305 if ( error )
306 goto Exit;
David Turner2dfb5ac2000-01-27 14:02:04 +0000307
308 /* if we just wanted to check the format, leave successfully now */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000309 if ( face_index < 0 )
David Turner2dfb5ac2000-01-27 14:02:04 +0000310 goto Exit;
311
312 /* check the face index */
313 if ( face_index != 0 )
314 {
David Turner5893c1b2001-10-18 11:49:26 +0000315 FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
David Turner2dfb5ac2000-01-27 14:02:04 +0000316 error = T1_Err_Invalid_Argument;
317 goto Exit;
318 }
319
Werner Lembergfdc042b2003-06-12 04:59:07 +0000320 /* now load the font program into the face object */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000321
Werner Lembergfdc042b2003-06-12 04:59:07 +0000322 /* initialize the face object fields */
323
324 /* set up root face fields */
David Turner2dfb5ac2000-01-27 14:02:04 +0000325 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000326 FT_Face root = (FT_Face)&face->root;
327
328
Werner Lemberg65ba7242003-05-30 09:12:50 +0000329 root->num_glyphs = type1->num_glyphs;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000330 root->face_index = face_index;
Werner Lembergbd889e52002-05-12 19:59:17 +0000331
Werner Lembergfdc042b2003-06-12 04:59:07 +0000332 root->face_flags = FT_FACE_FLAG_SCALABLE;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000333 root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
David Turner6930b452000-07-19 17:13:03 +0000334 root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
335
Werner Lemberg64f1ba92003-07-25 22:09:53 +0000336 if ( info->is_fixed_pitch )
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000337 root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
338
339 if ( face->blend )
340 root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
341
342 /* XXX: TODO -- add kerning with .afm support */
343
344 /* get style name -- be careful, some broken fonts only */
345 /* have a `/FontName' dictionary entry! */
Werner Lemberg65ba7242003-05-30 09:12:50 +0000346 root->family_name = info->family_name;
Werner Lemberg64591b72003-06-01 21:30:04 +0000347 /* assume "Regular" style if we don't know better */
348 root->style_name = (char *)"Regular";
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000349 if ( root->family_name )
David Turner2dfb5ac2000-01-27 14:02:04 +0000350 {
Werner Lemberg65ba7242003-05-30 09:12:50 +0000351 char* full = info->full_name;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000352 char* family = root->family_name;
David Turnere49ab252000-05-16 23:44:38 +0000353
Werner Lembergefa99612002-04-01 22:01:46 +0000354
David Turner662b3442002-01-03 16:56:59 +0000355 if ( full )
David Turner2dfb5ac2000-01-27 14:02:04 +0000356 {
Werner Lemberg64591b72003-06-01 21:30:04 +0000357 while ( *full )
David Turner662b3442002-01-03 16:56:59 +0000358 {
Werner Lemberg64591b72003-06-01 21:30:04 +0000359 if ( *full == *family )
360 {
361 family++;
362 full++;
363 }
364 else
365 {
366 if ( *full == ' ' || *full == '-' )
367 full++;
368 else if ( *family == ' ' || *family == '-' )
369 family++;
370 else
371 {
372 if ( !*family )
373 root->style_name = full;
374 break;
375 }
376 }
David Turner662b3442002-01-03 16:56:59 +0000377 }
David Turner2dfb5ac2000-01-27 14:02:04 +0000378 }
David Turner2dfb5ac2000-01-27 14:02:04 +0000379 }
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000380 else
381 {
382 /* do we have a `/FontName'? */
Werner Lemberg65ba7242003-05-30 09:12:50 +0000383 if ( type1->font_name )
Werner Lemberg65ba7242003-05-30 09:12:50 +0000384 root->family_name = type1->font_name;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000385 }
386
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000387 /* compute style flags */
388 root->style_flags = 0;
Werner Lemberg64f1ba92003-07-25 22:09:53 +0000389 if ( info->italic_angle )
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000390 root->style_flags |= FT_STYLE_FLAG_ITALIC;
Werner Lemberg65ba7242003-05-30 09:12:50 +0000391 if ( info->weight )
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000392 {
Werner Lemberg65ba7242003-05-30 09:12:50 +0000393 if ( !ft_strcmp( info->weight, "Bold" ) ||
394 !ft_strcmp( info->weight, "Black" ) )
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000395 root->style_flags |= FT_STYLE_FLAG_BOLD;
396 }
397
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000398 /* no embedded bitmap support */
399 root->num_fixed_sizes = 0;
400 root->available_sizes = 0;
401
Werner Lemberg65ba7242003-05-30 09:12:50 +0000402 root->bbox.xMin = type1->font_bbox.xMin >> 16;
403 root->bbox.yMin = type1->font_bbox.yMin >> 16;
404 root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFFU ) >> 16;
405 root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFFU ) >> 16;
Tom Kacvinsky7b91bea2001-02-07 01:14:53 +0000406
407 /* Set units_per_EM if we didn't set it in parse_font_matrix. */
408 if ( !root->units_per_EM )
409 root->units_per_EM = 1000;
410
David Turneracfea4d2002-03-06 12:38:15 +0000411 root->ascender = (FT_Short)( root->bbox.yMax );
412 root->descender = (FT_Short)( root->bbox.yMin );
Werner Lemberg8eb03532001-06-19 23:03:41 +0000413 root->height = (FT_Short)(
Werner Lembergfdc042b2003-06-12 04:59:07 +0000414 ( ( root->ascender - root->descender ) * 12 ) / 10 );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000415
416 /* now compute the maximum advance width */
Werner Lemberg521a2d72001-03-20 22:58:56 +0000417 root->max_advance_width =
David Turneracfea4d2002-03-06 12:38:15 +0000418 (FT_Short)( root->bbox.xMax );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000419 {
Werner Lemberg73861972003-06-05 04:31:05 +0000420 FT_Pos max_advance;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000421
422
Werner Lembergb5084e12000-10-28 17:10:06 +0000423 error = T1_Compute_Max_Advance( face, &max_advance );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000424
425 /* in case of error, keep the standard width */
426 if ( !error )
David Turner8edbcab2001-06-19 08:28:24 +0000427 root->max_advance_width = (FT_Short)max_advance;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000428 else
429 error = 0; /* clear error */
430 }
431
432 root->max_advance_height = root->height;
433
Werner Lemberg9472e232004-02-14 19:21:37 +0000434 root->underline_position = (FT_Short)info->underline_position;
435 root->underline_thickness = (FT_Short)info->underline_thickness;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000436
David Turner54e75742000-11-04 02:52:02 +0000437 root->internal->max_points = 0;
438 root->internal->max_contours = 0;
David Turner2dfb5ac2000-01-27 14:02:04 +0000439 }
440
David Turnerfa77c872002-03-22 15:56:12 +0000441 {
Werner Lembergefa99612002-04-01 22:01:46 +0000442 FT_Face root = &face->root;
Werner Lembergbd889e52002-05-12 19:59:17 +0000443
Werner Lembergefa99612002-04-01 22:01:46 +0000444
David Turnerfa77c872002-03-22 15:56:12 +0000445 if ( psnames && psaux )
446 {
447 FT_CharMapRec charmap;
David Turnered54f282002-03-22 17:09:52 +0000448 T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes;
David Turnerfa77c872002-03-22 15:56:12 +0000449 FT_CMap_Class clazz;
Werner Lembergbd889e52002-05-12 19:59:17 +0000450
Werner Lembergefa99612002-04-01 22:01:46 +0000451
David Turnerfa77c872002-03-22 15:56:12 +0000452 charmap.face = root;
Werner Lembergbd889e52002-05-12 19:59:17 +0000453
David Turnerfa77c872002-03-22 15:56:12 +0000454 /* first of all, try to synthetize a Unicode charmap */
455 charmap.platform_id = 3;
456 charmap.encoding_id = 1;
David Turnerb08fe2d2002-08-27 20:20:29 +0000457 charmap.encoding = FT_ENCODING_UNICODE;
Werner Lembergbd889e52002-05-12 19:59:17 +0000458
David Turnered54f282002-03-22 17:09:52 +0000459 FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
Werner Lembergbd889e52002-05-12 19:59:17 +0000460
David Turnerfa77c872002-03-22 15:56:12 +0000461 /* now, generate an Adobe Standard encoding when appropriate */
462 charmap.platform_id = 7;
463 clazz = NULL;
Werner Lembergbd889e52002-05-12 19:59:17 +0000464
Werner Lemberg65ba7242003-05-30 09:12:50 +0000465 switch ( type1->encoding_type )
David Turnerfa77c872002-03-22 15:56:12 +0000466 {
Werner Lembergefa99612002-04-01 22:01:46 +0000467 case T1_ENCODING_TYPE_STANDARD:
David Turnerb08fe2d2002-08-27 20:20:29 +0000468 charmap.encoding = FT_ENCODING_ADOBE_STANDARD;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000469 charmap.encoding_id = TT_ADOBE_ID_STANDARD;
Werner Lembergefa99612002-04-01 22:01:46 +0000470 clazz = cmap_classes->standard;
471 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000472
473 case T1_ENCODING_TYPE_EXPERT:
David Turnerb08fe2d2002-08-27 20:20:29 +0000474 charmap.encoding = FT_ENCODING_ADOBE_EXPERT;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000475 charmap.encoding_id = TT_ADOBE_ID_EXPERT;
Werner Lembergefa99612002-04-01 22:01:46 +0000476 clazz = cmap_classes->expert;
477 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000478
Werner Lembergefa99612002-04-01 22:01:46 +0000479 case T1_ENCODING_TYPE_ARRAY:
David Turnerb08fe2d2002-08-27 20:20:29 +0000480 charmap.encoding = FT_ENCODING_ADOBE_CUSTOM;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000481 charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
Werner Lembergefa99612002-04-01 22:01:46 +0000482 clazz = cmap_classes->custom;
483 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000484
Werner Lembergefa99612002-04-01 22:01:46 +0000485 case T1_ENCODING_TYPE_ISOLATIN1:
David Turnerb08fe2d2002-08-27 20:20:29 +0000486 charmap.encoding = FT_ENCODING_ADOBE_LATIN_1;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000487 charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
Werner Lembergefa99612002-04-01 22:01:46 +0000488 clazz = cmap_classes->unicode;
489 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000490
Werner Lembergefa99612002-04-01 22:01:46 +0000491 default:
492 ;
David Turnerfa77c872002-03-22 15:56:12 +0000493 }
Werner Lembergbd889e52002-05-12 19:59:17 +0000494
David Turnerfa77c872002-03-22 15:56:12 +0000495 if ( clazz )
David Turnered54f282002-03-22 17:09:52 +0000496 FT_CMap_New( clazz, NULL, &charmap, NULL );
Werner Lemberg0bb4a0f2002-06-19 15:57:55 +0000497
David Turnerfed59b72002-07-17 22:51:06 +0000498#if 0
Werner Lemberg0bb4a0f2002-06-19 15:57:55 +0000499 /* Select default charmap */
500 if (root->num_charmaps)
501 root->charmap = root->charmaps[0];
David Turnerfed59b72002-07-17 22:51:06 +0000502#endif
David Turnerfa77c872002-03-22 15:56:12 +0000503 }
504 }
505
David Turner2dfb5ac2000-01-27 14:02:04 +0000506 Exit:
507 return error;
508 }
509
510
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000511 /*************************************************************************/
512 /* */
513 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000514 /* T1_Driver_Init */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000515 /* */
516 /* <Description> */
517 /* Initializes a given Type 1 driver object. */
518 /* */
519 /* <Input> */
520 /* driver :: A handle to the target driver object. */
521 /* */
522 /* <Return> */
523 /* FreeType error code. 0 means success. */
524 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000525 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000526 T1_Driver_Init( T1_Driver driver )
David Turner2dfb5ac2000-01-27 14:02:04 +0000527 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000528 FT_UNUSED( driver );
529
David Turner2dfb5ac2000-01-27 14:02:04 +0000530 return T1_Err_Ok;
531 }
532
533
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000534 /*************************************************************************/
535 /* */
536 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000537 /* T1_Driver_Done */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000538 /* */
539 /* <Description> */
540 /* Finalizes a given Type 1 driver. */
541 /* */
542 /* <Input> */
Werner Lembergefa99612002-04-01 22:01:46 +0000543 /* driver :: A handle to the target Type 1 driver. */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000544 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000545 FT_LOCAL_DEF( void )
David Turner5893c1b2001-10-18 11:49:26 +0000546 T1_Driver_Done( T1_Driver driver )
David Turner2dfb5ac2000-01-27 14:02:04 +0000547 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000548 FT_UNUSED( driver );
David Turner2dfb5ac2000-01-27 14:02:04 +0000549 }
550
551
552/* END */