blob: b1515bd3db53ee3b2d986b6d6acb20a880568231 [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 Lemberg415235d2001-06-28 17:49:10 +00007/* Copyright 1996-2001 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 Lembergcc069be2000-12-08 16:17:16 +000022
Werner Lemberg6dd303d2000-11-26 21:25:53 +000023#include <string.h> /* strcmp() */
24
David Turner8d3a4012001-03-20 11:14:24 +000025#include "t1gload.h"
26#include "t1load.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000027
Werner Lemberg1f7f0e82001-06-06 17:30:41 +000028#include "t1errors.h"
29
Werner Lembergf1ca2342000-11-29 15:18:54 +000030#ifndef T1_CONFIG_OPTION_NO_AFM
David Turner8d3a4012001-03-20 11:14:24 +000031#include "t1afm.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000032#endif
Werner Lemberg7fa51b52000-07-08 19:51:42 +000033
David Turner19ed8af2000-12-08 02:42:29 +000034#include FT_INTERNAL_POSTSCRIPT_NAMES_H
35#include FT_INTERNAL_POSTSCRIPT_AUX_H
David Turner2dfb5ac2000-01-27 14:02:04 +000036
David Turner2dfb5ac2000-01-27 14:02:04 +000037
Werner Lemberg7fa51b52000-07-08 19:51:42 +000038 /*************************************************************************/
39 /* */
40 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
41 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
42 /* messages during execution. */
43 /* */
44#undef FT_COMPONENT
Werner Lembergb5084e12000-10-28 17:10:06 +000045#define FT_COMPONENT trace_t1objs
David Turner2dfb5ac2000-01-27 14:02:04 +000046
David Turner2dfb5ac2000-01-27 14:02:04 +000047
Werner Lemberg7fa51b52000-07-08 19:51:42 +000048 /*************************************************************************/
49 /* */
Werner Lembergc3b21602001-12-05 01:22:05 +000050 /* SIZE FUNCTIONS */
David Turner5893c1b2001-10-18 11:49:26 +000051 /* */
52 /* note that we store the global hints in the size's "internal" root */
Werner Lembergc3b21602001-12-05 01:22:05 +000053 /* field */
David Turner5893c1b2001-10-18 11:49:26 +000054 /* */
55 /*************************************************************************/
56
Werner Lembergc3b21602001-12-05 01:22:05 +000057
David Turner5893c1b2001-10-18 11:49:26 +000058 static PSH_Globals_Funcs
59 T1_Size_Get_Globals_Funcs( T1_Size size )
60 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +000061 T1_Face face = (T1_Face)size->root.face;
62 PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
63 FT_Module module;
Werner Lemberg66b35092002-02-10 12:33:14 +000064
Werner Lembergc3b21602001-12-05 01:22:05 +000065
66 module = FT_Get_Module( size->root.face->driver->root.library,
67 "pshinter" );
David Turner5893c1b2001-10-18 11:49:26 +000068 return ( module && pshinter && pshinter->get_globals_funcs )
69 ? pshinter->get_globals_funcs( module )
70 : 0 ;
71 }
72
73
David Turnerbc82f1b2002-03-01 02:26:22 +000074 FT_LOCAL_DEF( void )
Werner Lembergc3b21602001-12-05 01:22:05 +000075 T1_Size_Done( T1_Size size )
David Turner5893c1b2001-10-18 11:49:26 +000076 {
77 if ( size->root.internal )
78 {
Werner Lembergc3b21602001-12-05 01:22:05 +000079 PSH_Globals_Funcs funcs;
Werner Lemberg66b35092002-02-10 12:33:14 +000080
Werner Lembergc3b21602001-12-05 01:22:05 +000081
82 funcs = T1_Size_Get_Globals_Funcs( size );
83 if ( funcs )
84 funcs->destroy( (PSH_Globals)size->root.internal );
David Turner5893c1b2001-10-18 11:49:26 +000085
86 size->root.internal = 0;
87 }
88 }
89
90
David Turnerbc82f1b2002-03-01 02:26:22 +000091 FT_LOCAL_DEF( FT_Error )
Werner Lembergc3b21602001-12-05 01:22:05 +000092 T1_Size_Init( T1_Size size )
David Turner5893c1b2001-10-18 11:49:26 +000093 {
94 FT_Error error = 0;
95 PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
Werner Lemberg66b35092002-02-10 12:33:14 +000096
Werner Lembergc3b21602001-12-05 01:22:05 +000097
David Turner5893c1b2001-10-18 11:49:26 +000098 if ( funcs )
99 {
Werner Lembergc3b21602001-12-05 01:22:05 +0000100 PSH_Globals globals;
101 T1_Face face = (T1_Face)size->root.face;
Werner Lembergc3b21602001-12-05 01:22:05 +0000102
Werner Lemberg66b35092002-02-10 12:33:14 +0000103
104 error = funcs->create( size->root.face->memory,
David Turner5893c1b2001-10-18 11:49:26 +0000105 &face->type1.private_dict, &globals );
Werner Lembergc3b21602001-12-05 01:22:05 +0000106 if ( !error )
107 size->root.internal = (FT_Size_Internal)(void*)globals;
David Turner5893c1b2001-10-18 11:49:26 +0000108 }
Werner Lemberg66b35092002-02-10 12:33:14 +0000109
David Turner5893c1b2001-10-18 11:49:26 +0000110 return error;
111 }
112
113
David Turnerbc82f1b2002-03-01 02:26:22 +0000114 FT_LOCAL_DEF( FT_Error )
Werner Lembergc3b21602001-12-05 01:22:05 +0000115 T1_Size_Reset( T1_Size size )
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 Turner5893c1b2001-10-18 11:49:26 +0000118 FT_Error error = 0;
Werner Lembergc3b21602001-12-05 01:22:05 +0000119
Werner Lemberg66b35092002-02-10 12:33:14 +0000120
Werner Lembergc3b21602001-12-05 01:22:05 +0000121 if ( funcs )
122 error = funcs->set_scale( (PSH_Globals)size->root.internal,
David Turner5893c1b2001-10-18 11:49:26 +0000123 size->root.metrics.x_scale,
124 size->root.metrics.y_scale,
125 0, 0 );
David Turner3a664fc2001-12-21 15:26:19 +0000126 return error;
David Turner5893c1b2001-10-18 11:49:26 +0000127 }
128
129
130 /*************************************************************************/
131 /* */
132 /* SLOT FUNCTIONS */
133 /* */
134 /*************************************************************************/
135
David Turnerbc82f1b2002-03-01 02:26:22 +0000136 FT_LOCAL_DEF( void )
David Turner5893c1b2001-10-18 11:49:26 +0000137 T1_GlyphSlot_Done( T1_GlyphSlot slot )
138 {
139 slot->root.internal->glyph_hints = 0;
140 }
141
142
David Turnerbc82f1b2002-03-01 02:26:22 +0000143 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000144 T1_GlyphSlot_Init( T1_GlyphSlot slot )
Werner Lemberg66b35092002-02-10 12:33:14 +0000145 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000146 T1_Face face;
David Turner4e7eeee2002-02-28 16:10:29 +0000147 PSHinter_Service pshinter;
Werner Lemberg66b35092002-02-10 12:33:14 +0000148
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000149
150 face = (T1_Face)slot->root.face;
151 pshinter = (PSHinter_Service)face->pshinter;
152
153 if ( pshinter )
David Turner5893c1b2001-10-18 11:49:26 +0000154 {
155 FT_Module module;
Werner Lemberg66b35092002-02-10 12:33:14 +0000156
Werner Lemberg0d9165e2002-03-07 21:59:59 +0000157
David Turner5893c1b2001-10-18 11:49:26 +0000158 module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
159 if (module)
160 {
161 T1_Hints_Funcs funcs;
Werner Lemberg66b35092002-02-10 12:33:14 +0000162
David Turner5893c1b2001-10-18 11:49:26 +0000163 funcs = pshinter->get_t1_funcs( module );
164 slot->root.internal->glyph_hints = (void*)funcs;
165 }
166 }
167 return 0;
168 }
Werner Lemberg66b35092002-02-10 12:33:14 +0000169
170
David Turner5893c1b2001-10-18 11:49:26 +0000171 /*************************************************************************/
172 /* */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000173 /* FACE FUNCTIONS */
174 /* */
175 /*************************************************************************/
176
177
178 /*************************************************************************/
179 /* */
180 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000181 /* T1_Face_Done */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000182 /* */
183 /* <Description> */
184 /* The face object destructor. */
185 /* */
186 /* <Input> */
187 /* face :: A typeless pointer to the face object to destroy. */
188 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000189 FT_LOCAL_DEF( void )
Werner Lembergc3b21602001-12-05 01:22:05 +0000190 T1_Face_Done( T1_Face face )
David Turner2dfb5ac2000-01-27 14:02:04 +0000191 {
192 FT_Memory memory;
David Turner29644172002-02-28 18:59:37 +0000193 T1_Font type1 = &face->type1;
David Turner2dfb5ac2000-01-27 14:02:04 +0000194
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000195
196 if ( face )
David Turner2dfb5ac2000-01-27 14:02:04 +0000197 {
198 memory = face->root.memory;
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 Lembergb5084e12000-10-28 17:10:06 +0000202 T1_Done_Blend( face );
David Turner7c388ba2000-05-26 02:07:40 +0000203 face->blend = 0;
204#endif
205
David Turnere49ab252000-05-16 23:44:38 +0000206 /* release font info strings */
David Turner4d3e5632000-05-05 12:33:23 +0000207 {
David Turner29644172002-02-28 18:59:37 +0000208 PS_FontInfo info = &type1->font_info;
David Turnere49ab252000-05-16 23:44:38 +0000209
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000210
David Turnere459d742002-03-22 13:52:37 +0000211 FT_FREE( info->version );
212 FT_FREE( info->notice );
213 FT_FREE( info->full_name );
214 FT_FREE( info->family_name );
215 FT_FREE( info->weight );
David Turner4d3e5632000-05-05 12:33:23 +0000216 }
217
David Turnere49ab252000-05-16 23:44:38 +0000218 /* release top dictionary */
David Turnere459d742002-03-22 13:52:37 +0000219 FT_FREE( type1->charstrings_len );
220 FT_FREE( type1->charstrings );
221 FT_FREE( type1->glyph_names );
David Turner4d3e5632000-05-05 12:33:23 +0000222
David Turnere459d742002-03-22 13:52:37 +0000223 FT_FREE( type1->subrs );
224 FT_FREE( type1->subrs_len );
David Turnere49ab252000-05-16 23:44:38 +0000225
David Turnere459d742002-03-22 13:52:37 +0000226 FT_FREE( type1->subrs_block );
227 FT_FREE( type1->charstrings_block );
228 FT_FREE( type1->glyph_names_block );
David Turner4d3e5632000-05-05 12:33:23 +0000229
David Turnere459d742002-03-22 13:52:37 +0000230 FT_FREE( type1->encoding.char_index );
231 FT_FREE( type1->encoding.char_name );
232 FT_FREE( type1->font_name );
David Turnere49ab252000-05-16 23:44:38 +0000233
Werner Lembergb5084e12000-10-28 17:10:06 +0000234#ifndef T1_CONFIG_OPTION_NO_AFM
David Turner4d3e5632000-05-05 12:33:23 +0000235 /* release afm data if present */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000236 if ( face->afm_data )
Werner Lembergb5084e12000-10-28 17:10:06 +0000237 T1_Done_AFM( memory, (T1_AFM*)face->afm_data );
David Turner4d3e5632000-05-05 12:33:23 +0000238#endif
239
240 /* release unicode map, if any */
David Turnere459d742002-03-22 13:52:37 +0000241 FT_FREE( face->unicode_map.maps );
David Turner4d3e5632000-05-05 12:33:23 +0000242 face->unicode_map.num_maps = 0;
243
244 face->root.family_name = 0;
245 face->root.style_name = 0;
David Turner2dfb5ac2000-01-27 14:02:04 +0000246 }
247 }
248
David Turner2dfb5ac2000-01-27 14:02:04 +0000249
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000250 /*************************************************************************/
251 /* */
252 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000253 /* T1_Face_Init */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000254 /* */
255 /* <Description> */
256 /* The face object constructor. */
257 /* */
258 /* <Input> */
259 /* stream :: input stream where to load font data. */
260 /* */
261 /* face_index :: The index of the font face in the resource. */
262 /* */
263 /* num_params :: Number of additional generic parameters. Ignored. */
264 /* */
265 /* params :: Additional generic parameters. Ignored. */
266 /* */
267 /* <InOut> */
268 /* face :: The face record to build. */
269 /* */
270 /* <Return> */
271 /* FreeType error code. 0 means success. */
272 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000273 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000274 T1_Face_Init( FT_Stream stream,
Werner Lemberg4a2305c2001-06-28 07:17:51 +0000275 T1_Face face,
276 FT_Int face_index,
277 FT_Int num_params,
278 FT_Parameter* params )
David Turner2dfb5ac2000-01-27 14:02:04 +0000279 {
David Turner5893c1b2001-10-18 11:49:26 +0000280 FT_Error error;
David Turner4e7eeee2002-02-28 16:10:29 +0000281 PSNames_Service psnames;
282 PSAux_Service psaux;
283 PSHinter_Service pshinter;
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 Turner4bd5d0a2002-03-20 09:42:31 +0000293 psnames = face->psnames = (PSNames_Service)
294 FT_Get_Module_Interface( FT_FACE_LIBRARY(face), "psnames" );
David Turner95bec282000-02-15 12:55:57 +0000295
David Turner4bd5d0a2002-03-20 09:42:31 +0000296 psaux = face->psaux = (PSAux_Service)
297 FT_Get_Module_Interface( FT_FACE_LIBRARY(face), "psaux" );
David Turnerc3128612000-06-23 05:02:13 +0000298
David Turner4bd5d0a2002-03-20 09:42:31 +0000299 pshinter = face->pshinter = (PSHinter_Service)
300 FT_Get_Module_Interface( FT_FACE_LIBRARY(face), "pshinter" );
David Turner97488072000-08-22 22:36:33 +0000301
David Turner2dfb5ac2000-01-27 14:02:04 +0000302 /* open the tokenizer, this will also check the font format */
Werner Lembergb5084e12000-10-28 17:10:06 +0000303 error = T1_Open_Face( face );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000304 if ( error )
305 goto Exit;
David Turner2dfb5ac2000-01-27 14:02:04 +0000306
307 /* if we just wanted to check the format, leave successfully now */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000308 if ( face_index < 0 )
David Turner2dfb5ac2000-01-27 14:02:04 +0000309 goto Exit;
310
311 /* check the face index */
312 if ( face_index != 0 )
313 {
David Turner5893c1b2001-10-18 11:49:26 +0000314 FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
David Turner2dfb5ac2000-01-27 14:02:04 +0000315 error = T1_Err_Invalid_Argument;
316 goto Exit;
317 }
318
319 /* Now, load the font program into the face object */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000320
321 /* Init the face object fields */
322 /* Now set up root face fields */
David Turner2dfb5ac2000-01-27 14:02:04 +0000323 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000324 FT_Face root = (FT_Face)&face->root;
325
326
327 root->num_glyphs = face->type1.num_glyphs;
328 root->num_charmaps = 1;
329
330 root->face_index = face_index;
331 root->face_flags = FT_FACE_FLAG_SCALABLE;
332
333 root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
334
David Turner6930b452000-07-19 17:13:03 +0000335 root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
336
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000337 if ( face->type1.font_info.is_fixed_pitch )
338 root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
339
340 if ( face->blend )
341 root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
342
343 /* XXX: TODO -- add kerning with .afm support */
344
345 /* get style name -- be careful, some broken fonts only */
346 /* have a `/FontName' dictionary entry! */
347 root->family_name = face->type1.font_info.family_name;
348 if ( root->family_name )
David Turner2dfb5ac2000-01-27 14:02:04 +0000349 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000350 char* full = face->type1.font_info.full_name;
351 char* family = root->family_name;
David Turnere49ab252000-05-16 23:44:38 +0000352
David Turner662b3442002-01-03 16:56:59 +0000353 if ( full )
David Turner2dfb5ac2000-01-27 14:02:04 +0000354 {
David Turner662b3442002-01-03 16:56:59 +0000355 while ( *family && *full == *family )
356 {
357 family++;
358 full++;
359 }
Werner Lemberg66b35092002-02-10 12:33:14 +0000360
David Turner662b3442002-01-03 16:56:59 +0000361 root->style_name = ( *full == ' ' ? full + 1
362 : (char *)"Regular" );
David Turner2dfb5ac2000-01-27 14:02:04 +0000363 }
David Turner662b3442002-01-03 16:56:59 +0000364 else
Werner Lemberg1a0a9792002-01-03 22:06:13 +0000365 root->style_name = (char *)"Regular";
David Turner2dfb5ac2000-01-27 14:02:04 +0000366 }
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000367 else
368 {
369 /* do we have a `/FontName'? */
370 if ( face->type1.font_name )
371 {
372 root->family_name = face->type1.font_name;
Werner Lemberge72c9fe2000-07-31 18:59:02 +0000373 root->style_name = (char *)"Regular";
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000374 }
375 }
376
Werner Lemberg6dd303d2000-11-26 21:25:53 +0000377 /* compute style flags */
378 root->style_flags = 0;
379 if ( face->type1.font_info.italic_angle )
380 root->style_flags |= FT_STYLE_FLAG_ITALIC;
381 if ( face->type1.font_info.weight )
382 {
383 if ( !strcmp( face->type1.font_info.weight, "Bold" ) ||
384 !strcmp( face->type1.font_info.weight, "Black" ) )
385 root->style_flags |= FT_STYLE_FLAG_BOLD;
386 }
387
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000388 /* no embedded bitmap support */
389 root->num_fixed_sizes = 0;
390 root->available_sizes = 0;
391
David Turner7d0f0ba2002-03-05 15:55:28 +0000392 root->bbox.xMin = face->type1.font_bbox.xMin >> 16;
393 root->bbox.yMin = face->type1.font_bbox.yMin >> 16;
394 root->bbox.xMax = (face->type1.font_bbox.xMax + 0xFFFFU) >> 16;
395 root->bbox.yMax = (face->type1.font_bbox.yMax + 0xFFFFU) >> 16;
Tom Kacvinsky7b91bea2001-02-07 01:14:53 +0000396
397 /* Set units_per_EM if we didn't set it in parse_font_matrix. */
398 if ( !root->units_per_EM )
399 root->units_per_EM = 1000;
400
David Turneracfea4d2002-03-06 12:38:15 +0000401 root->ascender = (FT_Short)( root->bbox.yMax );
402 root->descender = (FT_Short)( root->bbox.yMin );
Werner Lemberg8eb03532001-06-19 23:03:41 +0000403 root->height = (FT_Short)(
404 ( ( root->ascender - root->descender ) * 12 ) / 10 );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000405
406 /* now compute the maximum advance width */
Werner Lemberg521a2d72001-03-20 22:58:56 +0000407 root->max_advance_width =
David Turneracfea4d2002-03-06 12:38:15 +0000408 (FT_Short)( root->bbox.xMax );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000409 {
410 FT_Int max_advance;
411
412
Werner Lembergb5084e12000-10-28 17:10:06 +0000413 error = T1_Compute_Max_Advance( face, &max_advance );
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000414
415 /* in case of error, keep the standard width */
416 if ( !error )
David Turner8edbcab2001-06-19 08:28:24 +0000417 root->max_advance_width = (FT_Short)max_advance;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000418 else
419 error = 0; /* clear error */
420 }
421
422 root->max_advance_height = root->height;
423
424 root->underline_position = face->type1.font_info.underline_position;
425 root->underline_thickness = face->type1.font_info.underline_thickness;
426
David Turner54e75742000-11-04 02:52:02 +0000427 root->internal->max_points = 0;
428 root->internal->max_contours = 0;
David Turner2dfb5ac2000-01-27 14:02:04 +0000429 }
430
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000431 /* charmap support -- synthetize unicode charmap if possible */
David Turner4d3e5632000-05-05 12:33:23 +0000432 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000433 FT_Face root = &face->root;
434 FT_CharMap charmap = face->charmaprecs;
David Turner4d3e5632000-05-05 12:33:23 +0000435
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000436
437 /* synthesize a Unicode charmap if there is support in the `PSNames' */
438 /* module */
Werner Lemberge72c9fe2000-07-31 18:59:02 +0000439 if ( psnames )
David Turner4d3e5632000-05-05 12:33:23 +0000440 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000441 if ( psnames->unicode_value )
David Turner4d3e5632000-05-05 12:33:23 +0000442 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000443 error = psnames->build_unicodes(
444 root->memory,
445 face->type1.num_glyphs,
446 (const char**)face->type1.glyph_names,
447 &face->unicode_map );
448 if ( !error )
David Turner4d3e5632000-05-05 12:33:23 +0000449 {
450 root->charmap = charmap;
451 charmap->face = (FT_Face)face;
452 charmap->encoding = ft_encoding_unicode;
453 charmap->platform_id = 3;
454 charmap->encoding_id = 1;
455 charmap++;
456 }
David Turnere49ab252000-05-16 23:44:38 +0000457
David Turner4d3e5632000-05-05 12:33:23 +0000458 /* simply clear the error in case of failure (which really) */
459 /* means that out of memory or no unicode glyph names */
Werner Lemberg1429db62001-04-02 23:54:01 +0000460 error = T1_Err_Ok;
David Turner4d3e5632000-05-05 12:33:23 +0000461 }
462 }
463
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000464 /* now, support either the standard, expert, or custom encoding */
David Turner4d3e5632000-05-05 12:33:23 +0000465 charmap->face = (FT_Face)face;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000466 charmap->platform_id = 7; /* a new platform id for Adobe fonts? */
David Turnere49ab252000-05-16 23:44:38 +0000467
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000468 switch ( face->type1.encoding_type )
David Turner4d3e5632000-05-05 12:33:23 +0000469 {
David Turner29644172002-02-28 18:59:37 +0000470 case T1_ENCODING_TYPE_STANDARD:
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000471 charmap->encoding = ft_encoding_adobe_standard;
472 charmap->encoding_id = 0;
473 break;
David Turnere49ab252000-05-16 23:44:38 +0000474
David Turner29644172002-02-28 18:59:37 +0000475 case T1_ENCODING_TYPE_EXPORT:
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000476 charmap->encoding = ft_encoding_adobe_expert;
477 charmap->encoding_id = 1;
478 break;
David Turnere49ab252000-05-16 23:44:38 +0000479
David Turner29644172002-02-28 18:59:37 +0000480 case T1_ENCODING_TYPE_ARRAY:
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000481 charmap->encoding = ft_encoding_adobe_custom;
482 charmap->encoding_id = 2;
483 break;
Werner Lemberg66b35092002-02-10 12:33:14 +0000484
David Turner29644172002-02-28 18:59:37 +0000485 case T1_ENCODING_TYPE_ISOLATIN1:
Werner Lemberg66b35092002-02-10 12:33:14 +0000486 charmap->encoding = ft_encoding_latin_1;
487 charmap->encoding_id = 3;
488 break;
489
490 default:
491 FT_ERROR(( "T1_Face_Init: invalid encoding\n" ));
492 error = T1_Err_Invalid_File_Format;
493 goto Exit;
David Turner4d3e5632000-05-05 12:33:23 +0000494 }
David Turnere49ab252000-05-16 23:44:38 +0000495
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000496 root->charmaps = face->charmaps;
David Turner4d3e5632000-05-05 12:33:23 +0000497 root->num_charmaps = charmap - face->charmaprecs + 1;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000498 face->charmaps[0] = &face->charmaprecs[0];
499 face->charmaps[1] = &face->charmaprecs[1];
David Turner4d3e5632000-05-05 12:33:23 +0000500 }
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000501
David Turner2dfb5ac2000-01-27 14:02:04 +0000502 Exit:
503 return error;
504 }
505
506
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000507 /*************************************************************************/
508 /* */
509 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000510 /* T1_Driver_Init */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000511 /* */
512 /* <Description> */
513 /* Initializes a given Type 1 driver object. */
514 /* */
515 /* <Input> */
516 /* driver :: A handle to the target driver object. */
517 /* */
518 /* <Return> */
519 /* FreeType error code. 0 means success. */
520 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000521 FT_LOCAL_DEF( FT_Error )
David Turner5893c1b2001-10-18 11:49:26 +0000522 T1_Driver_Init( T1_Driver driver )
David Turner2dfb5ac2000-01-27 14:02:04 +0000523 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000524 FT_UNUSED( driver );
525
David Turner2dfb5ac2000-01-27 14:02:04 +0000526 return T1_Err_Ok;
527 }
528
529
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000530 /*************************************************************************/
531 /* */
532 /* <Function> */
David Turner5893c1b2001-10-18 11:49:26 +0000533 /* T1_Driver_Done */
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000534 /* */
535 /* <Description> */
536 /* Finalizes a given Type 1 driver. */
537 /* */
538 /* <Input> */
539 /* driver :: A handle to the target Type 1 driver. */
540 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000541 FT_LOCAL_DEF( void )
David Turner5893c1b2001-10-18 11:49:26 +0000542 T1_Driver_Done( T1_Driver driver )
David Turner2dfb5ac2000-01-27 14:02:04 +0000543 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000544 FT_UNUSED( driver );
David Turner2dfb5ac2000-01-27 14:02:04 +0000545 }
546
547
548/* END */