blob: bc3e2d4cee196974d58466e6efbf3b524b6d2858 [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 Lemberg85751172008-03-21 07:16:00 +00007/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 {
Werner Lembergd57a5e92008-06-18 06:16:39 +000093 FT_Error error = T1_Err_Ok;
David Turner5893c1b2001-10-18 11:49:26 +000094 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 )
Wu, Chia-I (吳佳一)bcc438b2006-01-23 14:12:40 +0000114 T1_Size_Request( T1_Size size,
115 FT_Size_Request req )
David Turner5893c1b2001-10-18 11:49:26 +0000116 {
Werner Lembergc3b21602001-12-05 01:22:05 +0000117 PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
David Turnercda2d952006-02-16 22:45:31 +0000118
119
Wu, Chia-I (吳佳一)bcc438b2006-01-23 14:12:40 +0000120 FT_Request_Metrics( size->root.face, req );
Werner Lemberg66b35092002-02-10 12:33:14 +0000121
Werner Lembergc3b21602001-12-05 01:22:05 +0000122 if ( funcs )
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000123 funcs->set_scale( (PSH_Globals)size->root.internal,
124 size->root.metrics.x_scale,
125 size->root.metrics.y_scale,
126 0, 0 );
127
128 return T1_Err_Ok;
David Turner5893c1b2001-10-18 11:49:26 +0000129 }
130
131
132 /*************************************************************************/
133 /* */
134 /* SLOT FUNCTIONS */
135 /* */
136 /*************************************************************************/
137
David Turnerbc82f1b2002-03-01 02:26:22 +0000138 FT_LOCAL_DEF( void )
David Turner5893c1b2001-10-18 11:49:26 +0000139 T1_GlyphSlot_Done( T1_GlyphSlot slot )
140 {
141 slot->root.internal->glyph_hints = 0;
142 }
143
144
David Turnerbc82f1b2002-03-01 02:26:22 +0000145 FT_LOCAL_DEF( FT_Error )
Werner Lembergefa99612002-04-01 22:01:46 +0000146 T1_GlyphSlot_Init( T1_GlyphSlot slot )
Werner Lemberg66b35092002-02-10 12:33:14 +0000147 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000148 T1_Face face;
David Turner4e7eeee2002-02-28 16:10:29 +0000149 PSHinter_Service pshinter;
Werner Lemberg66b35092002-02-10 12:33:14 +0000150
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000151
152 face = (T1_Face)slot->root.face;
153 pshinter = (PSHinter_Service)face->pshinter;
154
155 if ( pshinter )
David Turner5893c1b2001-10-18 11:49:26 +0000156 {
157 FT_Module module;
Werner Lemberg66b35092002-02-10 12:33:14 +0000158
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000159
David Turner5893c1b2001-10-18 11:49:26 +0000160 module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
161 if (module)
162 {
163 T1_Hints_Funcs funcs;
Werner Lemberg66b35092002-02-10 12:33:14 +0000164
David Turner5893c1b2001-10-18 11:49:26 +0000165 funcs = pshinter->get_t1_funcs( module );
166 slot->root.internal->glyph_hints = (void*)funcs;
167 }
168 }
169 return 0;
170 }
Werner Lemberg66b35092002-02-10 12:33:14 +0000171
172
David Turner5893c1b2001-10-18 11:49:26 +0000173 /*************************************************************************/
174 /* */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000175 /* FACE FUNCTIONS */
176 /* */
177 /*************************************************************************/
178
179
180 /*************************************************************************/
181 /* */
182 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000183 /* T1_Face_Done */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000184 /* */
185 /* <Description> */
186 /* The face object destructor. */
187 /* */
188 /* <Input> */
189 /* face :: A typeless pointer to the face object to destroy. */
190 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000191 FT_LOCAL_DEF( void )
Werner Lembergc3b21602001-12-05 01:22:05 +0000192 T1_Face_Done( T1_Face face )
David Turner2dfb5ac2000-01-27 14:02:04 +0000193 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000194 if ( face )
David Turner2dfb5ac2000-01-27 14:02:04 +0000195 {
Werner Lemberg3d507fe2007-06-03 16:54:55 +0000196 FT_Memory memory = face->root.memory;
197 T1_Font type1 = &face->type1;
198
David Turner4d3e5632000-05-05 12:33:23 +0000199
Werner Lembergb5084e12000-10-28 17:10:06 +0000200#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
David Turner7c388ba2000-05-26 02:07:40 +0000201 /* release multiple masters information */
Werner Lemberga4d6a1c2006-07-19 09:54:56 +0000202 FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
203
204 if ( face->buildchar )
205 {
206 FT_FREE( face->buildchar );
207
208 face->buildchar = NULL;
209 face->len_buildchar = 0;
210 }
211
Werner Lembergb5084e12000-10-28 17:10:06 +0000212 T1_Done_Blend( face );
David Turner7c388ba2000-05-26 02:07:40 +0000213 face->blend = 0;
214#endif
215
David Turnere49ab252000-05-16 23:44:38 +0000216 /* release font info strings */
David Turner4d3e5632000-05-05 12:33:23 +0000217 {
Werner Lembergefa99612002-04-01 22:01:46 +0000218 PS_FontInfo info = &type1->font_info;
David Turnere49ab252000-05-16 23:44:38 +0000219
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000220
David Turnere459d742002-03-22 13:52:37 +0000221 FT_FREE( info->version );
222 FT_FREE( info->notice );
223 FT_FREE( info->full_name );
224 FT_FREE( info->family_name );
225 FT_FREE( info->weight );
David Turner4d3e5632000-05-05 12:33:23 +0000226 }
227
David Turnere49ab252000-05-16 23:44:38 +0000228 /* release top dictionary */
David Turnere459d742002-03-22 13:52:37 +0000229 FT_FREE( type1->charstrings_len );
230 FT_FREE( type1->charstrings );
231 FT_FREE( type1->glyph_names );
David Turner4d3e5632000-05-05 12:33:23 +0000232
David Turnere459d742002-03-22 13:52:37 +0000233 FT_FREE( type1->subrs );
234 FT_FREE( type1->subrs_len );
David Turnere49ab252000-05-16 23:44:38 +0000235
David Turnere459d742002-03-22 13:52:37 +0000236 FT_FREE( type1->subrs_block );
237 FT_FREE( type1->charstrings_block );
238 FT_FREE( type1->glyph_names_block );
David Turner4d3e5632000-05-05 12:33:23 +0000239
David Turnere459d742002-03-22 13:52:37 +0000240 FT_FREE( type1->encoding.char_index );
241 FT_FREE( type1->encoding.char_name );
242 FT_FREE( type1->font_name );
David Turnere49ab252000-05-16 23:44:38 +0000243
Werner Lembergb5084e12000-10-28 17:10:06 +0000244#ifndef T1_CONFIG_OPTION_NO_AFM
David Turner4d3e5632000-05-05 12:33:23 +0000245 /* release afm data if present */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000246 if ( face->afm_data )
Wu, Chia-I (吳佳一)108fdbb2006-01-16 15:35:56 +0000247 T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
David Turner4d3e5632000-05-05 12:33:23 +0000248#endif
249
250 /* release unicode map, if any */
David Turnercda2d952006-02-16 22:45:31 +0000251#if 0
252 FT_FREE( face->unicode_map_rec.maps );
253 face->unicode_map_rec.num_maps = 0;
254 face->unicode_map = NULL;
255#endif
David Turner4d3e5632000-05-05 12:33:23 +0000256
Werner Lembergd57a5e92008-06-18 06:16:39 +0000257 face->root.family_name = NULL;
258 face->root.style_name = NULL;
David Turner2dfb5ac2000-01-27 14:02:04 +0000259 }
260 }
261
David Turner2dfb5ac2000-01-27 14:02:04 +0000262
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000263 /*************************************************************************/
264 /* */
265 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000266 /* T1_Face_Init */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000267 /* */
268 /* <Description> */
269 /* The face object constructor. */
270 /* */
271 /* <Input> */
272 /* stream :: input stream where to load font data. */
273 /* */
274 /* face_index :: The index of the font face in the resource. */
275 /* */
276 /* num_params :: Number of additional generic parameters. Ignored. */
277 /* */
278 /* params :: Additional generic parameters. Ignored. */
279 /* */
280 /* <InOut> */
281 /* face :: The face record to build. */
282 /* */
283 /* <Return> */
284 /* FreeType error code. 0 means success. */
285 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000286 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000287 T1_Face_Init( FT_Stream stream,
Werner Lemberg4a2305c2001-06-28 07:17:51 +0000288 T1_Face face,
289 FT_Int face_index,
290 FT_Int num_params,
291 FT_Parameter* params )
David Turner2dfb5ac2000-01-27 14:02:04 +0000292 {
Werner Lemberg40bb0962003-11-01 14:36:20 +0000293 FT_Error error;
David Turner77605952003-10-29 21:43:52 +0000294 FT_Service_PsCMaps psnames;
Werner Lemberg40bb0962003-11-01 14:36:20 +0000295 PSAux_Service psaux;
296 T1_Font type1 = &face->type1;
297 PS_FontInfo info = &type1->font_info;
David Turner2dfb5ac2000-01-27 14:02:04 +0000298
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000299 FT_UNUSED( num_params );
300 FT_UNUSED( params );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000301 FT_UNUSED( stream );
302
David Turner2dfb5ac2000-01-27 14:02:04 +0000303
304 face->root.num_faces = 1;
305
David Turner77605952003-10-29 21:43:52 +0000306 FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
David Turnerb72d8a82003-09-29 20:33:37 +0000307 face->psnames = psnames;
David Turner95bec282000-02-15 12:55:57 +0000308
Werner Lemberg1305f262002-03-28 08:07:16 +0000309 face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
310 "psaux" );
311 psaux = (PSAux_Service)face->psaux;
David Turnerc3128612000-06-23 05:02:13 +0000312
Werner Lemberg1305f262002-03-28 08:07:16 +0000313 face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
314 "pshinter" );
David Turner97488072000-08-22 22:36:33 +0000315
Werner Lembergfdc042b2003-06-12 04:59:07 +0000316 /* open the tokenizer; this will also check the font format */
Werner Lembergb5084e12000-10-28 17:10:06 +0000317 error = T1_Open_Face( face );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000318 if ( error )
319 goto Exit;
David Turner2dfb5ac2000-01-27 14:02:04 +0000320
321 /* if we just wanted to check the format, leave successfully now */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000322 if ( face_index < 0 )
David Turner2dfb5ac2000-01-27 14:02:04 +0000323 goto Exit;
324
325 /* check the face index */
326 if ( face_index != 0 )
327 {
David Turner5893c1b2001-10-18 11:49:26 +0000328 FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
David Turner2dfb5ac2000-01-27 14:02:04 +0000329 error = T1_Err_Invalid_Argument;
330 goto Exit;
331 }
332
Werner Lembergfdc042b2003-06-12 04:59:07 +0000333 /* now load the font program into the face object */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000334
Werner Lembergfdc042b2003-06-12 04:59:07 +0000335 /* initialize the face object fields */
336
337 /* set up root face fields */
David Turner2dfb5ac2000-01-27 14:02:04 +0000338 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000339 FT_Face root = (FT_Face)&face->root;
340
341
Werner Lemberg65ba7242003-05-30 09:12:50 +0000342 root->num_glyphs = type1->num_glyphs;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000343 root->face_index = face_index;
Werner Lembergbd889e52002-05-12 19:59:17 +0000344
Werner Lemberg7734a1f2005-10-05 15:18:29 +0000345 root->face_flags = FT_FACE_FLAG_SCALABLE |
346 FT_FACE_FLAG_HORIZONTAL |
347 FT_FACE_FLAG_GLYPH_NAMES |
348 FT_FACE_FLAG_HINTER;
David Turner6930b452000-07-19 17:13:03 +0000349
Werner Lemberg64f1ba92003-07-25 22:09:53 +0000350 if ( info->is_fixed_pitch )
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000351 root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
352
353 if ( face->blend )
354 root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
355
356 /* XXX: TODO -- add kerning with .afm support */
357
Werner Lembergd57a5e92008-06-18 06:16:39 +0000358
359 /* The following code to extract the family and the style is very */
360 /* simplistic and might get some things wrong. For a full-featured */
361 /* algorithm you might have a look at the whitepaper given at */
362 /* */
363 /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
364
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000365 /* get style name -- be careful, some broken fonts only */
366 /* have a `/FontName' dictionary entry! */
Werner Lemberg65ba7242003-05-30 09:12:50 +0000367 root->family_name = info->family_name;
Werner Lembergd57a5e92008-06-18 06:16:39 +0000368 root->style_name = NULL;
Werner Lemberg85751172008-03-21 07:16:00 +0000369
Werner Lembergd57a5e92008-06-18 06:16:39 +0000370 if ( root->family_name )
David Turner2dfb5ac2000-01-27 14:02:04 +0000371 {
Werner Lemberg65ba7242003-05-30 09:12:50 +0000372 char* full = info->full_name;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000373 char* family = root->family_name;
David Turnere49ab252000-05-16 23:44:38 +0000374
Werner Lembergefa99612002-04-01 22:01:46 +0000375
David Turner662b3442002-01-03 16:56:59 +0000376 if ( full )
David Turner2dfb5ac2000-01-27 14:02:04 +0000377 {
Werner Lemberg64591b72003-06-01 21:30:04 +0000378 while ( *full )
David Turner662b3442002-01-03 16:56:59 +0000379 {
Werner Lemberg64591b72003-06-01 21:30:04 +0000380 if ( *full == *family )
381 {
382 family++;
383 full++;
384 }
385 else
386 {
387 if ( *full == ' ' || *full == '-' )
388 full++;
389 else if ( *family == ' ' || *family == '-' )
390 family++;
391 else
392 {
393 if ( !*family )
394 root->style_name = full;
395 break;
396 }
397 }
David Turner662b3442002-01-03 16:56:59 +0000398 }
David Turner2dfb5ac2000-01-27 14:02:04 +0000399 }
David Turner2dfb5ac2000-01-27 14:02:04 +0000400 }
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000401 else
402 {
403 /* do we have a `/FontName'? */
Werner Lemberg65ba7242003-05-30 09:12:50 +0000404 if ( type1->font_name )
Werner Lemberg65ba7242003-05-30 09:12:50 +0000405 root->family_name = type1->font_name;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000406 }
407
Werner Lembergd57a5e92008-06-18 06:16:39 +0000408 if ( !root->style_name )
409 {
410 if ( info->weight )
411 root->style_name = info->weight;
412 else
413 /* assume "Regular" style because we don't know better */
414 root->style_name = (char *)"Regular";
415 }
416
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000417 /* compute style flags */
418 root->style_flags = 0;
Werner Lemberg64f1ba92003-07-25 22:09:53 +0000419 if ( info->italic_angle )
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000420 root->style_flags |= FT_STYLE_FLAG_ITALIC;
Werner Lemberg65ba7242003-05-30 09:12:50 +0000421 if ( info->weight )
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000422 {
Werner Lemberg65ba7242003-05-30 09:12:50 +0000423 if ( !ft_strcmp( info->weight, "Bold" ) ||
424 !ft_strcmp( info->weight, "Black" ) )
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000425 root->style_flags |= FT_STYLE_FLAG_BOLD;
426 }
427
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000428 /* no embedded bitmap support */
429 root->num_fixed_sizes = 0;
430 root->available_sizes = 0;
431
Werner Lemberg65ba7242003-05-30 09:12:50 +0000432 root->bbox.xMin = type1->font_bbox.xMin >> 16;
433 root->bbox.yMin = type1->font_bbox.yMin >> 16;
434 root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFFU ) >> 16;
435 root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFFU ) >> 16;
Tom Kacvinsky7b91bea2001-02-07 01:14:53 +0000436
437 /* Set units_per_EM if we didn't set it in parse_font_matrix. */
438 if ( !root->units_per_EM )
439 root->units_per_EM = 1000;
440
David Turneracfea4d2002-03-06 12:38:15 +0000441 root->ascender = (FT_Short)( root->bbox.yMax );
442 root->descender = (FT_Short)( root->bbox.yMin );
Wu, Chia-I (吳佳一)5d146852006-01-31 10:29:44 +0000443
444 root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );
445 if ( root->height < root->ascender - root->descender )
David Turnerda95af62006-03-20 13:32:33 +0000446 root->height = (FT_Short)( root->ascender - root->descender );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000447
448 /* now compute the maximum advance width */
Werner Lemberg521a2d72001-03-20 22:58:56 +0000449 root->max_advance_width =
David Turneracfea4d2002-03-06 12:38:15 +0000450 (FT_Short)( root->bbox.xMax );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000451 {
Werner Lemberg73861972003-06-05 04:31:05 +0000452 FT_Pos max_advance;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000453
454
Werner Lembergb5084e12000-10-28 17:10:06 +0000455 error = T1_Compute_Max_Advance( face, &max_advance );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000456
457 /* in case of error, keep the standard width */
458 if ( !error )
David Turner8edbcab2001-06-19 08:28:24 +0000459 root->max_advance_width = (FT_Short)max_advance;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000460 else
Werner Lembergd57a5e92008-06-18 06:16:39 +0000461 error = T1_Err_Ok; /* clear error */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000462 }
463
464 root->max_advance_height = root->height;
465
Werner Lemberg9472e232004-02-14 19:21:37 +0000466 root->underline_position = (FT_Short)info->underline_position;
467 root->underline_thickness = (FT_Short)info->underline_thickness;
David Turner2dfb5ac2000-01-27 14:02:04 +0000468 }
469
David Turnerfa77c872002-03-22 15:56:12 +0000470 {
Werner Lembergefa99612002-04-01 22:01:46 +0000471 FT_Face root = &face->root;
Werner Lembergbd889e52002-05-12 19:59:17 +0000472
Werner Lembergefa99612002-04-01 22:01:46 +0000473
David Turnerfa77c872002-03-22 15:56:12 +0000474 if ( psnames && psaux )
475 {
476 FT_CharMapRec charmap;
David Turnered54f282002-03-22 17:09:52 +0000477 T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes;
David Turnerfa77c872002-03-22 15:56:12 +0000478 FT_CMap_Class clazz;
Werner Lembergbd889e52002-05-12 19:59:17 +0000479
Werner Lembergefa99612002-04-01 22:01:46 +0000480
David Turnerfa77c872002-03-22 15:56:12 +0000481 charmap.face = root;
Werner Lembergbd889e52002-05-12 19:59:17 +0000482
David Turnerfa77c872002-03-22 15:56:12 +0000483 /* first of all, try to synthetize a Unicode charmap */
484 charmap.platform_id = 3;
485 charmap.encoding_id = 1;
David Turnerb08fe2d2002-08-27 20:20:29 +0000486 charmap.encoding = FT_ENCODING_UNICODE;
Werner Lembergbd889e52002-05-12 19:59:17 +0000487
David Turnered54f282002-03-22 17:09:52 +0000488 FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
Werner Lembergbd889e52002-05-12 19:59:17 +0000489
David Turnerfa77c872002-03-22 15:56:12 +0000490 /* now, generate an Adobe Standard encoding when appropriate */
491 charmap.platform_id = 7;
492 clazz = NULL;
Werner Lembergbd889e52002-05-12 19:59:17 +0000493
Werner Lemberg65ba7242003-05-30 09:12:50 +0000494 switch ( type1->encoding_type )
David Turnerfa77c872002-03-22 15:56:12 +0000495 {
Werner Lembergefa99612002-04-01 22:01:46 +0000496 case T1_ENCODING_TYPE_STANDARD:
David Turnerb08fe2d2002-08-27 20:20:29 +0000497 charmap.encoding = FT_ENCODING_ADOBE_STANDARD;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000498 charmap.encoding_id = TT_ADOBE_ID_STANDARD;
Werner Lembergefa99612002-04-01 22:01:46 +0000499 clazz = cmap_classes->standard;
500 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000501
502 case T1_ENCODING_TYPE_EXPERT:
David Turnerb08fe2d2002-08-27 20:20:29 +0000503 charmap.encoding = FT_ENCODING_ADOBE_EXPERT;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000504 charmap.encoding_id = TT_ADOBE_ID_EXPERT;
Werner Lembergefa99612002-04-01 22:01:46 +0000505 clazz = cmap_classes->expert;
506 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000507
Werner Lembergefa99612002-04-01 22:01:46 +0000508 case T1_ENCODING_TYPE_ARRAY:
David Turnerb08fe2d2002-08-27 20:20:29 +0000509 charmap.encoding = FT_ENCODING_ADOBE_CUSTOM;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000510 charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
Werner Lembergefa99612002-04-01 22:01:46 +0000511 clazz = cmap_classes->custom;
512 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000513
Werner Lembergefa99612002-04-01 22:01:46 +0000514 case T1_ENCODING_TYPE_ISOLATIN1:
David Turnerb08fe2d2002-08-27 20:20:29 +0000515 charmap.encoding = FT_ENCODING_ADOBE_LATIN_1;
Werner Lemberg8f963be2003-12-18 15:29:20 +0000516 charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
Werner Lembergefa99612002-04-01 22:01:46 +0000517 clazz = cmap_classes->unicode;
518 break;
Werner Lembergbd889e52002-05-12 19:59:17 +0000519
Werner Lembergefa99612002-04-01 22:01:46 +0000520 default:
521 ;
David Turnerfa77c872002-03-22 15:56:12 +0000522 }
Werner Lembergbd889e52002-05-12 19:59:17 +0000523
David Turnerfa77c872002-03-22 15:56:12 +0000524 if ( clazz )
David Turnered54f282002-03-22 17:09:52 +0000525 FT_CMap_New( clazz, NULL, &charmap, NULL );
Werner Lemberg0bb4a0f2002-06-19 15:57:55 +0000526
David Turnerfed59b72002-07-17 22:51:06 +0000527#if 0
Werner Lemberg0bb4a0f2002-06-19 15:57:55 +0000528 /* Select default charmap */
529 if (root->num_charmaps)
530 root->charmap = root->charmaps[0];
David Turnerfed59b72002-07-17 22:51:06 +0000531#endif
David Turnerfa77c872002-03-22 15:56:12 +0000532 }
533 }
534
David Turner2dfb5ac2000-01-27 14:02:04 +0000535 Exit:
536 return error;
537 }
538
539
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000540 /*************************************************************************/
541 /* */
542 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000543 /* T1_Driver_Init */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000544 /* */
545 /* <Description> */
546 /* Initializes a given Type 1 driver object. */
547 /* */
548 /* <Input> */
549 /* driver :: A handle to the target driver object. */
550 /* */
551 /* <Return> */
552 /* FreeType error code. 0 means success. */
553 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000554 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000555 T1_Driver_Init( T1_Driver driver )
David Turner2dfb5ac2000-01-27 14:02:04 +0000556 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000557 FT_UNUSED( driver );
558
David Turner2dfb5ac2000-01-27 14:02:04 +0000559 return T1_Err_Ok;
560 }
561
562
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000563 /*************************************************************************/
564 /* */
565 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000566 /* T1_Driver_Done */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000567 /* */
568 /* <Description> */
569 /* Finalizes a given Type 1 driver. */
570 /* */
571 /* <Input> */
Werner Lembergefa99612002-04-01 22:01:46 +0000572 /* driver :: A handle to the target Type 1 driver. */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000573 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000574 FT_LOCAL_DEF( void )
David Turner5893c1b2001-10-18 11:49:26 +0000575 T1_Driver_Done( T1_Driver driver )
David Turner2dfb5ac2000-01-27 14:02:04 +0000576 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000577 FT_UNUSED( driver );
David Turner2dfb5ac2000-01-27 14:02:04 +0000578 }
579
580
581/* END */