blob: 7d318a359cb87af6e45525bb0ab8c58bb94bb98b [file] [log] [blame]
Werner Lemberge3c11d72000-06-16 06:49:56 +00001/***************************************************************************/
2/* */
3/* cidobjs.c */
4/* */
5/* CID objects manager (body). */
6/* */
Werner Lembergf1c2b912006-01-13 14:53:28 +00007/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */
Werner Lemberge3c11d72000-06-16 06:49:56 +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
19#include <ft2build.h>
20#include FT_INTERNAL_DEBUG_H
21#include FT_INTERNAL_STREAM_H
Werner Lembergfdc042b2003-06-12 04:59:07 +000022
David Turner8d3a4012001-03-20 11:14:24 +000023#include "cidgload.h"
24#include "cidload.h"
Werner Lembergfdc042b2003-06-12 04:59:07 +000025
David Turner77605952003-10-29 21:43:52 +000026#include FT_SERVICE_POSTSCRIPT_CMAPS_H
Werner Lembergcc069be2000-12-08 16:17:16 +000027#include FT_INTERNAL_POSTSCRIPT_AUX_H
David Turner85eb6692001-12-20 09:36:21 +000028#include FT_INTERNAL_POSTSCRIPT_HINTS_H
David Turner04aa8002000-06-01 03:27:48 +000029
Werner Lemberg1f7f0e82001-06-06 17:30:41 +000030#include "ciderrs.h"
31
Werner Lemberge3c11d72000-06-16 06:49:56 +000032
33 /*************************************************************************/
34 /* */
35 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
36 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
37 /* messages during execution. */
38 /* */
Werner Lemberg63408a12000-12-13 23:44:37 +000039#undef FT_COMPONENT
40#define FT_COMPONENT trace_cidobjs
David Turner04aa8002000-06-01 03:27:48 +000041
David Turner04aa8002000-06-01 03:27:48 +000042
David Turner85eb6692001-12-20 09:36:21 +000043 /*************************************************************************/
44 /* */
45 /* SLOT FUNCTIONS */
46 /* */
47 /*************************************************************************/
48
David Turnerbc82f1b2002-03-01 02:26:22 +000049 FT_LOCAL_DEF( void )
Werner Lemberg3bcad432004-05-06 11:48:35 +000050 cid_slot_done( FT_GlyphSlot slot )
David Turner85eb6692001-12-20 09:36:21 +000051 {
Werner Lemberg3bcad432004-05-06 11:48:35 +000052 slot->internal->glyph_hints = 0;
David Turner85eb6692001-12-20 09:36:21 +000053 }
54
55
David Turnerbc82f1b2002-03-01 02:26:22 +000056 FT_LOCAL_DEF( FT_Error )
Werner Lemberg3bcad432004-05-06 11:48:35 +000057 cid_slot_init( FT_GlyphSlot slot )
Werner Lembergf41e71a2001-12-20 21:22:02 +000058 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +000059 CID_Face face;
David Turner4e7eeee2002-02-28 16:10:29 +000060 PSHinter_Service pshinter;
Werner Lembergf41e71a2001-12-20 21:22:02 +000061
62
Werner Lemberg3bcad432004-05-06 11:48:35 +000063 face = (CID_Face)slot->face;
Werner Lemberg0d9165e2002-03-07 21:59:59 +000064 pshinter = (PSHinter_Service)face->pshinter;
Werner Lembergf41e71a2001-12-20 21:22:02 +000065
66 if ( pshinter )
David Turner85eb6692001-12-20 09:36:21 +000067 {
68 FT_Module module;
Werner Lembergf41e71a2001-12-20 21:22:02 +000069
70
Werner Lemberg3bcad432004-05-06 11:48:35 +000071 module = FT_Get_Module( slot->face->driver->root.library,
Werner Lembergf41e71a2001-12-20 21:22:02 +000072 "pshinter" );
73 if ( module )
David Turner85eb6692001-12-20 09:36:21 +000074 {
75 T1_Hints_Funcs funcs;
Werner Lembergf41e71a2001-12-20 21:22:02 +000076
77
David Turner85eb6692001-12-20 09:36:21 +000078 funcs = pshinter->get_t1_funcs( module );
Werner Lemberg3bcad432004-05-06 11:48:35 +000079 slot->internal->glyph_hints = (void*)funcs;
David Turner85eb6692001-12-20 09:36:21 +000080 }
81 }
Werner Lembergf41e71a2001-12-20 21:22:02 +000082
David Turner85eb6692001-12-20 09:36:21 +000083 return 0;
84 }
Werner Lembergf41e71a2001-12-20 21:22:02 +000085
David Turner85eb6692001-12-20 09:36:21 +000086
87 /*************************************************************************/
88 /* */
89 /* SIZE FUNCTIONS */
90 /* */
91 /*************************************************************************/
92
93
94 static PSH_Globals_Funcs
David Turnerb08fe2d2002-08-27 20:20:29 +000095 cid_size_get_globals_funcs( CID_Size size )
David Turner85eb6692001-12-20 09:36:21 +000096 {
Werner Lemberg0d9165e2002-03-07 21:59:59 +000097 CID_Face face = (CID_Face)size->root.face;
98 PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
99 FT_Module module;
Werner Lembergf41e71a2001-12-20 21:22:02 +0000100
David Turner85eb6692001-12-20 09:36:21 +0000101
102 module = FT_Get_Module( size->root.face->driver->root.library,
103 "pshinter" );
104 return ( module && pshinter && pshinter->get_globals_funcs )
105 ? pshinter->get_globals_funcs( module )
Werner Lembergf41e71a2001-12-20 21:22:02 +0000106 : 0;
David Turner85eb6692001-12-20 09:36:21 +0000107 }
108
109
David Turnerbc82f1b2002-03-01 02:26:22 +0000110 FT_LOCAL_DEF( void )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000111 cid_size_done( FT_Size cidsize ) /* CID_Size */
David Turner85eb6692001-12-20 09:36:21 +0000112 {
Werner Lemberg3bcad432004-05-06 11:48:35 +0000113 CID_Size size = (CID_Size)cidsize;
114
115
116 if ( cidsize->internal )
David Turner85eb6692001-12-20 09:36:21 +0000117 {
118 PSH_Globals_Funcs funcs;
Werner Lembergf41e71a2001-12-20 21:22:02 +0000119
David Turner85eb6692001-12-20 09:36:21 +0000120
David Turnerb08fe2d2002-08-27 20:20:29 +0000121 funcs = cid_size_get_globals_funcs( size );
David Turner85eb6692001-12-20 09:36:21 +0000122 if ( funcs )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000123 funcs->destroy( (PSH_Globals)cidsize->internal );
David Turner85eb6692001-12-20 09:36:21 +0000124
Werner Lemberg3bcad432004-05-06 11:48:35 +0000125 cidsize->internal = 0;
David Turner85eb6692001-12-20 09:36:21 +0000126 }
127 }
128
129
David Turnerbc82f1b2002-03-01 02:26:22 +0000130 FT_LOCAL_DEF( FT_Error )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000131 cid_size_init( FT_Size cidsize ) /* CID_Size */
David Turner85eb6692001-12-20 09:36:21 +0000132 {
Werner Lemberg3bcad432004-05-06 11:48:35 +0000133 CID_Size size = (CID_Size)cidsize;
David Turner85eb6692001-12-20 09:36:21 +0000134 FT_Error error = 0;
David Turnerb08fe2d2002-08-27 20:20:29 +0000135 PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size );
Werner Lembergf41e71a2001-12-20 21:22:02 +0000136
David Turner85eb6692001-12-20 09:36:21 +0000137
138 if ( funcs )
139 {
Werner Lemberg44be4d52002-03-30 17:08:04 +0000140 PSH_Globals globals;
Werner Lemberg3bcad432004-05-06 11:48:35 +0000141 CID_Face face = (CID_Face)cidsize->face;
David Turner29644172002-02-28 18:59:37 +0000142 CID_FaceDict dict = face->cid.font_dicts + face->root.face_index;
Werner Lemberg44be4d52002-03-30 17:08:04 +0000143 PS_Private priv = &dict->private_dict;
Werner Lembergf41e71a2001-12-20 21:22:02 +0000144
David Turner85eb6692001-12-20 09:36:21 +0000145
Werner Lemberg3bcad432004-05-06 11:48:35 +0000146 error = funcs->create( cidsize->face->memory, priv, &globals );
David Turner85eb6692001-12-20 09:36:21 +0000147 if ( !error )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000148 cidsize->internal = (FT_Size_Internal)(void*)globals;
David Turner85eb6692001-12-20 09:36:21 +0000149 }
Werner Lembergf41e71a2001-12-20 21:22:02 +0000150
David Turner85eb6692001-12-20 09:36:21 +0000151 return error;
152 }
153
154
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000155 FT_LOCAL( FT_Error )
156 cid_size_request( FT_Size size,
157 FT_Size_Request req )
David Turner85eb6692001-12-20 09:36:21 +0000158 {
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000159 PSH_Globals_Funcs funcs;
David Turner85eb6692001-12-20 09:36:21 +0000160
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000161
Wu, Chia-I (吳佳一)bcc438b2006-01-23 14:12:40 +0000162 FT_Request_Metrics( size->face, req );
Werner Lembergf1c2b912006-01-13 14:53:28 +0000163
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000164 funcs = cid_size_get_globals_funcs( (CID_Size)size );
Werner Lembergf41e71a2001-12-20 21:22:02 +0000165
David Turner85eb6692001-12-20 09:36:21 +0000166 if ( funcs )
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000167 funcs->set_scale( (PSH_Globals)size->internal,
168 size->metrics.x_scale,
169 size->metrics.y_scale,
170 0, 0 );
David Turner85eb6692001-12-20 09:36:21 +0000171
Wu, Chia-I (吳佳一)fa7d6ab2006-01-13 12:21:31 +0000172 return CID_Err_Ok;
Werner Lemberg3bcad432004-05-06 11:48:35 +0000173 }
174
175
Werner Lemberge3c11d72000-06-16 06:49:56 +0000176 /*************************************************************************/
177 /* */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000178 /* FACE FUNCTIONS */
179 /* */
180 /*************************************************************************/
David Turner04aa8002000-06-01 03:27:48 +0000181
Werner Lemberge3c11d72000-06-16 06:49:56 +0000182 /*************************************************************************/
183 /* */
184 /* <Function> */
David Turnerb08fe2d2002-08-27 20:20:29 +0000185 /* cid_face_done */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000186 /* */
187 /* <Description> */
188 /* Finalizes a given face object. */
189 /* */
190 /* <Input> */
191 /* face :: A pointer to the face object to destroy. */
192 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000193 FT_LOCAL_DEF( void )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000194 cid_face_done( FT_Face cidface ) /* CID_Face */
David Turner04aa8002000-06-01 03:27:48 +0000195 {
Werner Lemberg3bcad432004-05-06 11:48:35 +0000196 CID_Face face = (CID_Face)cidface;
David Turner04aa8002000-06-01 03:27:48 +0000197 FT_Memory memory;
198
Werner Lemberge3c11d72000-06-16 06:49:56 +0000199
200 if ( face )
David Turner04aa8002000-06-01 03:27:48 +0000201 {
David Turner29644172002-02-28 18:59:37 +0000202 CID_FaceInfo cid = &face->cid;
203 PS_FontInfo info = &cid->font_info;
Werner Lemberge3c11d72000-06-16 06:49:56 +0000204
David Turner04aa8002000-06-01 03:27:48 +0000205
Werner Lemberg3bcad432004-05-06 11:48:35 +0000206 memory = cidface->memory;
Werner Lemberge3c11d72000-06-16 06:49:56 +0000207
David Turner3a664fc2001-12-21 15:26:19 +0000208 /* release subrs */
209 if ( face->subrs )
210 {
Werner Lemberg44be4d52002-03-30 17:08:04 +0000211 FT_Int n;
David Turner17dd0632003-09-21 16:04:05 +0000212
Werner Lembergaf594e62001-12-22 14:38:40 +0000213
David Turner3a664fc2001-12-21 15:26:19 +0000214 for ( n = 0; n < cid->num_dicts; n++ )
215 {
David Turner29644172002-02-28 18:59:37 +0000216 CID_Subrs subr = face->subrs + n;
David Turner17dd0632003-09-21 16:04:05 +0000217
Werner Lembergaf594e62001-12-22 14:38:40 +0000218
David Turner3a664fc2001-12-21 15:26:19 +0000219 if ( subr->code )
220 {
David Turnere459d742002-03-22 13:52:37 +0000221 FT_FREE( subr->code[0] );
222 FT_FREE( subr->code );
David Turner3a664fc2001-12-21 15:26:19 +0000223 }
224 }
225
David Turnere459d742002-03-22 13:52:37 +0000226 FT_FREE( face->subrs );
David Turner3a664fc2001-12-21 15:26:19 +0000227 }
228
David Turner04aa8002000-06-01 03:27:48 +0000229 /* release FontInfo strings */
David Turnere459d742002-03-22 13:52:37 +0000230 FT_FREE( info->version );
231 FT_FREE( info->notice );
232 FT_FREE( info->full_name );
233 FT_FREE( info->family_name );
234 FT_FREE( info->weight );
Werner Lemberge3c11d72000-06-16 06:49:56 +0000235
David Turner04aa8002000-06-01 03:27:48 +0000236 /* release font dictionaries */
David Turnere459d742002-03-22 13:52:37 +0000237 FT_FREE( cid->font_dicts );
David Turner04aa8002000-06-01 03:27:48 +0000238 cid->num_dicts = 0;
Werner Lemberge3c11d72000-06-16 06:49:56 +0000239
David Turner04aa8002000-06-01 03:27:48 +0000240 /* release other strings */
David Turnere459d742002-03-22 13:52:37 +0000241 FT_FREE( cid->cid_font_name );
242 FT_FREE( cid->registry );
243 FT_FREE( cid->ordering );
Werner Lemberge3c11d72000-06-16 06:49:56 +0000244
Werner Lemberg3bcad432004-05-06 11:48:35 +0000245 cidface->family_name = 0;
246 cidface->style_name = 0;
Werner Lembergef512e32004-01-23 19:52:40 +0000247
248 FT_FREE( face->binary_data );
249 FT_FREE( face->cid_stream );
David Turner04aa8002000-06-01 03:27:48 +0000250 }
251 }
252
David Turner04aa8002000-06-01 03:27:48 +0000253
Werner Lemberge3c11d72000-06-16 06:49:56 +0000254 /*************************************************************************/
255 /* */
256 /* <Function> */
David Turnerb08fe2d2002-08-27 20:20:29 +0000257 /* cid_face_init */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000258 /* */
259 /* <Description> */
260 /* Initializes a given CID face object. */
261 /* */
262 /* <Input> */
263 /* stream :: The source font stream. */
264 /* */
265 /* face_index :: The index of the font face in the resource. */
266 /* */
267 /* num_params :: Number of additional generic parameters. Ignored. */
268 /* */
269 /* params :: Additional generic parameters. Ignored. */
270 /* */
271 /* <InOut> */
272 /* face :: The newly built face object. */
273 /* */
274 /* <Return> */
Werner Lemberga929ba92000-06-25 06:47:11 +0000275 /* FreeType error code. 0 means success. */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000276 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000277 FT_LOCAL_DEF( FT_Error )
David Turnerb08fe2d2002-08-27 20:20:29 +0000278 cid_face_init( FT_Stream stream,
Werner Lemberg3bcad432004-05-06 11:48:35 +0000279 FT_Face cidface, /* CID_Face */
Werner Lemberg93616ec2001-06-27 19:46:12 +0000280 FT_Int face_index,
281 FT_Int num_params,
282 FT_Parameter* params )
David Turner04aa8002000-06-01 03:27:48 +0000283 {
Werner Lembergf814f682005-05-22 20:33:09 +0000284 CID_Face face = (CID_Face)cidface;
285 FT_Error error;
286 PSAux_Service psaux;
287 PSHinter_Service pshinter;
David Turner04aa8002000-06-01 03:27:48 +0000288
David Turnerc6a92202000-07-04 18:12:13 +0000289 FT_UNUSED( num_params );
290 FT_UNUSED( params );
David Turnerc6a92202000-07-04 18:12:13 +0000291 FT_UNUSED( stream );
Werner Lemberge3c11d72000-06-16 06:49:56 +0000292
David Turner04aa8002000-06-01 03:27:48 +0000293
Werner Lemberg3bcad432004-05-06 11:48:35 +0000294 cidface->num_faces = 1;
David Turner04aa8002000-06-01 03:27:48 +0000295
David Turner4e7eeee2002-02-28 16:10:29 +0000296 psaux = (PSAux_Service)face->psaux;
David Turner34f1c2f2000-08-23 22:47:44 +0000297 if ( !psaux )
298 {
David Turner4e7eeee2002-02-28 16:10:29 +0000299 psaux = (PSAux_Service)FT_Get_Module_Interface(
Werner Lembergf41e71a2001-12-20 21:22:02 +0000300 FT_FACE_LIBRARY( face ), "psaux" );
Werner Lemberge4b32a52000-10-31 20:42:18 +0000301
David Turner34f1c2f2000-08-23 22:47:44 +0000302 face->psaux = psaux;
303 }
304
David Turner4e7eeee2002-02-28 16:10:29 +0000305 pshinter = (PSHinter_Service)face->pshinter;
David Turner85eb6692001-12-20 09:36:21 +0000306 if ( !pshinter )
307 {
David Turner4e7eeee2002-02-28 16:10:29 +0000308 pshinter = (PSHinter_Service)FT_Get_Module_Interface(
Werner Lembergf41e71a2001-12-20 21:22:02 +0000309 FT_FACE_LIBRARY( face ), "pshinter" );
David Turner85eb6692001-12-20 09:36:21 +0000310
311 face->pshinter = pshinter;
312 }
313
Werner Lemberge3c11d72000-06-16 06:49:56 +0000314 /* open the tokenizer; this will also check the font format */
David Turner7d3a2642002-03-20 10:49:31 +0000315 if ( FT_STREAM_SEEK( 0 ) )
David Turner04aa8002000-06-01 03:27:48 +0000316 goto Exit;
Werner Lemberge3c11d72000-06-16 06:49:56 +0000317
Werner Lembergef512e32004-01-23 19:52:40 +0000318 error = cid_face_open( face, face_index );
Werner Lemberge3c11d72000-06-16 06:49:56 +0000319 if ( error )
320 goto Exit;
David Turner04aa8002000-06-01 03:27:48 +0000321
322 /* if we just wanted to check the format, leave successfully now */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000323 if ( face_index < 0 )
David Turner04aa8002000-06-01 03:27:48 +0000324 goto Exit;
325
326 /* check the face index */
327 if ( face_index != 0 )
328 {
David Turnerb08fe2d2002-08-27 20:20:29 +0000329 FT_ERROR(( "cid_face_init: invalid face index\n" ));
Werner Lemberg1f7f0e82001-06-06 17:30:41 +0000330 error = CID_Err_Invalid_Argument;
David Turner04aa8002000-06-01 03:27:48 +0000331 goto Exit;
332 }
333
Werner Lembergfdc042b2003-06-12 04:59:07 +0000334 /* now load the font program into the face object */
335
336 /* initialize the face object fields */
337
338 /* set up root face fields */
David Turner04aa8002000-06-01 03:27:48 +0000339 {
Werner Lembergfdc042b2003-06-12 04:59:07 +0000340 CID_FaceInfo cid = &face->cid;
341 PS_FontInfo info = &cid->font_info;
342
343
Werner Lemberg3bcad432004-05-06 11:48:35 +0000344 cidface->num_glyphs = cid->cid_count;
345 cidface->num_charmaps = 0;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000346
Werner Lemberg3bcad432004-05-06 11:48:35 +0000347 cidface->face_index = face_index;
Werner Lemberg7734a1f2005-10-05 15:18:29 +0000348 cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
349 FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
350 FT_FACE_FLAG_HINTER; /* has native hinter */
Werner Lembergfdc042b2003-06-12 04:59:07 +0000351
Werner Lemberg64f1ba92003-07-25 22:09:53 +0000352 if ( info->is_fixed_pitch )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000353 cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000354
355 /* XXX: TODO: add kerning with .afm support */
356
357 /* get style name -- be careful, some broken fonts only */
358 /* have a /FontName dictionary entry! */
Werner Lemberg3bcad432004-05-06 11:48:35 +0000359 cidface->family_name = info->family_name;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000360 /* assume "Regular" style if we don't know better */
Werner Lemberg3bcad432004-05-06 11:48:35 +0000361 cidface->style_name = (char *)"Regular";
362 if ( cidface->family_name )
David Turner04aa8002000-06-01 03:27:48 +0000363 {
Werner Lembergfdc042b2003-06-12 04:59:07 +0000364 char* full = info->full_name;
Werner Lemberg3bcad432004-05-06 11:48:35 +0000365 char* family = cidface->family_name;
David Turner04aa8002000-06-01 03:27:48 +0000366
Werner Lemberge3c11d72000-06-16 06:49:56 +0000367
Werner Lembergfdc042b2003-06-12 04:59:07 +0000368 if ( full )
David Turner04aa8002000-06-01 03:27:48 +0000369 {
Werner Lembergfdc042b2003-06-12 04:59:07 +0000370 while ( *full )
David Turner04aa8002000-06-01 03:27:48 +0000371 {
Werner Lembergfdc042b2003-06-12 04:59:07 +0000372 if ( *full == *family )
373 {
374 family++;
375 full++;
376 }
377 else
378 {
379 if ( *full == ' ' || *full == '-' )
380 full++;
381 else if ( *family == ' ' || *family == '-' )
382 family++;
383 else
384 {
385 if ( !*family )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000386 cidface->style_name = full;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000387 break;
388 }
389 }
David Turner04aa8002000-06-01 03:27:48 +0000390 }
391 }
David Turner04aa8002000-06-01 03:27:48 +0000392 }
Werner Lembergfdc042b2003-06-12 04:59:07 +0000393 else
394 {
395 /* do we have a `/FontName'? */
396 if ( cid->cid_font_name )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000397 cidface->family_name = cid->cid_font_name;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000398 }
399
400 /* compute style flags */
Werner Lemberg3bcad432004-05-06 11:48:35 +0000401 cidface->style_flags = 0;
Werner Lemberg64f1ba92003-07-25 22:09:53 +0000402 if ( info->italic_angle )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000403 cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000404 if ( info->weight )
405 {
406 if ( !ft_strcmp( info->weight, "Bold" ) ||
407 !ft_strcmp( info->weight, "Black" ) )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000408 cidface->style_flags |= FT_STYLE_FLAG_BOLD;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000409 }
410
411 /* no embedded bitmap support */
Werner Lemberg3bcad432004-05-06 11:48:35 +0000412 cidface->num_fixed_sizes = 0;
413 cidface->available_sizes = 0;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000414
Werner Lemberg3bcad432004-05-06 11:48:35 +0000415 cidface->bbox.xMin = cid->font_bbox.xMin >> 16;
416 cidface->bbox.yMin = cid->font_bbox.yMin >> 16;
417 cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFFU ) >> 16;
418 cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFFU ) >> 16;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000419
Werner Lemberg3bcad432004-05-06 11:48:35 +0000420 if ( !cidface->units_per_EM )
421 cidface->units_per_EM = 1000;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000422
Werner Lemberg3bcad432004-05-06 11:48:35 +0000423 cidface->ascender = (FT_Short)( cidface->bbox.yMax );
424 cidface->descender = (FT_Short)( cidface->bbox.yMin );
Wu, Chia-I (吳佳一)5d146852006-01-31 10:29:44 +0000425
426 cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
427 if ( cidface->height < cidface->ascender - cidface->descender )
428 cidface->height = cidface->ascender - cidface->descender;
Werner Lembergfdc042b2003-06-12 04:59:07 +0000429
Werner Lemberg3bcad432004-05-06 11:48:35 +0000430 cidface->underline_position = (FT_Short)info->underline_position;
431 cidface->underline_thickness = (FT_Short)info->underline_thickness;
David Turner04aa8002000-06-01 03:27:48 +0000432 }
433
David Turner04aa8002000-06-01 03:27:48 +0000434 Exit:
435 return error;
436 }
437
438
Werner Lemberge3c11d72000-06-16 06:49:56 +0000439 /*************************************************************************/
440 /* */
441 /* <Function> */
David Turnerb08fe2d2002-08-27 20:20:29 +0000442 /* cid_driver_init */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000443 /* */
444 /* <Description> */
445 /* Initializes a given CID driver object. */
446 /* */
447 /* <Input> */
448 /* driver :: A handle to the target driver object. */
449 /* */
450 /* <Return> */
Werner Lemberga929ba92000-06-25 06:47:11 +0000451 /* FreeType error code. 0 means success. */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000452 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000453 FT_LOCAL_DEF( FT_Error )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000454 cid_driver_init( FT_Module driver )
David Turner04aa8002000-06-01 03:27:48 +0000455 {
David Turnerc6a92202000-07-04 18:12:13 +0000456 FT_UNUSED( driver );
Werner Lemberge3c11d72000-06-16 06:49:56 +0000457
Werner Lemberg1f7f0e82001-06-06 17:30:41 +0000458 return CID_Err_Ok;
David Turner04aa8002000-06-01 03:27:48 +0000459 }
460
461
Werner Lemberge3c11d72000-06-16 06:49:56 +0000462 /*************************************************************************/
463 /* */
464 /* <Function> */
David Turnerb08fe2d2002-08-27 20:20:29 +0000465 /* cid_driver_done */
Werner Lemberge3c11d72000-06-16 06:49:56 +0000466 /* */
467 /* <Description> */
468 /* Finalizes a given CID driver. */
469 /* */
470 /* <Input> */
471 /* driver :: A handle to the target CID driver. */
472 /* */
David Turnerbc82f1b2002-03-01 02:26:22 +0000473 FT_LOCAL_DEF( void )
Werner Lemberg3bcad432004-05-06 11:48:35 +0000474 cid_driver_done( FT_Module driver )
David Turner04aa8002000-06-01 03:27:48 +0000475 {
David Turnerc6a92202000-07-04 18:12:13 +0000476 FT_UNUSED( driver );
David Turner04aa8002000-06-01 03:27:48 +0000477 }
478
479
480/* END */