1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* cffdrivr.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* OpenType font driver implementation (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_FREETYPE_H 21*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 22*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H 23*37da2899SCharles.Forsyth #include FT_INTERNAL_SFNT_H 24*37da2899SCharles.Forsyth #include FT_TRUETYPE_IDS_H 25*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth #include "cffdrivr.h" 28*37da2899SCharles.Forsyth #include "cffgload.h" 29*37da2899SCharles.Forsyth #include "cffload.h" 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth #include "cfferrs.h" 32*37da2899SCharles.Forsyth 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth /*************************************************************************/ 35*37da2899SCharles.Forsyth /* */ 36*37da2899SCharles.Forsyth /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 37*37da2899SCharles.Forsyth /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 38*37da2899SCharles.Forsyth /* messages during execution. */ 39*37da2899SCharles.Forsyth /* */ 40*37da2899SCharles.Forsyth #undef FT_COMPONENT 41*37da2899SCharles.Forsyth #define FT_COMPONENT trace_cffdriver 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth /*************************************************************************/ 45*37da2899SCharles.Forsyth /*************************************************************************/ 46*37da2899SCharles.Forsyth /*************************************************************************/ 47*37da2899SCharles.Forsyth /**** ****/ 48*37da2899SCharles.Forsyth /**** ****/ 49*37da2899SCharles.Forsyth /**** F A C E S ****/ 50*37da2899SCharles.Forsyth /**** ****/ 51*37da2899SCharles.Forsyth /**** ****/ 52*37da2899SCharles.Forsyth /*************************************************************************/ 53*37da2899SCharles.Forsyth /*************************************************************************/ 54*37da2899SCharles.Forsyth /*************************************************************************/ 55*37da2899SCharles.Forsyth 56*37da2899SCharles.Forsyth 57*37da2899SCharles.Forsyth #undef PAIR_TAG 58*37da2899SCharles.Forsyth #define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ 59*37da2899SCharles.Forsyth (FT_ULong)right ) 60*37da2899SCharles.Forsyth 61*37da2899SCharles.Forsyth 62*37da2899SCharles.Forsyth /*************************************************************************/ 63*37da2899SCharles.Forsyth /* */ 64*37da2899SCharles.Forsyth /* <Function> */ 65*37da2899SCharles.Forsyth /* Get_Kerning */ 66*37da2899SCharles.Forsyth /* */ 67*37da2899SCharles.Forsyth /* <Description> */ 68*37da2899SCharles.Forsyth /* A driver method used to return the kerning vector between two */ 69*37da2899SCharles.Forsyth /* glyphs of the same face. */ 70*37da2899SCharles.Forsyth /* */ 71*37da2899SCharles.Forsyth /* <Input> */ 72*37da2899SCharles.Forsyth /* face :: A handle to the source face object. */ 73*37da2899SCharles.Forsyth /* */ 74*37da2899SCharles.Forsyth /* left_glyph :: The index of the left glyph in the kern pair. */ 75*37da2899SCharles.Forsyth /* */ 76*37da2899SCharles.Forsyth /* right_glyph :: The index of the right glyph in the kern pair. */ 77*37da2899SCharles.Forsyth /* */ 78*37da2899SCharles.Forsyth /* <Output> */ 79*37da2899SCharles.Forsyth /* kerning :: The kerning vector. This is in font units for */ 80*37da2899SCharles.Forsyth /* scalable formats, and in pixels for fixed-sizes */ 81*37da2899SCharles.Forsyth /* formats. */ 82*37da2899SCharles.Forsyth /* */ 83*37da2899SCharles.Forsyth /* <Return> */ 84*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 85*37da2899SCharles.Forsyth /* */ 86*37da2899SCharles.Forsyth /* <Note> */ 87*37da2899SCharles.Forsyth /* Only horizontal layouts (left-to-right & right-to-left) are */ 88*37da2899SCharles.Forsyth /* supported by this function. Other layouts, or more sophisticated */ 89*37da2899SCharles.Forsyth /* kernings, are out of scope of this method (the basic driver */ 90*37da2899SCharles.Forsyth /* interface is meant to be simple). */ 91*37da2899SCharles.Forsyth /* */ 92*37da2899SCharles.Forsyth /* They can be implemented by format-specific interfaces. */ 93*37da2899SCharles.Forsyth /* */ 94*37da2899SCharles.Forsyth static FT_Error Get_Kerning(TT_Face face,FT_UInt left_glyph,FT_UInt right_glyph,FT_Vector * kerning)95*37da2899SCharles.Forsyth Get_Kerning( TT_Face face, 96*37da2899SCharles.Forsyth FT_UInt left_glyph, 97*37da2899SCharles.Forsyth FT_UInt right_glyph, 98*37da2899SCharles.Forsyth FT_Vector* kerning ) 99*37da2899SCharles.Forsyth { 100*37da2899SCharles.Forsyth TT_Kern0_Pair pair; 101*37da2899SCharles.Forsyth 102*37da2899SCharles.Forsyth 103*37da2899SCharles.Forsyth if ( !face ) 104*37da2899SCharles.Forsyth return CFF_Err_Invalid_Face_Handle; 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsyth kerning->x = 0; 107*37da2899SCharles.Forsyth kerning->y = 0; 108*37da2899SCharles.Forsyth 109*37da2899SCharles.Forsyth if ( face->kern_pairs ) 110*37da2899SCharles.Forsyth { 111*37da2899SCharles.Forsyth /* there are some kerning pairs in this font file! */ 112*37da2899SCharles.Forsyth FT_ULong search_tag = PAIR_TAG( left_glyph, right_glyph ); 113*37da2899SCharles.Forsyth FT_Long left, right; 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth left = 0; 117*37da2899SCharles.Forsyth right = face->num_kern_pairs - 1; 118*37da2899SCharles.Forsyth 119*37da2899SCharles.Forsyth while ( left <= right ) 120*37da2899SCharles.Forsyth { 121*37da2899SCharles.Forsyth FT_Long middle = left + ( ( right - left ) >> 1 ); 122*37da2899SCharles.Forsyth FT_ULong cur_pair; 123*37da2899SCharles.Forsyth 124*37da2899SCharles.Forsyth 125*37da2899SCharles.Forsyth pair = face->kern_pairs + middle; 126*37da2899SCharles.Forsyth cur_pair = PAIR_TAG( pair->left, pair->right ); 127*37da2899SCharles.Forsyth 128*37da2899SCharles.Forsyth if ( cur_pair == search_tag ) 129*37da2899SCharles.Forsyth goto Found; 130*37da2899SCharles.Forsyth 131*37da2899SCharles.Forsyth if ( cur_pair < search_tag ) 132*37da2899SCharles.Forsyth left = middle + 1; 133*37da2899SCharles.Forsyth else 134*37da2899SCharles.Forsyth right = middle - 1; 135*37da2899SCharles.Forsyth } 136*37da2899SCharles.Forsyth } 137*37da2899SCharles.Forsyth 138*37da2899SCharles.Forsyth Exit: 139*37da2899SCharles.Forsyth return CFF_Err_Ok; 140*37da2899SCharles.Forsyth 141*37da2899SCharles.Forsyth Found: 142*37da2899SCharles.Forsyth kerning->x = pair->value; 143*37da2899SCharles.Forsyth goto Exit; 144*37da2899SCharles.Forsyth } 145*37da2899SCharles.Forsyth 146*37da2899SCharles.Forsyth 147*37da2899SCharles.Forsyth #undef PAIR_TAG 148*37da2899SCharles.Forsyth 149*37da2899SCharles.Forsyth 150*37da2899SCharles.Forsyth /*************************************************************************/ 151*37da2899SCharles.Forsyth /* */ 152*37da2899SCharles.Forsyth /* <Function> */ 153*37da2899SCharles.Forsyth /* Load_Glyph */ 154*37da2899SCharles.Forsyth /* */ 155*37da2899SCharles.Forsyth /* <Description> */ 156*37da2899SCharles.Forsyth /* A driver method used to load a glyph within a given glyph slot. */ 157*37da2899SCharles.Forsyth /* */ 158*37da2899SCharles.Forsyth /* <Input> */ 159*37da2899SCharles.Forsyth /* slot :: A handle to the target slot object where the glyph */ 160*37da2899SCharles.Forsyth /* will be loaded. */ 161*37da2899SCharles.Forsyth /* */ 162*37da2899SCharles.Forsyth /* size :: A handle to the source face size at which the glyph */ 163*37da2899SCharles.Forsyth /* must be scaled, loaded, etc. */ 164*37da2899SCharles.Forsyth /* */ 165*37da2899SCharles.Forsyth /* glyph_index :: The index of the glyph in the font file. */ 166*37da2899SCharles.Forsyth /* */ 167*37da2899SCharles.Forsyth /* load_flags :: A flag indicating what to load for this glyph. The */ 168*37da2899SCharles.Forsyth /* FTLOAD_??? constants can be used to control the */ 169*37da2899SCharles.Forsyth /* glyph loading process (e.g., whether the outline */ 170*37da2899SCharles.Forsyth /* should be scaled, whether to load bitmaps or not, */ 171*37da2899SCharles.Forsyth /* whether to hint the outline, etc). */ 172*37da2899SCharles.Forsyth /* */ 173*37da2899SCharles.Forsyth /* <Return> */ 174*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 175*37da2899SCharles.Forsyth /* */ 176*37da2899SCharles.Forsyth static FT_Error Load_Glyph(CFF_GlyphSlot slot,CFF_Size size,FT_UShort glyph_index,FT_Int32 load_flags)177*37da2899SCharles.Forsyth Load_Glyph( CFF_GlyphSlot slot, 178*37da2899SCharles.Forsyth CFF_Size size, 179*37da2899SCharles.Forsyth FT_UShort glyph_index, 180*37da2899SCharles.Forsyth FT_Int32 load_flags ) 181*37da2899SCharles.Forsyth { 182*37da2899SCharles.Forsyth FT_Error error; 183*37da2899SCharles.Forsyth 184*37da2899SCharles.Forsyth 185*37da2899SCharles.Forsyth if ( !slot ) 186*37da2899SCharles.Forsyth return CFF_Err_Invalid_Slot_Handle; 187*37da2899SCharles.Forsyth 188*37da2899SCharles.Forsyth /* check whether we want a scaled outline or bitmap */ 189*37da2899SCharles.Forsyth if ( !size ) 190*37da2899SCharles.Forsyth load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; 191*37da2899SCharles.Forsyth 192*37da2899SCharles.Forsyth if ( load_flags & FT_LOAD_NO_SCALE ) 193*37da2899SCharles.Forsyth size = NULL; 194*37da2899SCharles.Forsyth 195*37da2899SCharles.Forsyth /* reset the size object if necessary */ 196*37da2899SCharles.Forsyth if ( size ) 197*37da2899SCharles.Forsyth { 198*37da2899SCharles.Forsyth /* these two object must have the same parent */ 199*37da2899SCharles.Forsyth if ( size->face != slot->root.face ) 200*37da2899SCharles.Forsyth return CFF_Err_Invalid_Face_Handle; 201*37da2899SCharles.Forsyth } 202*37da2899SCharles.Forsyth 203*37da2899SCharles.Forsyth /* now load the glyph outline if necessary */ 204*37da2899SCharles.Forsyth error = cff_slot_load( slot, size, glyph_index, load_flags ); 205*37da2899SCharles.Forsyth 206*37da2899SCharles.Forsyth /* force drop-out mode to 2 - irrelevant now */ 207*37da2899SCharles.Forsyth /* slot->outline.dropout_mode = 2; */ 208*37da2899SCharles.Forsyth 209*37da2899SCharles.Forsyth return error; 210*37da2899SCharles.Forsyth } 211*37da2899SCharles.Forsyth 212*37da2899SCharles.Forsyth 213*37da2899SCharles.Forsyth /*************************************************************************/ 214*37da2899SCharles.Forsyth /*************************************************************************/ 215*37da2899SCharles.Forsyth /*************************************************************************/ 216*37da2899SCharles.Forsyth /**** ****/ 217*37da2899SCharles.Forsyth /**** ****/ 218*37da2899SCharles.Forsyth /**** C H A R A C T E R M A P P I N G S ****/ 219*37da2899SCharles.Forsyth /**** ****/ 220*37da2899SCharles.Forsyth /**** ****/ 221*37da2899SCharles.Forsyth /*************************************************************************/ 222*37da2899SCharles.Forsyth /*************************************************************************/ 223*37da2899SCharles.Forsyth /*************************************************************************/ 224*37da2899SCharles.Forsyth 225*37da2899SCharles.Forsyth static FT_Error cff_get_glyph_name(CFF_Face face,FT_UInt glyph_index,FT_Pointer buffer,FT_UInt buffer_max)226*37da2899SCharles.Forsyth cff_get_glyph_name( CFF_Face face, 227*37da2899SCharles.Forsyth FT_UInt glyph_index, 228*37da2899SCharles.Forsyth FT_Pointer buffer, 229*37da2899SCharles.Forsyth FT_UInt buffer_max ) 230*37da2899SCharles.Forsyth { 231*37da2899SCharles.Forsyth CFF_Font font = (CFF_Font)face->extra.data; 232*37da2899SCharles.Forsyth FT_Memory memory = FT_FACE_MEMORY( face ); 233*37da2899SCharles.Forsyth FT_String* gname; 234*37da2899SCharles.Forsyth FT_UShort sid; 235*37da2899SCharles.Forsyth PSNames_Service psnames; 236*37da2899SCharles.Forsyth FT_Error error; 237*37da2899SCharles.Forsyth 238*37da2899SCharles.Forsyth 239*37da2899SCharles.Forsyth psnames = (PSNames_Service)FT_Get_Module_Interface( 240*37da2899SCharles.Forsyth face->root.driver->root.library, "psnames" ); 241*37da2899SCharles.Forsyth 242*37da2899SCharles.Forsyth if ( !psnames ) 243*37da2899SCharles.Forsyth { 244*37da2899SCharles.Forsyth FT_ERROR(( "cff_get_glyph_name:" )); 245*37da2899SCharles.Forsyth FT_ERROR(( " cannot open CFF & CEF fonts\n" )); 246*37da2899SCharles.Forsyth FT_ERROR(( " " )); 247*37da2899SCharles.Forsyth FT_ERROR(( " without the `PSNames' module\n" )); 248*37da2899SCharles.Forsyth error = CFF_Err_Unknown_File_Format; 249*37da2899SCharles.Forsyth goto Exit; 250*37da2899SCharles.Forsyth } 251*37da2899SCharles.Forsyth 252*37da2899SCharles.Forsyth /* first, locate the sid in the charset table */ 253*37da2899SCharles.Forsyth sid = font->charset.sids[glyph_index]; 254*37da2899SCharles.Forsyth 255*37da2899SCharles.Forsyth /* now, lookup the name itself */ 256*37da2899SCharles.Forsyth gname = cff_index_get_sid_string( &font->string_index, sid, psnames ); 257*37da2899SCharles.Forsyth 258*37da2899SCharles.Forsyth if ( buffer_max > 0 ) 259*37da2899SCharles.Forsyth { 260*37da2899SCharles.Forsyth FT_UInt len = (FT_UInt)ft_strlen( gname ); 261*37da2899SCharles.Forsyth 262*37da2899SCharles.Forsyth 263*37da2899SCharles.Forsyth if ( len >= buffer_max ) 264*37da2899SCharles.Forsyth len = buffer_max - 1; 265*37da2899SCharles.Forsyth 266*37da2899SCharles.Forsyth FT_MEM_COPY( buffer, gname, len ); 267*37da2899SCharles.Forsyth ((FT_Byte*)buffer)[len] = 0; 268*37da2899SCharles.Forsyth } 269*37da2899SCharles.Forsyth 270*37da2899SCharles.Forsyth FT_FREE ( gname ); 271*37da2899SCharles.Forsyth error = CFF_Err_Ok; 272*37da2899SCharles.Forsyth 273*37da2899SCharles.Forsyth Exit: 274*37da2899SCharles.Forsyth return error; 275*37da2899SCharles.Forsyth } 276*37da2899SCharles.Forsyth 277*37da2899SCharles.Forsyth 278*37da2899SCharles.Forsyth 279*37da2899SCharles.Forsyth /*************************************************************************/ 280*37da2899SCharles.Forsyth /* */ 281*37da2899SCharles.Forsyth /* <Function> */ 282*37da2899SCharles.Forsyth /* cff_get_name_index */ 283*37da2899SCharles.Forsyth /* */ 284*37da2899SCharles.Forsyth /* <Description> */ 285*37da2899SCharles.Forsyth /* Uses the psnames module and the CFF font's charset to to return a */ 286*37da2899SCharles.Forsyth /* a given glyph name's glyph index. */ 287*37da2899SCharles.Forsyth /* */ 288*37da2899SCharles.Forsyth /* <Input> */ 289*37da2899SCharles.Forsyth /* face :: A handle to the source face object. */ 290*37da2899SCharles.Forsyth /* */ 291*37da2899SCharles.Forsyth /* glyph_name :: The glyph name. */ 292*37da2899SCharles.Forsyth /* */ 293*37da2899SCharles.Forsyth /* <Return> */ 294*37da2899SCharles.Forsyth /* Glyph index. 0 means `undefined character code'. */ 295*37da2899SCharles.Forsyth /* */ 296*37da2899SCharles.Forsyth static FT_UInt cff_get_name_index(CFF_Face face,FT_String * glyph_name)297*37da2899SCharles.Forsyth cff_get_name_index( CFF_Face face, 298*37da2899SCharles.Forsyth FT_String* glyph_name ) 299*37da2899SCharles.Forsyth { 300*37da2899SCharles.Forsyth CFF_Font cff; 301*37da2899SCharles.Forsyth CFF_Charset charset; 302*37da2899SCharles.Forsyth PSNames_Service psnames; 303*37da2899SCharles.Forsyth FT_Memory memory = FT_FACE_MEMORY( face ); 304*37da2899SCharles.Forsyth FT_String* name; 305*37da2899SCharles.Forsyth FT_UShort sid; 306*37da2899SCharles.Forsyth FT_UInt i; 307*37da2899SCharles.Forsyth FT_Int result; 308*37da2899SCharles.Forsyth 309*37da2899SCharles.Forsyth 310*37da2899SCharles.Forsyth cff = (CFF_FontRec *)face->extra.data; 311*37da2899SCharles.Forsyth charset = &cff->charset; 312*37da2899SCharles.Forsyth 313*37da2899SCharles.Forsyth psnames = (PSNames_Service)FT_Get_Module_Interface( 314*37da2899SCharles.Forsyth face->root.driver->root.library, "psnames" ); 315*37da2899SCharles.Forsyth 316*37da2899SCharles.Forsyth for ( i = 0; i < cff->num_glyphs; i++ ) 317*37da2899SCharles.Forsyth { 318*37da2899SCharles.Forsyth sid = charset->sids[i]; 319*37da2899SCharles.Forsyth 320*37da2899SCharles.Forsyth if ( sid > 390 ) 321*37da2899SCharles.Forsyth name = cff_index_get_name( &cff->string_index, sid - 391 ); 322*37da2899SCharles.Forsyth else 323*37da2899SCharles.Forsyth name = (FT_String *)psnames->adobe_std_strings( sid ); 324*37da2899SCharles.Forsyth 325*37da2899SCharles.Forsyth result = ft_strcmp( glyph_name, name ); 326*37da2899SCharles.Forsyth 327*37da2899SCharles.Forsyth if ( sid > 390 ) 328*37da2899SCharles.Forsyth FT_FREE( name ); 329*37da2899SCharles.Forsyth 330*37da2899SCharles.Forsyth if ( !result ) 331*37da2899SCharles.Forsyth return i; 332*37da2899SCharles.Forsyth } 333*37da2899SCharles.Forsyth 334*37da2899SCharles.Forsyth return 0; 335*37da2899SCharles.Forsyth } 336*37da2899SCharles.Forsyth 337*37da2899SCharles.Forsyth 338*37da2899SCharles.Forsyth /*************************************************************************/ 339*37da2899SCharles.Forsyth /*************************************************************************/ 340*37da2899SCharles.Forsyth /*************************************************************************/ 341*37da2899SCharles.Forsyth /**** ****/ 342*37da2899SCharles.Forsyth /**** ****/ 343*37da2899SCharles.Forsyth /**** D R I V E R I N T E R F A C E ****/ 344*37da2899SCharles.Forsyth /**** ****/ 345*37da2899SCharles.Forsyth /**** ****/ 346*37da2899SCharles.Forsyth /*************************************************************************/ 347*37da2899SCharles.Forsyth /*************************************************************************/ 348*37da2899SCharles.Forsyth /*************************************************************************/ 349*37da2899SCharles.Forsyth 350*37da2899SCharles.Forsyth static FT_Module_Interface cff_get_interface(CFF_Driver driver,const char * module_interface)351*37da2899SCharles.Forsyth cff_get_interface( CFF_Driver driver, 352*37da2899SCharles.Forsyth const char* module_interface ) 353*37da2899SCharles.Forsyth { 354*37da2899SCharles.Forsyth FT_Module sfnt; 355*37da2899SCharles.Forsyth 356*37da2899SCharles.Forsyth 357*37da2899SCharles.Forsyth #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES 358*37da2899SCharles.Forsyth 359*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)module_interface, "glyph_name" ) == 0 ) 360*37da2899SCharles.Forsyth return (FT_Module_Interface)cff_get_glyph_name; 361*37da2899SCharles.Forsyth 362*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)module_interface, "name_index" ) == 0 ) 363*37da2899SCharles.Forsyth return (FT_Module_Interface)cff_get_name_index; 364*37da2899SCharles.Forsyth 365*37da2899SCharles.Forsyth #endif 366*37da2899SCharles.Forsyth 367*37da2899SCharles.Forsyth /* we simply pass our request to the `sfnt' module */ 368*37da2899SCharles.Forsyth sfnt = FT_Get_Module( driver->root.root.library, "sfnt" ); 369*37da2899SCharles.Forsyth 370*37da2899SCharles.Forsyth return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; 371*37da2899SCharles.Forsyth } 372*37da2899SCharles.Forsyth 373*37da2899SCharles.Forsyth 374*37da2899SCharles.Forsyth /* The FT_DriverInterface structure is defined in ftdriver.h. */ 375*37da2899SCharles.Forsyth 376*37da2899SCharles.Forsyth FT_CALLBACK_TABLE_DEF 377*37da2899SCharles.Forsyth const FT_Driver_ClassRec cff_driver_class = 378*37da2899SCharles.Forsyth { 379*37da2899SCharles.Forsyth /* begin with the FT_Module_Class fields */ 380*37da2899SCharles.Forsyth { 381*37da2899SCharles.Forsyth ft_module_font_driver | 382*37da2899SCharles.Forsyth ft_module_driver_scalable | 383*37da2899SCharles.Forsyth ft_module_driver_has_hinter, 384*37da2899SCharles.Forsyth 385*37da2899SCharles.Forsyth sizeof( CFF_DriverRec ), 386*37da2899SCharles.Forsyth "cff", 387*37da2899SCharles.Forsyth 0x10000L, 388*37da2899SCharles.Forsyth 0x20000L, 389*37da2899SCharles.Forsyth 390*37da2899SCharles.Forsyth 0, /* module-specific interface */ 391*37da2899SCharles.Forsyth 392*37da2899SCharles.Forsyth (FT_Module_Constructor)cff_driver_init, 393*37da2899SCharles.Forsyth (FT_Module_Destructor) cff_driver_done, 394*37da2899SCharles.Forsyth (FT_Module_Requester) cff_get_interface, 395*37da2899SCharles.Forsyth }, 396*37da2899SCharles.Forsyth 397*37da2899SCharles.Forsyth /* now the specific driver fields */ 398*37da2899SCharles.Forsyth sizeof( TT_FaceRec ), 399*37da2899SCharles.Forsyth sizeof( FT_SizeRec ), 400*37da2899SCharles.Forsyth sizeof( CFF_GlyphSlotRec ), 401*37da2899SCharles.Forsyth 402*37da2899SCharles.Forsyth (FT_Face_InitFunc) cff_face_init, 403*37da2899SCharles.Forsyth (FT_Face_DoneFunc) cff_face_done, 404*37da2899SCharles.Forsyth (FT_Size_InitFunc) cff_size_init, 405*37da2899SCharles.Forsyth (FT_Size_DoneFunc) cff_size_done, 406*37da2899SCharles.Forsyth (FT_Slot_InitFunc) cff_slot_init, 407*37da2899SCharles.Forsyth (FT_Slot_DoneFunc) cff_slot_done, 408*37da2899SCharles.Forsyth 409*37da2899SCharles.Forsyth (FT_Size_ResetPointsFunc)cff_size_reset, 410*37da2899SCharles.Forsyth (FT_Size_ResetPixelsFunc)cff_size_reset, 411*37da2899SCharles.Forsyth 412*37da2899SCharles.Forsyth (FT_Slot_LoadFunc) Load_Glyph, 413*37da2899SCharles.Forsyth 414*37da2899SCharles.Forsyth (FT_Face_GetKerningFunc) Get_Kerning, 415*37da2899SCharles.Forsyth (FT_Face_AttachFunc) 0, 416*37da2899SCharles.Forsyth (FT_Face_GetAdvancesFunc)0, 417*37da2899SCharles.Forsyth }; 418*37da2899SCharles.Forsyth 419*37da2899SCharles.Forsyth 420*37da2899SCharles.Forsyth /* END */ 421