xref: /inferno-os/libfreetype/cidobjs.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  cidobjs.c                                                              */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    CID objects manager (body).                                          */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 1996-2001, 2002 by                                           */
8*37da2899SCharles.Forsyth /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9*37da2899SCharles.Forsyth /*                                                                         */
10*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
11*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
12*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
14*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
15*37da2899SCharles.Forsyth /*                                                                         */
16*37da2899SCharles.Forsyth /***************************************************************************/
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 
19*37da2899SCharles.Forsyth #include <ft2build.h>
20*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H
21*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H
22*37da2899SCharles.Forsyth #include "cidgload.h"
23*37da2899SCharles.Forsyth #include "cidload.h"
24*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H
25*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_AUX_H
26*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_HINTS_H
27*37da2899SCharles.Forsyth 
28*37da2899SCharles.Forsyth #include "ciderrs.h"
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth 
31*37da2899SCharles.Forsyth   /*************************************************************************/
32*37da2899SCharles.Forsyth   /*                                                                       */
33*37da2899SCharles.Forsyth   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
34*37da2899SCharles.Forsyth   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
35*37da2899SCharles.Forsyth   /* messages during execution.                                            */
36*37da2899SCharles.Forsyth   /*                                                                       */
37*37da2899SCharles.Forsyth #undef  FT_COMPONENT
38*37da2899SCharles.Forsyth #define FT_COMPONENT  trace_cidobjs
39*37da2899SCharles.Forsyth 
40*37da2899SCharles.Forsyth 
41*37da2899SCharles.Forsyth   /*************************************************************************/
42*37da2899SCharles.Forsyth   /*                                                                       */
43*37da2899SCharles.Forsyth   /*                            SLOT  FUNCTIONS                            */
44*37da2899SCharles.Forsyth   /*                                                                       */
45*37da2899SCharles.Forsyth   /*************************************************************************/
46*37da2899SCharles.Forsyth 
47*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
cid_slot_done(CID_GlyphSlot slot)48*37da2899SCharles.Forsyth   cid_slot_done( CID_GlyphSlot  slot )
49*37da2899SCharles.Forsyth   {
50*37da2899SCharles.Forsyth     slot->root.internal->glyph_hints = 0;
51*37da2899SCharles.Forsyth   }
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth 
54*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
cid_slot_init(CID_GlyphSlot slot)55*37da2899SCharles.Forsyth   cid_slot_init( CID_GlyphSlot  slot )
56*37da2899SCharles.Forsyth   {
57*37da2899SCharles.Forsyth     CID_Face          face;
58*37da2899SCharles.Forsyth     PSHinter_Service  pshinter;
59*37da2899SCharles.Forsyth 
60*37da2899SCharles.Forsyth 
61*37da2899SCharles.Forsyth     face     = (CID_Face)slot->root.face;
62*37da2899SCharles.Forsyth     pshinter = (PSHinter_Service)face->pshinter;
63*37da2899SCharles.Forsyth 
64*37da2899SCharles.Forsyth     if ( pshinter )
65*37da2899SCharles.Forsyth     {
66*37da2899SCharles.Forsyth       FT_Module  module;
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth 
69*37da2899SCharles.Forsyth       module = FT_Get_Module( slot->root.face->driver->root.library,
70*37da2899SCharles.Forsyth                               "pshinter" );
71*37da2899SCharles.Forsyth       if ( module )
72*37da2899SCharles.Forsyth       {
73*37da2899SCharles.Forsyth         T1_Hints_Funcs  funcs;
74*37da2899SCharles.Forsyth 
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth         funcs = pshinter->get_t1_funcs( module );
77*37da2899SCharles.Forsyth         slot->root.internal->glyph_hints = (void*)funcs;
78*37da2899SCharles.Forsyth       }
79*37da2899SCharles.Forsyth     }
80*37da2899SCharles.Forsyth 
81*37da2899SCharles.Forsyth     return 0;
82*37da2899SCharles.Forsyth   }
83*37da2899SCharles.Forsyth 
84*37da2899SCharles.Forsyth 
85*37da2899SCharles.Forsyth   /*************************************************************************/
86*37da2899SCharles.Forsyth   /*                                                                       */
87*37da2899SCharles.Forsyth   /*                           SIZE  FUNCTIONS                             */
88*37da2899SCharles.Forsyth   /*                                                                       */
89*37da2899SCharles.Forsyth   /*************************************************************************/
90*37da2899SCharles.Forsyth 
91*37da2899SCharles.Forsyth 
92*37da2899SCharles.Forsyth   static PSH_Globals_Funcs
cid_size_get_globals_funcs(CID_Size size)93*37da2899SCharles.Forsyth   cid_size_get_globals_funcs( CID_Size  size )
94*37da2899SCharles.Forsyth   {
95*37da2899SCharles.Forsyth     CID_Face          face     = (CID_Face)size->root.face;
96*37da2899SCharles.Forsyth     PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
97*37da2899SCharles.Forsyth     FT_Module         module;
98*37da2899SCharles.Forsyth 
99*37da2899SCharles.Forsyth 
100*37da2899SCharles.Forsyth     module = FT_Get_Module( size->root.face->driver->root.library,
101*37da2899SCharles.Forsyth                             "pshinter" );
102*37da2899SCharles.Forsyth     return ( module && pshinter && pshinter->get_globals_funcs )
103*37da2899SCharles.Forsyth            ? pshinter->get_globals_funcs( module )
104*37da2899SCharles.Forsyth            : 0;
105*37da2899SCharles.Forsyth   }
106*37da2899SCharles.Forsyth 
107*37da2899SCharles.Forsyth 
108*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
cid_size_done(CID_Size size)109*37da2899SCharles.Forsyth   cid_size_done( CID_Size  size )
110*37da2899SCharles.Forsyth   {
111*37da2899SCharles.Forsyth     if ( size->root.internal )
112*37da2899SCharles.Forsyth     {
113*37da2899SCharles.Forsyth       PSH_Globals_Funcs  funcs;
114*37da2899SCharles.Forsyth 
115*37da2899SCharles.Forsyth 
116*37da2899SCharles.Forsyth       funcs = cid_size_get_globals_funcs( size );
117*37da2899SCharles.Forsyth       if ( funcs )
118*37da2899SCharles.Forsyth         funcs->destroy( (PSH_Globals)size->root.internal );
119*37da2899SCharles.Forsyth 
120*37da2899SCharles.Forsyth       size->root.internal = 0;
121*37da2899SCharles.Forsyth     }
122*37da2899SCharles.Forsyth   }
123*37da2899SCharles.Forsyth 
124*37da2899SCharles.Forsyth 
125*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
cid_size_init(CID_Size size)126*37da2899SCharles.Forsyth   cid_size_init( CID_Size  size )
127*37da2899SCharles.Forsyth   {
128*37da2899SCharles.Forsyth     FT_Error           error = 0;
129*37da2899SCharles.Forsyth     PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );
130*37da2899SCharles.Forsyth 
131*37da2899SCharles.Forsyth 
132*37da2899SCharles.Forsyth     if ( funcs )
133*37da2899SCharles.Forsyth     {
134*37da2899SCharles.Forsyth       PSH_Globals   globals;
135*37da2899SCharles.Forsyth       CID_Face      face = (CID_Face)size->root.face;
136*37da2899SCharles.Forsyth       CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;
137*37da2899SCharles.Forsyth       PS_Private    priv = &dict->private_dict;
138*37da2899SCharles.Forsyth 
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth       error = funcs->create( size->root.face->memory, priv, &globals );
141*37da2899SCharles.Forsyth       if ( !error )
142*37da2899SCharles.Forsyth         size->root.internal = (FT_Size_Internal)(void*)globals;
143*37da2899SCharles.Forsyth     }
144*37da2899SCharles.Forsyth 
145*37da2899SCharles.Forsyth     return error;
146*37da2899SCharles.Forsyth   }
147*37da2899SCharles.Forsyth 
148*37da2899SCharles.Forsyth 
149*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
cid_size_reset(CID_Size size)150*37da2899SCharles.Forsyth   cid_size_reset( CID_Size  size )
151*37da2899SCharles.Forsyth   {
152*37da2899SCharles.Forsyth     PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );
153*37da2899SCharles.Forsyth     FT_Error           error = 0;
154*37da2899SCharles.Forsyth 
155*37da2899SCharles.Forsyth 
156*37da2899SCharles.Forsyth     if ( funcs )
157*37da2899SCharles.Forsyth       error = funcs->set_scale( (PSH_Globals)size->root.internal,
158*37da2899SCharles.Forsyth                                  size->root.metrics.x_scale,
159*37da2899SCharles.Forsyth                                  size->root.metrics.y_scale,
160*37da2899SCharles.Forsyth                                  0, 0 );
161*37da2899SCharles.Forsyth     return error;
162*37da2899SCharles.Forsyth   }
163*37da2899SCharles.Forsyth 
164*37da2899SCharles.Forsyth 
165*37da2899SCharles.Forsyth   /*************************************************************************/
166*37da2899SCharles.Forsyth   /*                                                                       */
167*37da2899SCharles.Forsyth   /*                           FACE  FUNCTIONS                             */
168*37da2899SCharles.Forsyth   /*                                                                       */
169*37da2899SCharles.Forsyth   /*************************************************************************/
170*37da2899SCharles.Forsyth 
171*37da2899SCharles.Forsyth   /*************************************************************************/
172*37da2899SCharles.Forsyth   /*                                                                       */
173*37da2899SCharles.Forsyth   /* <Function>                                                            */
174*37da2899SCharles.Forsyth   /*    cid_face_done                                                      */
175*37da2899SCharles.Forsyth   /*                                                                       */
176*37da2899SCharles.Forsyth   /* <Description>                                                         */
177*37da2899SCharles.Forsyth   /*    Finalizes a given face object.                                     */
178*37da2899SCharles.Forsyth   /*                                                                       */
179*37da2899SCharles.Forsyth   /* <Input>                                                               */
180*37da2899SCharles.Forsyth   /*    face :: A pointer to the face object to destroy.                   */
181*37da2899SCharles.Forsyth   /*                                                                       */
182*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
cid_face_done(CID_Face face)183*37da2899SCharles.Forsyth   cid_face_done( CID_Face  face )
184*37da2899SCharles.Forsyth   {
185*37da2899SCharles.Forsyth     FT_Memory  memory;
186*37da2899SCharles.Forsyth 
187*37da2899SCharles.Forsyth 
188*37da2899SCharles.Forsyth     if ( face )
189*37da2899SCharles.Forsyth     {
190*37da2899SCharles.Forsyth       CID_FaceInfo  cid  = &face->cid;
191*37da2899SCharles.Forsyth       PS_FontInfo   info = &cid->font_info;
192*37da2899SCharles.Forsyth 
193*37da2899SCharles.Forsyth 
194*37da2899SCharles.Forsyth       memory = face->root.memory;
195*37da2899SCharles.Forsyth 
196*37da2899SCharles.Forsyth       /* release subrs */
197*37da2899SCharles.Forsyth       if ( face->subrs )
198*37da2899SCharles.Forsyth       {
199*37da2899SCharles.Forsyth         FT_Int  n;
200*37da2899SCharles.Forsyth 
201*37da2899SCharles.Forsyth 
202*37da2899SCharles.Forsyth         for ( n = 0; n < cid->num_dicts; n++ )
203*37da2899SCharles.Forsyth         {
204*37da2899SCharles.Forsyth           CID_Subrs  subr = face->subrs + n;
205*37da2899SCharles.Forsyth 
206*37da2899SCharles.Forsyth 
207*37da2899SCharles.Forsyth           if ( subr->code )
208*37da2899SCharles.Forsyth           {
209*37da2899SCharles.Forsyth             FT_FREE( subr->code[0] );
210*37da2899SCharles.Forsyth             FT_FREE( subr->code );
211*37da2899SCharles.Forsyth           }
212*37da2899SCharles.Forsyth         }
213*37da2899SCharles.Forsyth 
214*37da2899SCharles.Forsyth         FT_FREE( face->subrs );
215*37da2899SCharles.Forsyth       }
216*37da2899SCharles.Forsyth 
217*37da2899SCharles.Forsyth       /* release FontInfo strings */
218*37da2899SCharles.Forsyth       FT_FREE( info->version );
219*37da2899SCharles.Forsyth       FT_FREE( info->notice );
220*37da2899SCharles.Forsyth       FT_FREE( info->full_name );
221*37da2899SCharles.Forsyth       FT_FREE( info->family_name );
222*37da2899SCharles.Forsyth       FT_FREE( info->weight );
223*37da2899SCharles.Forsyth 
224*37da2899SCharles.Forsyth       /* release font dictionaries */
225*37da2899SCharles.Forsyth       FT_FREE( cid->font_dicts );
226*37da2899SCharles.Forsyth       cid->num_dicts = 0;
227*37da2899SCharles.Forsyth 
228*37da2899SCharles.Forsyth       /* release other strings */
229*37da2899SCharles.Forsyth       FT_FREE( cid->cid_font_name );
230*37da2899SCharles.Forsyth       FT_FREE( cid->registry );
231*37da2899SCharles.Forsyth       FT_FREE( cid->ordering );
232*37da2899SCharles.Forsyth 
233*37da2899SCharles.Forsyth       face->root.family_name = 0;
234*37da2899SCharles.Forsyth       face->root.style_name  = 0;
235*37da2899SCharles.Forsyth     }
236*37da2899SCharles.Forsyth   }
237*37da2899SCharles.Forsyth 
238*37da2899SCharles.Forsyth 
239*37da2899SCharles.Forsyth   /*************************************************************************/
240*37da2899SCharles.Forsyth   /*                                                                       */
241*37da2899SCharles.Forsyth   /* <Function>                                                            */
242*37da2899SCharles.Forsyth   /*    cid_face_init                                                      */
243*37da2899SCharles.Forsyth   /*                                                                       */
244*37da2899SCharles.Forsyth   /* <Description>                                                         */
245*37da2899SCharles.Forsyth   /*    Initializes a given CID face object.                               */
246*37da2899SCharles.Forsyth   /*                                                                       */
247*37da2899SCharles.Forsyth   /* <Input>                                                               */
248*37da2899SCharles.Forsyth   /*    stream     :: The source font stream.                              */
249*37da2899SCharles.Forsyth   /*                                                                       */
250*37da2899SCharles.Forsyth   /*    face_index :: The index of the font face in the resource.          */
251*37da2899SCharles.Forsyth   /*                                                                       */
252*37da2899SCharles.Forsyth   /*    num_params :: Number of additional generic parameters.  Ignored.   */
253*37da2899SCharles.Forsyth   /*                                                                       */
254*37da2899SCharles.Forsyth   /*    params     :: Additional generic parameters.  Ignored.             */
255*37da2899SCharles.Forsyth   /*                                                                       */
256*37da2899SCharles.Forsyth   /* <InOut>                                                               */
257*37da2899SCharles.Forsyth   /*    face       :: The newly built face object.                         */
258*37da2899SCharles.Forsyth   /*                                                                       */
259*37da2899SCharles.Forsyth   /* <Return>                                                              */
260*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
261*37da2899SCharles.Forsyth   /*                                                                       */
262*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
cid_face_init(FT_Stream stream,CID_Face face,FT_Int face_index,FT_Int num_params,FT_Parameter * params)263*37da2899SCharles.Forsyth   cid_face_init( FT_Stream      stream,
264*37da2899SCharles.Forsyth                  CID_Face       face,
265*37da2899SCharles.Forsyth                  FT_Int         face_index,
266*37da2899SCharles.Forsyth                  FT_Int         num_params,
267*37da2899SCharles.Forsyth                  FT_Parameter*  params )
268*37da2899SCharles.Forsyth   {
269*37da2899SCharles.Forsyth     FT_Error          error;
270*37da2899SCharles.Forsyth     PSNames_Service   psnames;
271*37da2899SCharles.Forsyth     PSAux_Service     psaux;
272*37da2899SCharles.Forsyth     PSHinter_Service  pshinter;
273*37da2899SCharles.Forsyth 
274*37da2899SCharles.Forsyth     FT_UNUSED( num_params );
275*37da2899SCharles.Forsyth     FT_UNUSED( params );
276*37da2899SCharles.Forsyth     FT_UNUSED( face_index );
277*37da2899SCharles.Forsyth     FT_UNUSED( stream );
278*37da2899SCharles.Forsyth 
279*37da2899SCharles.Forsyth 
280*37da2899SCharles.Forsyth     face->root.num_faces = 1;
281*37da2899SCharles.Forsyth 
282*37da2899SCharles.Forsyth     psnames = (PSNames_Service)face->psnames;
283*37da2899SCharles.Forsyth     if ( !psnames )
284*37da2899SCharles.Forsyth     {
285*37da2899SCharles.Forsyth       psnames = (PSNames_Service)FT_Get_Module_Interface(
286*37da2899SCharles.Forsyth                   FT_FACE_LIBRARY( face ), "psnames" );
287*37da2899SCharles.Forsyth 
288*37da2899SCharles.Forsyth       face->psnames = psnames;
289*37da2899SCharles.Forsyth     }
290*37da2899SCharles.Forsyth 
291*37da2899SCharles.Forsyth     psaux = (PSAux_Service)face->psaux;
292*37da2899SCharles.Forsyth     if ( !psaux )
293*37da2899SCharles.Forsyth     {
294*37da2899SCharles.Forsyth       psaux = (PSAux_Service)FT_Get_Module_Interface(
295*37da2899SCharles.Forsyth                 FT_FACE_LIBRARY( face ), "psaux" );
296*37da2899SCharles.Forsyth 
297*37da2899SCharles.Forsyth       face->psaux = psaux;
298*37da2899SCharles.Forsyth     }
299*37da2899SCharles.Forsyth 
300*37da2899SCharles.Forsyth     pshinter = (PSHinter_Service)face->pshinter;
301*37da2899SCharles.Forsyth     if ( !pshinter )
302*37da2899SCharles.Forsyth     {
303*37da2899SCharles.Forsyth       pshinter = (PSHinter_Service)FT_Get_Module_Interface(
304*37da2899SCharles.Forsyth                    FT_FACE_LIBRARY( face ), "pshinter" );
305*37da2899SCharles.Forsyth 
306*37da2899SCharles.Forsyth       face->pshinter = pshinter;
307*37da2899SCharles.Forsyth     }
308*37da2899SCharles.Forsyth 
309*37da2899SCharles.Forsyth     /* open the tokenizer; this will also check the font format */
310*37da2899SCharles.Forsyth     if ( FT_STREAM_SEEK( 0 ) )
311*37da2899SCharles.Forsyth       goto Exit;
312*37da2899SCharles.Forsyth 
313*37da2899SCharles.Forsyth     error = cid_face_open( face );
314*37da2899SCharles.Forsyth     if ( error )
315*37da2899SCharles.Forsyth       goto Exit;
316*37da2899SCharles.Forsyth 
317*37da2899SCharles.Forsyth     /* if we just wanted to check the format, leave successfully now */
318*37da2899SCharles.Forsyth     if ( face_index < 0 )
319*37da2899SCharles.Forsyth       goto Exit;
320*37da2899SCharles.Forsyth 
321*37da2899SCharles.Forsyth     /* check the face index */
322*37da2899SCharles.Forsyth     if ( face_index != 0 )
323*37da2899SCharles.Forsyth     {
324*37da2899SCharles.Forsyth       FT_ERROR(( "cid_face_init: invalid face index\n" ));
325*37da2899SCharles.Forsyth       error = CID_Err_Invalid_Argument;
326*37da2899SCharles.Forsyth       goto Exit;
327*37da2899SCharles.Forsyth     }
328*37da2899SCharles.Forsyth 
329*37da2899SCharles.Forsyth     /* Now, load the font program into the face object */
330*37da2899SCharles.Forsyth     {
331*37da2899SCharles.Forsyth       /* Init the face object fields */
332*37da2899SCharles.Forsyth       /* Now set up root face fields */
333*37da2899SCharles.Forsyth       {
334*37da2899SCharles.Forsyth         FT_Face  root = (FT_Face)&face->root;
335*37da2899SCharles.Forsyth 
336*37da2899SCharles.Forsyth 
337*37da2899SCharles.Forsyth         root->num_glyphs   = face->cid.cid_count;
338*37da2899SCharles.Forsyth         root->num_charmaps = 0;
339*37da2899SCharles.Forsyth 
340*37da2899SCharles.Forsyth         root->face_index = face_index;
341*37da2899SCharles.Forsyth         root->face_flags = FT_FACE_FLAG_SCALABLE;
342*37da2899SCharles.Forsyth 
343*37da2899SCharles.Forsyth         root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
344*37da2899SCharles.Forsyth 
345*37da2899SCharles.Forsyth         if ( face->cid.font_info.is_fixed_pitch )
346*37da2899SCharles.Forsyth           root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
347*37da2899SCharles.Forsyth 
348*37da2899SCharles.Forsyth         /* XXX: TODO: add kerning with .afm support */
349*37da2899SCharles.Forsyth 
350*37da2899SCharles.Forsyth         /* get style name -- be careful, some broken fonts only */
351*37da2899SCharles.Forsyth         /* have a /FontName dictionary entry!                   */
352*37da2899SCharles.Forsyth         root->family_name = face->cid.font_info.family_name;
353*37da2899SCharles.Forsyth         if ( root->family_name )
354*37da2899SCharles.Forsyth         {
355*37da2899SCharles.Forsyth           char*  full   = face->cid.font_info.full_name;
356*37da2899SCharles.Forsyth           char*  family = root->family_name;
357*37da2899SCharles.Forsyth 
358*37da2899SCharles.Forsyth           while ( *family && *full == *family )
359*37da2899SCharles.Forsyth           {
360*37da2899SCharles.Forsyth             family++;
361*37da2899SCharles.Forsyth             full++;
362*37da2899SCharles.Forsyth           }
363*37da2899SCharles.Forsyth 
364*37da2899SCharles.Forsyth           root->style_name = ( *full == ' ' ) ? full + 1
365*37da2899SCharles.Forsyth                                               : (char *)"Regular";
366*37da2899SCharles.Forsyth         }
367*37da2899SCharles.Forsyth         else
368*37da2899SCharles.Forsyth         {
369*37da2899SCharles.Forsyth           /* do we have a `/FontName'? */
370*37da2899SCharles.Forsyth           if ( face->cid.cid_font_name )
371*37da2899SCharles.Forsyth           {
372*37da2899SCharles.Forsyth             root->family_name = face->cid.cid_font_name;
373*37da2899SCharles.Forsyth             root->style_name  = (char *)"Regular";
374*37da2899SCharles.Forsyth           }
375*37da2899SCharles.Forsyth         }
376*37da2899SCharles.Forsyth 
377*37da2899SCharles.Forsyth         /* no embedded bitmap support */
378*37da2899SCharles.Forsyth         root->num_fixed_sizes = 0;
379*37da2899SCharles.Forsyth         root->available_sizes = 0;
380*37da2899SCharles.Forsyth 
381*37da2899SCharles.Forsyth         root->bbox.xMin =   face->cid.font_bbox.xMin             >> 16;
382*37da2899SCharles.Forsyth         root->bbox.yMin =   face->cid.font_bbox.yMin             >> 16;
383*37da2899SCharles.Forsyth         root->bbox.xMax = ( face->cid.font_bbox.xMax + 0xFFFFU ) >> 16;
384*37da2899SCharles.Forsyth         root->bbox.yMax = ( face->cid.font_bbox.yMax + 0xFFFFU ) >> 16;
385*37da2899SCharles.Forsyth 
386*37da2899SCharles.Forsyth         if ( !root->units_per_EM )
387*37da2899SCharles.Forsyth           root->units_per_EM  = 1000;
388*37da2899SCharles.Forsyth 
389*37da2899SCharles.Forsyth         root->ascender  = (FT_Short)( root->bbox.yMax );
390*37da2899SCharles.Forsyth         root->descender = (FT_Short)( root->bbox.yMin );
391*37da2899SCharles.Forsyth         root->height    = (FT_Short)(
392*37da2899SCharles.Forsyth           ( ( root->ascender + root->descender ) * 12 ) / 10 );
393*37da2899SCharles.Forsyth 
394*37da2899SCharles.Forsyth         root->underline_position  = face->cid.font_info.underline_position;
395*37da2899SCharles.Forsyth         root->underline_thickness = face->cid.font_info.underline_thickness;
396*37da2899SCharles.Forsyth 
397*37da2899SCharles.Forsyth         root->internal->max_points   = 0;
398*37da2899SCharles.Forsyth         root->internal->max_contours = 0;
399*37da2899SCharles.Forsyth       }
400*37da2899SCharles.Forsyth     }
401*37da2899SCharles.Forsyth 
402*37da2899SCharles.Forsyth   Exit:
403*37da2899SCharles.Forsyth     return error;
404*37da2899SCharles.Forsyth   }
405*37da2899SCharles.Forsyth 
406*37da2899SCharles.Forsyth 
407*37da2899SCharles.Forsyth   /*************************************************************************/
408*37da2899SCharles.Forsyth   /*                                                                       */
409*37da2899SCharles.Forsyth   /* <Function>                                                            */
410*37da2899SCharles.Forsyth   /*    cid_driver_init                                                    */
411*37da2899SCharles.Forsyth   /*                                                                       */
412*37da2899SCharles.Forsyth   /* <Description>                                                         */
413*37da2899SCharles.Forsyth   /*    Initializes a given CID driver object.                             */
414*37da2899SCharles.Forsyth   /*                                                                       */
415*37da2899SCharles.Forsyth   /* <Input>                                                               */
416*37da2899SCharles.Forsyth   /*    driver :: A handle to the target driver object.                    */
417*37da2899SCharles.Forsyth   /*                                                                       */
418*37da2899SCharles.Forsyth   /* <Return>                                                              */
419*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
420*37da2899SCharles.Forsyth   /*                                                                       */
421*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
cid_driver_init(CID_Driver driver)422*37da2899SCharles.Forsyth   cid_driver_init( CID_Driver  driver )
423*37da2899SCharles.Forsyth   {
424*37da2899SCharles.Forsyth     FT_UNUSED( driver );
425*37da2899SCharles.Forsyth 
426*37da2899SCharles.Forsyth     return CID_Err_Ok;
427*37da2899SCharles.Forsyth   }
428*37da2899SCharles.Forsyth 
429*37da2899SCharles.Forsyth 
430*37da2899SCharles.Forsyth   /*************************************************************************/
431*37da2899SCharles.Forsyth   /*                                                                       */
432*37da2899SCharles.Forsyth   /* <Function>                                                            */
433*37da2899SCharles.Forsyth   /*    cid_driver_done                                                    */
434*37da2899SCharles.Forsyth   /*                                                                       */
435*37da2899SCharles.Forsyth   /* <Description>                                                         */
436*37da2899SCharles.Forsyth   /*    Finalizes a given CID driver.                                      */
437*37da2899SCharles.Forsyth   /*                                                                       */
438*37da2899SCharles.Forsyth   /* <Input>                                                               */
439*37da2899SCharles.Forsyth   /*    driver :: A handle to the target CID driver.                       */
440*37da2899SCharles.Forsyth   /*                                                                       */
441*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
cid_driver_done(CID_Driver driver)442*37da2899SCharles.Forsyth   cid_driver_done( CID_Driver  driver )
443*37da2899SCharles.Forsyth   {
444*37da2899SCharles.Forsyth     FT_UNUSED( driver );
445*37da2899SCharles.Forsyth   }
446*37da2899SCharles.Forsyth 
447*37da2899SCharles.Forsyth 
448*37da2899SCharles.Forsyth /* END */
449