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