xref: /inferno-os/libfreetype/t1objs.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  t1objs.c                                                               */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    Type 1 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 
23*37da2899SCharles.Forsyth #include "t1gload.h"
24*37da2899SCharles.Forsyth #include "t1load.h"
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth #include "t1errors.h"
27*37da2899SCharles.Forsyth 
28*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_AFM
29*37da2899SCharles.Forsyth #include "t1afm.h"
30*37da2899SCharles.Forsyth #endif
31*37da2899SCharles.Forsyth 
32*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H
33*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_AUX_H
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth 
36*37da2899SCharles.Forsyth   /*************************************************************************/
37*37da2899SCharles.Forsyth   /*                                                                       */
38*37da2899SCharles.Forsyth   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
39*37da2899SCharles.Forsyth   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
40*37da2899SCharles.Forsyth   /* messages during execution.                                            */
41*37da2899SCharles.Forsyth   /*                                                                       */
42*37da2899SCharles.Forsyth #undef  FT_COMPONENT
43*37da2899SCharles.Forsyth #define FT_COMPONENT  trace_t1objs
44*37da2899SCharles.Forsyth 
45*37da2899SCharles.Forsyth 
46*37da2899SCharles.Forsyth   /*************************************************************************/
47*37da2899SCharles.Forsyth   /*                                                                       */
48*37da2899SCharles.Forsyth   /*                            SIZE FUNCTIONS                             */
49*37da2899SCharles.Forsyth   /*                                                                       */
50*37da2899SCharles.Forsyth   /*  note that we store the global hints in the size's "internal" root    */
51*37da2899SCharles.Forsyth   /*  field                                                                */
52*37da2899SCharles.Forsyth   /*                                                                       */
53*37da2899SCharles.Forsyth   /*************************************************************************/
54*37da2899SCharles.Forsyth 
55*37da2899SCharles.Forsyth 
56*37da2899SCharles.Forsyth   static PSH_Globals_Funcs
T1_Size_Get_Globals_Funcs(T1_Size size)57*37da2899SCharles.Forsyth   T1_Size_Get_Globals_Funcs( T1_Size  size )
58*37da2899SCharles.Forsyth   {
59*37da2899SCharles.Forsyth     T1_Face           face     = (T1_Face)size->root.face;
60*37da2899SCharles.Forsyth     PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
61*37da2899SCharles.Forsyth     FT_Module         module;
62*37da2899SCharles.Forsyth 
63*37da2899SCharles.Forsyth 
64*37da2899SCharles.Forsyth     module = FT_Get_Module( size->root.face->driver->root.library,
65*37da2899SCharles.Forsyth                             "pshinter" );
66*37da2899SCharles.Forsyth     return ( module && pshinter && pshinter->get_globals_funcs )
67*37da2899SCharles.Forsyth            ? pshinter->get_globals_funcs( module )
68*37da2899SCharles.Forsyth            : 0 ;
69*37da2899SCharles.Forsyth   }
70*37da2899SCharles.Forsyth 
71*37da2899SCharles.Forsyth 
72*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
T1_Size_Done(T1_Size size)73*37da2899SCharles.Forsyth   T1_Size_Done( T1_Size  size )
74*37da2899SCharles.Forsyth   {
75*37da2899SCharles.Forsyth     if ( size->root.internal )
76*37da2899SCharles.Forsyth     {
77*37da2899SCharles.Forsyth       PSH_Globals_Funcs  funcs;
78*37da2899SCharles.Forsyth 
79*37da2899SCharles.Forsyth 
80*37da2899SCharles.Forsyth       funcs = T1_Size_Get_Globals_Funcs( size );
81*37da2899SCharles.Forsyth       if ( funcs )
82*37da2899SCharles.Forsyth         funcs->destroy( (PSH_Globals)size->root.internal );
83*37da2899SCharles.Forsyth 
84*37da2899SCharles.Forsyth       size->root.internal = 0;
85*37da2899SCharles.Forsyth     }
86*37da2899SCharles.Forsyth   }
87*37da2899SCharles.Forsyth 
88*37da2899SCharles.Forsyth 
89*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
T1_Size_Init(T1_Size size)90*37da2899SCharles.Forsyth   T1_Size_Init( T1_Size  size )
91*37da2899SCharles.Forsyth   {
92*37da2899SCharles.Forsyth     FT_Error           error = 0;
93*37da2899SCharles.Forsyth     PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
94*37da2899SCharles.Forsyth 
95*37da2899SCharles.Forsyth 
96*37da2899SCharles.Forsyth     if ( funcs )
97*37da2899SCharles.Forsyth     {
98*37da2899SCharles.Forsyth       PSH_Globals  globals;
99*37da2899SCharles.Forsyth       T1_Face      face = (T1_Face)size->root.face;
100*37da2899SCharles.Forsyth 
101*37da2899SCharles.Forsyth 
102*37da2899SCharles.Forsyth       error = funcs->create( size->root.face->memory,
103*37da2899SCharles.Forsyth                              &face->type1.private_dict, &globals );
104*37da2899SCharles.Forsyth       if ( !error )
105*37da2899SCharles.Forsyth         size->root.internal = (FT_Size_Internal)(void*)globals;
106*37da2899SCharles.Forsyth     }
107*37da2899SCharles.Forsyth 
108*37da2899SCharles.Forsyth     return error;
109*37da2899SCharles.Forsyth   }
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth 
112*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
T1_Size_Reset(T1_Size size)113*37da2899SCharles.Forsyth   T1_Size_Reset( T1_Size  size )
114*37da2899SCharles.Forsyth   {
115*37da2899SCharles.Forsyth     PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
116*37da2899SCharles.Forsyth     FT_Error           error = 0;
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth 
119*37da2899SCharles.Forsyth     if ( funcs )
120*37da2899SCharles.Forsyth       error = funcs->set_scale( (PSH_Globals)size->root.internal,
121*37da2899SCharles.Forsyth                                  size->root.metrics.x_scale,
122*37da2899SCharles.Forsyth                                  size->root.metrics.y_scale,
123*37da2899SCharles.Forsyth                                  0, 0 );
124*37da2899SCharles.Forsyth     return error;
125*37da2899SCharles.Forsyth   }
126*37da2899SCharles.Forsyth 
127*37da2899SCharles.Forsyth 
128*37da2899SCharles.Forsyth   /*************************************************************************/
129*37da2899SCharles.Forsyth   /*                                                                       */
130*37da2899SCharles.Forsyth   /*                            SLOT  FUNCTIONS                            */
131*37da2899SCharles.Forsyth   /*                                                                       */
132*37da2899SCharles.Forsyth   /*************************************************************************/
133*37da2899SCharles.Forsyth 
134*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
T1_GlyphSlot_Done(T1_GlyphSlot slot)135*37da2899SCharles.Forsyth   T1_GlyphSlot_Done( T1_GlyphSlot  slot )
136*37da2899SCharles.Forsyth   {
137*37da2899SCharles.Forsyth     slot->root.internal->glyph_hints = 0;
138*37da2899SCharles.Forsyth   }
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth 
141*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
T1_GlyphSlot_Init(T1_GlyphSlot slot)142*37da2899SCharles.Forsyth   T1_GlyphSlot_Init( T1_GlyphSlot  slot )
143*37da2899SCharles.Forsyth   {
144*37da2899SCharles.Forsyth     T1_Face           face;
145*37da2899SCharles.Forsyth     PSHinter_Service  pshinter;
146*37da2899SCharles.Forsyth 
147*37da2899SCharles.Forsyth 
148*37da2899SCharles.Forsyth     face     = (T1_Face)slot->root.face;
149*37da2899SCharles.Forsyth     pshinter = (PSHinter_Service)face->pshinter;
150*37da2899SCharles.Forsyth 
151*37da2899SCharles.Forsyth     if ( pshinter )
152*37da2899SCharles.Forsyth     {
153*37da2899SCharles.Forsyth       FT_Module  module;
154*37da2899SCharles.Forsyth 
155*37da2899SCharles.Forsyth 
156*37da2899SCharles.Forsyth       module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" );
157*37da2899SCharles.Forsyth       if (module)
158*37da2899SCharles.Forsyth       {
159*37da2899SCharles.Forsyth         T1_Hints_Funcs  funcs;
160*37da2899SCharles.Forsyth 
161*37da2899SCharles.Forsyth         funcs = pshinter->get_t1_funcs( module );
162*37da2899SCharles.Forsyth         slot->root.internal->glyph_hints = (void*)funcs;
163*37da2899SCharles.Forsyth       }
164*37da2899SCharles.Forsyth     }
165*37da2899SCharles.Forsyth     return 0;
166*37da2899SCharles.Forsyth   }
167*37da2899SCharles.Forsyth 
168*37da2899SCharles.Forsyth 
169*37da2899SCharles.Forsyth   /*************************************************************************/
170*37da2899SCharles.Forsyth   /*                                                                       */
171*37da2899SCharles.Forsyth   /*                            FACE  FUNCTIONS                            */
172*37da2899SCharles.Forsyth   /*                                                                       */
173*37da2899SCharles.Forsyth   /*************************************************************************/
174*37da2899SCharles.Forsyth 
175*37da2899SCharles.Forsyth 
176*37da2899SCharles.Forsyth   /*************************************************************************/
177*37da2899SCharles.Forsyth   /*                                                                       */
178*37da2899SCharles.Forsyth   /* <Function>                                                            */
179*37da2899SCharles.Forsyth   /*    T1_Face_Done                                                       */
180*37da2899SCharles.Forsyth   /*                                                                       */
181*37da2899SCharles.Forsyth   /* <Description>                                                         */
182*37da2899SCharles.Forsyth   /*    The face object destructor.                                        */
183*37da2899SCharles.Forsyth   /*                                                                       */
184*37da2899SCharles.Forsyth   /* <Input>                                                               */
185*37da2899SCharles.Forsyth   /*    face :: A typeless pointer to the face object to destroy.          */
186*37da2899SCharles.Forsyth   /*                                                                       */
187*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
T1_Face_Done(T1_Face face)188*37da2899SCharles.Forsyth   T1_Face_Done( T1_Face  face )
189*37da2899SCharles.Forsyth   {
190*37da2899SCharles.Forsyth     FT_Memory  memory;
191*37da2899SCharles.Forsyth     T1_Font    type1 = &face->type1;
192*37da2899SCharles.Forsyth 
193*37da2899SCharles.Forsyth 
194*37da2899SCharles.Forsyth     if ( face )
195*37da2899SCharles.Forsyth     {
196*37da2899SCharles.Forsyth       memory = face->root.memory;
197*37da2899SCharles.Forsyth 
198*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
199*37da2899SCharles.Forsyth       /* release multiple masters information */
200*37da2899SCharles.Forsyth       T1_Done_Blend( face );
201*37da2899SCharles.Forsyth       face->blend = 0;
202*37da2899SCharles.Forsyth #endif
203*37da2899SCharles.Forsyth 
204*37da2899SCharles.Forsyth       /* release font info strings */
205*37da2899SCharles.Forsyth       {
206*37da2899SCharles.Forsyth         PS_FontInfo  info = &type1->font_info;
207*37da2899SCharles.Forsyth 
208*37da2899SCharles.Forsyth 
209*37da2899SCharles.Forsyth         FT_FREE( info->version );
210*37da2899SCharles.Forsyth         FT_FREE( info->notice );
211*37da2899SCharles.Forsyth         FT_FREE( info->full_name );
212*37da2899SCharles.Forsyth         FT_FREE( info->family_name );
213*37da2899SCharles.Forsyth         FT_FREE( info->weight );
214*37da2899SCharles.Forsyth       }
215*37da2899SCharles.Forsyth 
216*37da2899SCharles.Forsyth       /* release top dictionary */
217*37da2899SCharles.Forsyth       FT_FREE( type1->charstrings_len );
218*37da2899SCharles.Forsyth       FT_FREE( type1->charstrings );
219*37da2899SCharles.Forsyth       FT_FREE( type1->glyph_names );
220*37da2899SCharles.Forsyth 
221*37da2899SCharles.Forsyth       FT_FREE( type1->subrs );
222*37da2899SCharles.Forsyth       FT_FREE( type1->subrs_len );
223*37da2899SCharles.Forsyth 
224*37da2899SCharles.Forsyth       FT_FREE( type1->subrs_block );
225*37da2899SCharles.Forsyth       FT_FREE( type1->charstrings_block );
226*37da2899SCharles.Forsyth       FT_FREE( type1->glyph_names_block );
227*37da2899SCharles.Forsyth 
228*37da2899SCharles.Forsyth       FT_FREE( type1->encoding.char_index );
229*37da2899SCharles.Forsyth       FT_FREE( type1->encoding.char_name );
230*37da2899SCharles.Forsyth       FT_FREE( type1->font_name );
231*37da2899SCharles.Forsyth 
232*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_AFM
233*37da2899SCharles.Forsyth       /* release afm data if present */
234*37da2899SCharles.Forsyth       if ( face->afm_data )
235*37da2899SCharles.Forsyth         T1_Done_AFM( memory, (T1_AFM*)face->afm_data );
236*37da2899SCharles.Forsyth #endif
237*37da2899SCharles.Forsyth 
238*37da2899SCharles.Forsyth       /* release unicode map, if any */
239*37da2899SCharles.Forsyth       FT_FREE( face->unicode_map.maps );
240*37da2899SCharles.Forsyth       face->unicode_map.num_maps = 0;
241*37da2899SCharles.Forsyth 
242*37da2899SCharles.Forsyth       face->root.family_name = 0;
243*37da2899SCharles.Forsyth       face->root.style_name  = 0;
244*37da2899SCharles.Forsyth     }
245*37da2899SCharles.Forsyth   }
246*37da2899SCharles.Forsyth 
247*37da2899SCharles.Forsyth 
248*37da2899SCharles.Forsyth   /*************************************************************************/
249*37da2899SCharles.Forsyth   /*                                                                       */
250*37da2899SCharles.Forsyth   /* <Function>                                                            */
251*37da2899SCharles.Forsyth   /*    T1_Face_Init                                                       */
252*37da2899SCharles.Forsyth   /*                                                                       */
253*37da2899SCharles.Forsyth   /* <Description>                                                         */
254*37da2899SCharles.Forsyth   /*    The face object constructor.                                       */
255*37da2899SCharles.Forsyth   /*                                                                       */
256*37da2899SCharles.Forsyth   /* <Input>                                                               */
257*37da2899SCharles.Forsyth   /*    stream     ::  input stream where to load font data.               */
258*37da2899SCharles.Forsyth   /*                                                                       */
259*37da2899SCharles.Forsyth   /*    face_index :: The index of the font face in the resource.          */
260*37da2899SCharles.Forsyth   /*                                                                       */
261*37da2899SCharles.Forsyth   /*    num_params :: Number of additional generic parameters.  Ignored.   */
262*37da2899SCharles.Forsyth   /*                                                                       */
263*37da2899SCharles.Forsyth   /*    params     :: Additional generic parameters.  Ignored.             */
264*37da2899SCharles.Forsyth   /*                                                                       */
265*37da2899SCharles.Forsyth   /* <InOut>                                                               */
266*37da2899SCharles.Forsyth   /*    face       :: The face record to build.                            */
267*37da2899SCharles.Forsyth   /*                                                                       */
268*37da2899SCharles.Forsyth   /* <Return>                                                              */
269*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
270*37da2899SCharles.Forsyth   /*                                                                       */
271*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
T1_Face_Init(FT_Stream stream,T1_Face face,FT_Int face_index,FT_Int num_params,FT_Parameter * params)272*37da2899SCharles.Forsyth   T1_Face_Init( FT_Stream      stream,
273*37da2899SCharles.Forsyth                 T1_Face        face,
274*37da2899SCharles.Forsyth                 FT_Int         face_index,
275*37da2899SCharles.Forsyth                 FT_Int         num_params,
276*37da2899SCharles.Forsyth                 FT_Parameter*  params )
277*37da2899SCharles.Forsyth   {
278*37da2899SCharles.Forsyth     FT_Error          error;
279*37da2899SCharles.Forsyth     PSNames_Service   psnames;
280*37da2899SCharles.Forsyth     PSAux_Service     psaux;
281*37da2899SCharles.Forsyth     PSHinter_Service  pshinter;
282*37da2899SCharles.Forsyth 
283*37da2899SCharles.Forsyth     FT_UNUSED( num_params );
284*37da2899SCharles.Forsyth     FT_UNUSED( params );
285*37da2899SCharles.Forsyth     FT_UNUSED( face_index );
286*37da2899SCharles.Forsyth     FT_UNUSED( stream );
287*37da2899SCharles.Forsyth 
288*37da2899SCharles.Forsyth 
289*37da2899SCharles.Forsyth     face->root.num_faces = 1;
290*37da2899SCharles.Forsyth 
291*37da2899SCharles.Forsyth     face->psnames = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
292*37da2899SCharles.Forsyth                                              "psnames" );
293*37da2899SCharles.Forsyth     psnames = (PSNames_Service)face->psnames;
294*37da2899SCharles.Forsyth 
295*37da2899SCharles.Forsyth     face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
296*37da2899SCharles.Forsyth                                            "psaux" );
297*37da2899SCharles.Forsyth     psaux = (PSAux_Service)face->psaux;
298*37da2899SCharles.Forsyth 
299*37da2899SCharles.Forsyth     face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
300*37da2899SCharles.Forsyth                                               "pshinter" );
301*37da2899SCharles.Forsyth     pshinter = (PSHinter_Service)face->pshinter;
302*37da2899SCharles.Forsyth 
303*37da2899SCharles.Forsyth     /* open the tokenizer, this will also check the font format */
304*37da2899SCharles.Forsyth     error = T1_Open_Face( face );
305*37da2899SCharles.Forsyth     if ( error )
306*37da2899SCharles.Forsyth       goto Exit;
307*37da2899SCharles.Forsyth 
308*37da2899SCharles.Forsyth     /* if we just wanted to check the format, leave successfully now */
309*37da2899SCharles.Forsyth     if ( face_index < 0 )
310*37da2899SCharles.Forsyth       goto Exit;
311*37da2899SCharles.Forsyth 
312*37da2899SCharles.Forsyth     /* check the face index */
313*37da2899SCharles.Forsyth     if ( face_index != 0 )
314*37da2899SCharles.Forsyth     {
315*37da2899SCharles.Forsyth       FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
316*37da2899SCharles.Forsyth       error = T1_Err_Invalid_Argument;
317*37da2899SCharles.Forsyth       goto Exit;
318*37da2899SCharles.Forsyth     }
319*37da2899SCharles.Forsyth 
320*37da2899SCharles.Forsyth     /* Now, load the font program into the face object */
321*37da2899SCharles.Forsyth 
322*37da2899SCharles.Forsyth     /* Init the face object fields */
323*37da2899SCharles.Forsyth     /* Now set up root face fields */
324*37da2899SCharles.Forsyth     {
325*37da2899SCharles.Forsyth       FT_Face  root = (FT_Face)&face->root;
326*37da2899SCharles.Forsyth 
327*37da2899SCharles.Forsyth 
328*37da2899SCharles.Forsyth       root->num_glyphs = face->type1.num_glyphs;
329*37da2899SCharles.Forsyth       root->face_index = face_index;
330*37da2899SCharles.Forsyth 
331*37da2899SCharles.Forsyth       root->face_flags = FT_FACE_FLAG_SCALABLE;
332*37da2899SCharles.Forsyth       root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
333*37da2899SCharles.Forsyth       root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
334*37da2899SCharles.Forsyth 
335*37da2899SCharles.Forsyth       if ( face->type1.font_info.is_fixed_pitch )
336*37da2899SCharles.Forsyth         root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
337*37da2899SCharles.Forsyth 
338*37da2899SCharles.Forsyth       if ( face->blend )
339*37da2899SCharles.Forsyth         root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
340*37da2899SCharles.Forsyth 
341*37da2899SCharles.Forsyth       /* XXX: TODO -- add kerning with .afm support */
342*37da2899SCharles.Forsyth 
343*37da2899SCharles.Forsyth       /* get style name -- be careful, some broken fonts only */
344*37da2899SCharles.Forsyth       /* have a `/FontName' dictionary entry!                 */
345*37da2899SCharles.Forsyth       root->family_name = face->type1.font_info.family_name;
346*37da2899SCharles.Forsyth       if ( root->family_name )
347*37da2899SCharles.Forsyth       {
348*37da2899SCharles.Forsyth         char*  full   = face->type1.font_info.full_name;
349*37da2899SCharles.Forsyth         char*  family = root->family_name;
350*37da2899SCharles.Forsyth 
351*37da2899SCharles.Forsyth 
352*37da2899SCharles.Forsyth         if ( full )
353*37da2899SCharles.Forsyth         {
354*37da2899SCharles.Forsyth           while ( *family && *full == *family )
355*37da2899SCharles.Forsyth           {
356*37da2899SCharles.Forsyth             family++;
357*37da2899SCharles.Forsyth             full++;
358*37da2899SCharles.Forsyth           }
359*37da2899SCharles.Forsyth 
360*37da2899SCharles.Forsyth           root->style_name = ( *full == ' ' ? full + 1
361*37da2899SCharles.Forsyth                                             : (char *)"Regular" );
362*37da2899SCharles.Forsyth         }
363*37da2899SCharles.Forsyth         else
364*37da2899SCharles.Forsyth           root->style_name = (char *)"Regular";
365*37da2899SCharles.Forsyth       }
366*37da2899SCharles.Forsyth       else
367*37da2899SCharles.Forsyth       {
368*37da2899SCharles.Forsyth         /* do we have a `/FontName'? */
369*37da2899SCharles.Forsyth         if ( face->type1.font_name )
370*37da2899SCharles.Forsyth         {
371*37da2899SCharles.Forsyth           root->family_name = face->type1.font_name;
372*37da2899SCharles.Forsyth           root->style_name  = (char *)"Regular";
373*37da2899SCharles.Forsyth         }
374*37da2899SCharles.Forsyth       }
375*37da2899SCharles.Forsyth 
376*37da2899SCharles.Forsyth       /* compute style flags */
377*37da2899SCharles.Forsyth       root->style_flags = 0;
378*37da2899SCharles.Forsyth       if ( face->type1.font_info.italic_angle )
379*37da2899SCharles.Forsyth         root->style_flags |= FT_STYLE_FLAG_ITALIC;
380*37da2899SCharles.Forsyth       if ( face->type1.font_info.weight )
381*37da2899SCharles.Forsyth       {
382*37da2899SCharles.Forsyth         if ( !ft_strcmp( face->type1.font_info.weight, "Bold"  ) ||
383*37da2899SCharles.Forsyth              !ft_strcmp( face->type1.font_info.weight, "Black" ) )
384*37da2899SCharles.Forsyth           root->style_flags |= FT_STYLE_FLAG_BOLD;
385*37da2899SCharles.Forsyth       }
386*37da2899SCharles.Forsyth 
387*37da2899SCharles.Forsyth       /* no embedded bitmap support */
388*37da2899SCharles.Forsyth       root->num_fixed_sizes = 0;
389*37da2899SCharles.Forsyth       root->available_sizes = 0;
390*37da2899SCharles.Forsyth 
391*37da2899SCharles.Forsyth       root->bbox.xMin =   face->type1.font_bbox.xMin             >> 16;
392*37da2899SCharles.Forsyth       root->bbox.yMin =   face->type1.font_bbox.yMin             >> 16;
393*37da2899SCharles.Forsyth       root->bbox.xMax = ( face->type1.font_bbox.xMax + 0xFFFFU ) >> 16;
394*37da2899SCharles.Forsyth       root->bbox.yMax = ( face->type1.font_bbox.yMax + 0xFFFFU ) >> 16;
395*37da2899SCharles.Forsyth 
396*37da2899SCharles.Forsyth       /* Set units_per_EM if we didn't set it in parse_font_matrix. */
397*37da2899SCharles.Forsyth       if ( !root->units_per_EM )
398*37da2899SCharles.Forsyth         root->units_per_EM = 1000;
399*37da2899SCharles.Forsyth 
400*37da2899SCharles.Forsyth       root->ascender  = (FT_Short)( root->bbox.yMax );
401*37da2899SCharles.Forsyth       root->descender = (FT_Short)( root->bbox.yMin );
402*37da2899SCharles.Forsyth       root->height    = (FT_Short)(
403*37da2899SCharles.Forsyth                           ( ( root->ascender - root->descender ) * 12 ) / 10 );
404*37da2899SCharles.Forsyth 
405*37da2899SCharles.Forsyth       /* now compute the maximum advance width */
406*37da2899SCharles.Forsyth       root->max_advance_width =
407*37da2899SCharles.Forsyth         (FT_Short)( root->bbox.xMax );
408*37da2899SCharles.Forsyth       {
409*37da2899SCharles.Forsyth         FT_Int  max_advance;
410*37da2899SCharles.Forsyth 
411*37da2899SCharles.Forsyth 
412*37da2899SCharles.Forsyth         error = T1_Compute_Max_Advance( face, &max_advance );
413*37da2899SCharles.Forsyth 
414*37da2899SCharles.Forsyth         /* in case of error, keep the standard width */
415*37da2899SCharles.Forsyth         if ( !error )
416*37da2899SCharles.Forsyth           root->max_advance_width = (FT_Short)max_advance;
417*37da2899SCharles.Forsyth         else
418*37da2899SCharles.Forsyth           error = 0;   /* clear error */
419*37da2899SCharles.Forsyth       }
420*37da2899SCharles.Forsyth 
421*37da2899SCharles.Forsyth       root->max_advance_height = root->height;
422*37da2899SCharles.Forsyth 
423*37da2899SCharles.Forsyth       root->underline_position  = face->type1.font_info.underline_position;
424*37da2899SCharles.Forsyth       root->underline_thickness = face->type1.font_info.underline_thickness;
425*37da2899SCharles.Forsyth 
426*37da2899SCharles.Forsyth       root->internal->max_points   = 0;
427*37da2899SCharles.Forsyth       root->internal->max_contours = 0;
428*37da2899SCharles.Forsyth     }
429*37da2899SCharles.Forsyth 
430*37da2899SCharles.Forsyth     {
431*37da2899SCharles.Forsyth       FT_Face  root = &face->root;
432*37da2899SCharles.Forsyth 
433*37da2899SCharles.Forsyth 
434*37da2899SCharles.Forsyth       if ( psnames && psaux )
435*37da2899SCharles.Forsyth       {
436*37da2899SCharles.Forsyth         FT_CharMapRec    charmap;
437*37da2899SCharles.Forsyth         T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
438*37da2899SCharles.Forsyth         FT_CMap_Class    clazz;
439*37da2899SCharles.Forsyth 
440*37da2899SCharles.Forsyth 
441*37da2899SCharles.Forsyth         charmap.face = root;
442*37da2899SCharles.Forsyth 
443*37da2899SCharles.Forsyth         /* first of all, try to synthetize a Unicode charmap */
444*37da2899SCharles.Forsyth         charmap.platform_id = 3;
445*37da2899SCharles.Forsyth         charmap.encoding_id = 1;
446*37da2899SCharles.Forsyth         charmap.encoding    = FT_ENCODING_UNICODE;
447*37da2899SCharles.Forsyth 
448*37da2899SCharles.Forsyth         FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
449*37da2899SCharles.Forsyth 
450*37da2899SCharles.Forsyth         /* now, generate an Adobe Standard encoding when appropriate */
451*37da2899SCharles.Forsyth         charmap.platform_id = 7;
452*37da2899SCharles.Forsyth         clazz               = NULL;
453*37da2899SCharles.Forsyth 
454*37da2899SCharles.Forsyth         switch ( face->type1.encoding_type )
455*37da2899SCharles.Forsyth         {
456*37da2899SCharles.Forsyth         case T1_ENCODING_TYPE_STANDARD:
457*37da2899SCharles.Forsyth           charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
458*37da2899SCharles.Forsyth           charmap.encoding_id = 0;
459*37da2899SCharles.Forsyth           clazz               = cmap_classes->standard;
460*37da2899SCharles.Forsyth           break;
461*37da2899SCharles.Forsyth 
462*37da2899SCharles.Forsyth         case T1_ENCODING_TYPE_EXPERT:
463*37da2899SCharles.Forsyth           charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;
464*37da2899SCharles.Forsyth           charmap.encoding_id = 1;
465*37da2899SCharles.Forsyth           clazz               = cmap_classes->expert;
466*37da2899SCharles.Forsyth           break;
467*37da2899SCharles.Forsyth 
468*37da2899SCharles.Forsyth         case T1_ENCODING_TYPE_ARRAY:
469*37da2899SCharles.Forsyth           charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;
470*37da2899SCharles.Forsyth           charmap.encoding_id = 2;
471*37da2899SCharles.Forsyth           clazz               = cmap_classes->custom;
472*37da2899SCharles.Forsyth           break;
473*37da2899SCharles.Forsyth 
474*37da2899SCharles.Forsyth         case T1_ENCODING_TYPE_ISOLATIN1:
475*37da2899SCharles.Forsyth           charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;
476*37da2899SCharles.Forsyth           charmap.encoding_id = 3;
477*37da2899SCharles.Forsyth           clazz               = cmap_classes->unicode;
478*37da2899SCharles.Forsyth           break;
479*37da2899SCharles.Forsyth 
480*37da2899SCharles.Forsyth         default:
481*37da2899SCharles.Forsyth           ;
482*37da2899SCharles.Forsyth         }
483*37da2899SCharles.Forsyth 
484*37da2899SCharles.Forsyth         if ( clazz )
485*37da2899SCharles.Forsyth           FT_CMap_New( clazz, NULL, &charmap, NULL );
486*37da2899SCharles.Forsyth 
487*37da2899SCharles.Forsyth #if 0
488*37da2899SCharles.Forsyth         /* Select default charmap */
489*37da2899SCharles.Forsyth         if (root->num_charmaps)
490*37da2899SCharles.Forsyth           root->charmap = root->charmaps[0];
491*37da2899SCharles.Forsyth #endif
492*37da2899SCharles.Forsyth       }
493*37da2899SCharles.Forsyth     }
494*37da2899SCharles.Forsyth 
495*37da2899SCharles.Forsyth   Exit:
496*37da2899SCharles.Forsyth     return error;
497*37da2899SCharles.Forsyth   }
498*37da2899SCharles.Forsyth 
499*37da2899SCharles.Forsyth 
500*37da2899SCharles.Forsyth   /*************************************************************************/
501*37da2899SCharles.Forsyth   /*                                                                       */
502*37da2899SCharles.Forsyth   /* <Function>                                                            */
503*37da2899SCharles.Forsyth   /*    T1_Driver_Init                                                     */
504*37da2899SCharles.Forsyth   /*                                                                       */
505*37da2899SCharles.Forsyth   /* <Description>                                                         */
506*37da2899SCharles.Forsyth   /*    Initializes a given Type 1 driver object.                          */
507*37da2899SCharles.Forsyth   /*                                                                       */
508*37da2899SCharles.Forsyth   /* <Input>                                                               */
509*37da2899SCharles.Forsyth   /*    driver :: A handle to the target driver object.                    */
510*37da2899SCharles.Forsyth   /*                                                                       */
511*37da2899SCharles.Forsyth   /* <Return>                                                              */
512*37da2899SCharles.Forsyth   /*    FreeType error code.  0 means success.                             */
513*37da2899SCharles.Forsyth   /*                                                                       */
514*37da2899SCharles.Forsyth   FT_LOCAL_DEF( FT_Error )
T1_Driver_Init(T1_Driver driver)515*37da2899SCharles.Forsyth   T1_Driver_Init( T1_Driver  driver )
516*37da2899SCharles.Forsyth   {
517*37da2899SCharles.Forsyth     FT_UNUSED( driver );
518*37da2899SCharles.Forsyth 
519*37da2899SCharles.Forsyth     return T1_Err_Ok;
520*37da2899SCharles.Forsyth   }
521*37da2899SCharles.Forsyth 
522*37da2899SCharles.Forsyth 
523*37da2899SCharles.Forsyth   /*************************************************************************/
524*37da2899SCharles.Forsyth   /*                                                                       */
525*37da2899SCharles.Forsyth   /* <Function>                                                            */
526*37da2899SCharles.Forsyth   /*    T1_Driver_Done                                                     */
527*37da2899SCharles.Forsyth   /*                                                                       */
528*37da2899SCharles.Forsyth   /* <Description>                                                         */
529*37da2899SCharles.Forsyth   /*    Finalizes a given Type 1 driver.                                   */
530*37da2899SCharles.Forsyth   /*                                                                       */
531*37da2899SCharles.Forsyth   /* <Input>                                                               */
532*37da2899SCharles.Forsyth   /*    driver :: A handle to the target Type 1 driver.                    */
533*37da2899SCharles.Forsyth   /*                                                                       */
534*37da2899SCharles.Forsyth   FT_LOCAL_DEF( void )
T1_Driver_Done(T1_Driver driver)535*37da2899SCharles.Forsyth   T1_Driver_Done( T1_Driver  driver )
536*37da2899SCharles.Forsyth   {
537*37da2899SCharles.Forsyth     FT_UNUSED( driver );
538*37da2899SCharles.Forsyth   }
539*37da2899SCharles.Forsyth 
540*37da2899SCharles.Forsyth 
541*37da2899SCharles.Forsyth /* END */
542