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