1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* t1driver.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* Type 1 driver interface (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 "t1driver.h" 21*37da2899SCharles.Forsyth #include "t1gload.h" 22*37da2899SCharles.Forsyth #include "t1load.h" 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth #include "t1errors.h" 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_AFM 27*37da2899SCharles.Forsyth #include "t1afm.h" 28*37da2899SCharles.Forsyth #endif 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 31*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H 32*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsyth /*************************************************************************/ 36*37da2899SCharles.Forsyth /* */ 37*37da2899SCharles.Forsyth /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 38*37da2899SCharles.Forsyth /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 39*37da2899SCharles.Forsyth /* messages during execution. */ 40*37da2899SCharles.Forsyth /* */ 41*37da2899SCharles.Forsyth #undef FT_COMPONENT 42*37da2899SCharles.Forsyth #define FT_COMPONENT trace_t1driver 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsyth static FT_Error t1_get_glyph_name(T1_Face face,FT_UInt glyph_index,FT_Pointer buffer,FT_UInt buffer_max)46*37da2899SCharles.Forsyth t1_get_glyph_name( T1_Face face, 47*37da2899SCharles.Forsyth FT_UInt glyph_index, 48*37da2899SCharles.Forsyth FT_Pointer buffer, 49*37da2899SCharles.Forsyth FT_UInt buffer_max ) 50*37da2899SCharles.Forsyth { 51*37da2899SCharles.Forsyth FT_String* gname; 52*37da2899SCharles.Forsyth 53*37da2899SCharles.Forsyth 54*37da2899SCharles.Forsyth gname = face->type1.glyph_names[glyph_index]; 55*37da2899SCharles.Forsyth 56*37da2899SCharles.Forsyth if ( buffer_max > 0 ) 57*37da2899SCharles.Forsyth { 58*37da2899SCharles.Forsyth FT_UInt len = (FT_UInt)( ft_strlen( gname ) ); 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth 61*37da2899SCharles.Forsyth if (len >= buffer_max) 62*37da2899SCharles.Forsyth len = buffer_max - 1; 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth FT_MEM_COPY( buffer, gname, len ); 65*37da2899SCharles.Forsyth ((FT_Byte*)buffer)[len] = 0; 66*37da2899SCharles.Forsyth } 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth return T1_Err_Ok; 69*37da2899SCharles.Forsyth } 70*37da2899SCharles.Forsyth 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsyth /*************************************************************************/ 73*37da2899SCharles.Forsyth /* */ 74*37da2899SCharles.Forsyth /* <Function> */ 75*37da2899SCharles.Forsyth /* t1_get_name_index */ 76*37da2899SCharles.Forsyth /* */ 77*37da2899SCharles.Forsyth /* <Description> */ 78*37da2899SCharles.Forsyth /* Uses the Type 1 font's `glyph_names' table to find a given glyph */ 79*37da2899SCharles.Forsyth /* name's glyph index. */ 80*37da2899SCharles.Forsyth /* */ 81*37da2899SCharles.Forsyth /* <Input> */ 82*37da2899SCharles.Forsyth /* face :: A handle to the source face object. */ 83*37da2899SCharles.Forsyth /* */ 84*37da2899SCharles.Forsyth /* glyph_name :: The glyph name. */ 85*37da2899SCharles.Forsyth /* */ 86*37da2899SCharles.Forsyth /* <Return> */ 87*37da2899SCharles.Forsyth /* Glyph index. 0 means `undefined character code'. */ 88*37da2899SCharles.Forsyth /* */ 89*37da2899SCharles.Forsyth static FT_UInt t1_get_name_index(T1_Face face,FT_String * glyph_name)90*37da2899SCharles.Forsyth t1_get_name_index( T1_Face face, 91*37da2899SCharles.Forsyth FT_String* glyph_name ) 92*37da2899SCharles.Forsyth { 93*37da2899SCharles.Forsyth FT_Int i; 94*37da2899SCharles.Forsyth FT_String* gname; 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth 97*37da2899SCharles.Forsyth for ( i = 0; i < face->type1.num_glyphs; i++ ) 98*37da2899SCharles.Forsyth { 99*37da2899SCharles.Forsyth gname = face->type1.glyph_names[i]; 100*37da2899SCharles.Forsyth 101*37da2899SCharles.Forsyth if ( !ft_strcmp( glyph_name, gname ) ) 102*37da2899SCharles.Forsyth return (FT_UInt)i; 103*37da2899SCharles.Forsyth } 104*37da2899SCharles.Forsyth 105*37da2899SCharles.Forsyth return 0; 106*37da2899SCharles.Forsyth } 107*37da2899SCharles.Forsyth 108*37da2899SCharles.Forsyth 109*37da2899SCharles.Forsyth static const char* t1_get_ps_name(T1_Face face)110*37da2899SCharles.Forsyth t1_get_ps_name( T1_Face face ) 111*37da2899SCharles.Forsyth { 112*37da2899SCharles.Forsyth return (const char*) face->type1.font_name; 113*37da2899SCharles.Forsyth } 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth /*************************************************************************/ 117*37da2899SCharles.Forsyth /* */ 118*37da2899SCharles.Forsyth /* <Function> */ 119*37da2899SCharles.Forsyth /* Get_Interface */ 120*37da2899SCharles.Forsyth /* */ 121*37da2899SCharles.Forsyth /* <Description> */ 122*37da2899SCharles.Forsyth /* Each driver can provide one or more extensions to the base */ 123*37da2899SCharles.Forsyth /* FreeType API. These can be used to access format specific */ 124*37da2899SCharles.Forsyth /* features (e.g., all TrueType/OpenType resources share a common */ 125*37da2899SCharles.Forsyth /* file structure and common tables which can be accessed through the */ 126*37da2899SCharles.Forsyth /* `sfnt' interface), or more simply generic ones (e.g., the */ 127*37da2899SCharles.Forsyth /* `postscript names' interface which can be used to retrieve the */ 128*37da2899SCharles.Forsyth /* PostScript name of a given glyph index). */ 129*37da2899SCharles.Forsyth /* */ 130*37da2899SCharles.Forsyth /* <InOut> */ 131*37da2899SCharles.Forsyth /* driver :: A handle to a driver object. */ 132*37da2899SCharles.Forsyth /* */ 133*37da2899SCharles.Forsyth /* <Input> */ 134*37da2899SCharles.Forsyth /* t1_interface :: A string designing the interface. Examples are */ 135*37da2899SCharles.Forsyth /* `sfnt', `post_names', `charmaps', etc. */ 136*37da2899SCharles.Forsyth /* */ 137*37da2899SCharles.Forsyth /* <Return> */ 138*37da2899SCharles.Forsyth /* A typeless pointer to the extension's interface (normally a table */ 139*37da2899SCharles.Forsyth /* of function pointers). Returns NULL if the requested extension */ 140*37da2899SCharles.Forsyth /* isn't available (i.e., wasn't compiled in the driver at build */ 141*37da2899SCharles.Forsyth /* time). */ 142*37da2899SCharles.Forsyth /* */ 143*37da2899SCharles.Forsyth static FT_Module_Interface Get_Interface(FT_Driver driver,const FT_String * t1_interface)144*37da2899SCharles.Forsyth Get_Interface( FT_Driver driver, 145*37da2899SCharles.Forsyth const FT_String* t1_interface ) 146*37da2899SCharles.Forsyth { 147*37da2899SCharles.Forsyth FT_UNUSED( driver ); 148*37da2899SCharles.Forsyth FT_UNUSED( t1_interface ); 149*37da2899SCharles.Forsyth 150*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t1_interface, "glyph_name" ) == 0 ) 151*37da2899SCharles.Forsyth return (FT_Module_Interface)t1_get_glyph_name; 152*37da2899SCharles.Forsyth 153*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t1_interface, "name_index" ) == 0 ) 154*37da2899SCharles.Forsyth return (FT_Module_Interface)t1_get_name_index; 155*37da2899SCharles.Forsyth 156*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t1_interface, "postscript_name" ) == 0 ) 157*37da2899SCharles.Forsyth return (FT_Module_Interface)t1_get_ps_name; 158*37da2899SCharles.Forsyth 159*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT 160*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t1_interface, "get_mm" ) == 0 ) 161*37da2899SCharles.Forsyth return (FT_Module_Interface)T1_Get_Multi_Master; 162*37da2899SCharles.Forsyth 163*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t1_interface, "set_mm_design") == 0 ) 164*37da2899SCharles.Forsyth return (FT_Module_Interface)T1_Set_MM_Design; 165*37da2899SCharles.Forsyth 166*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t1_interface, "set_mm_blend") == 0 ) 167*37da2899SCharles.Forsyth return (FT_Module_Interface)T1_Set_MM_Blend; 168*37da2899SCharles.Forsyth #endif 169*37da2899SCharles.Forsyth return 0; 170*37da2899SCharles.Forsyth } 171*37da2899SCharles.Forsyth 172*37da2899SCharles.Forsyth 173*37da2899SCharles.Forsyth #ifndef T1_CONFIG_OPTION_NO_AFM 174*37da2899SCharles.Forsyth 175*37da2899SCharles.Forsyth /*************************************************************************/ 176*37da2899SCharles.Forsyth /* */ 177*37da2899SCharles.Forsyth /* <Function> */ 178*37da2899SCharles.Forsyth /* Get_Kerning */ 179*37da2899SCharles.Forsyth /* */ 180*37da2899SCharles.Forsyth /* <Description> */ 181*37da2899SCharles.Forsyth /* A driver method used to return the kerning vector between two */ 182*37da2899SCharles.Forsyth /* glyphs of the same face. */ 183*37da2899SCharles.Forsyth /* */ 184*37da2899SCharles.Forsyth /* <Input> */ 185*37da2899SCharles.Forsyth /* face :: A handle to the source face object. */ 186*37da2899SCharles.Forsyth /* */ 187*37da2899SCharles.Forsyth /* left_glyph :: The index of the left glyph in the kern pair. */ 188*37da2899SCharles.Forsyth /* */ 189*37da2899SCharles.Forsyth /* right_glyph :: The index of the right glyph in the kern pair. */ 190*37da2899SCharles.Forsyth /* */ 191*37da2899SCharles.Forsyth /* <Output> */ 192*37da2899SCharles.Forsyth /* kerning :: The kerning vector. This is in font units for */ 193*37da2899SCharles.Forsyth /* scalable formats, and in pixels for fixed-sizes */ 194*37da2899SCharles.Forsyth /* formats. */ 195*37da2899SCharles.Forsyth /* */ 196*37da2899SCharles.Forsyth /* <Return> */ 197*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 198*37da2899SCharles.Forsyth /* */ 199*37da2899SCharles.Forsyth /* <Note> */ 200*37da2899SCharles.Forsyth /* Only horizontal layouts (left-to-right & right-to-left) are */ 201*37da2899SCharles.Forsyth /* supported by this function. Other layouts, or more sophisticated */ 202*37da2899SCharles.Forsyth /* kernings are out of scope of this method (the basic driver */ 203*37da2899SCharles.Forsyth /* interface is meant to be simple). */ 204*37da2899SCharles.Forsyth /* */ 205*37da2899SCharles.Forsyth /* They can be implemented by format-specific interfaces. */ 206*37da2899SCharles.Forsyth /* */ 207*37da2899SCharles.Forsyth static FT_Error Get_Kerning(T1_Face face,FT_UInt left_glyph,FT_UInt right_glyph,FT_Vector * kerning)208*37da2899SCharles.Forsyth Get_Kerning( T1_Face face, 209*37da2899SCharles.Forsyth FT_UInt left_glyph, 210*37da2899SCharles.Forsyth FT_UInt right_glyph, 211*37da2899SCharles.Forsyth FT_Vector* kerning ) 212*37da2899SCharles.Forsyth { 213*37da2899SCharles.Forsyth T1_AFM* afm; 214*37da2899SCharles.Forsyth 215*37da2899SCharles.Forsyth 216*37da2899SCharles.Forsyth kerning->x = 0; 217*37da2899SCharles.Forsyth kerning->y = 0; 218*37da2899SCharles.Forsyth 219*37da2899SCharles.Forsyth afm = (T1_AFM*)face->afm_data; 220*37da2899SCharles.Forsyth if ( afm ) 221*37da2899SCharles.Forsyth T1_Get_Kerning( afm, left_glyph, right_glyph, kerning ); 222*37da2899SCharles.Forsyth 223*37da2899SCharles.Forsyth return T1_Err_Ok; 224*37da2899SCharles.Forsyth } 225*37da2899SCharles.Forsyth 226*37da2899SCharles.Forsyth 227*37da2899SCharles.Forsyth #endif /* T1_CONFIG_OPTION_NO_AFM */ 228*37da2899SCharles.Forsyth 229*37da2899SCharles.Forsyth 230*37da2899SCharles.Forsyth 231*37da2899SCharles.Forsyth 232*37da2899SCharles.Forsyth FT_CALLBACK_TABLE_DEF 233*37da2899SCharles.Forsyth const FT_Driver_ClassRec t1_driver_class = 234*37da2899SCharles.Forsyth { 235*37da2899SCharles.Forsyth { 236*37da2899SCharles.Forsyth ft_module_font_driver | 237*37da2899SCharles.Forsyth ft_module_driver_scalable | 238*37da2899SCharles.Forsyth ft_module_driver_has_hinter, 239*37da2899SCharles.Forsyth 240*37da2899SCharles.Forsyth sizeof( FT_DriverRec ), 241*37da2899SCharles.Forsyth 242*37da2899SCharles.Forsyth "type1", 243*37da2899SCharles.Forsyth 0x10000L, 244*37da2899SCharles.Forsyth 0x20000L, 245*37da2899SCharles.Forsyth 246*37da2899SCharles.Forsyth 0, /* format interface */ 247*37da2899SCharles.Forsyth 248*37da2899SCharles.Forsyth (FT_Module_Constructor)T1_Driver_Init, 249*37da2899SCharles.Forsyth (FT_Module_Destructor) T1_Driver_Done, 250*37da2899SCharles.Forsyth (FT_Module_Requester) Get_Interface, 251*37da2899SCharles.Forsyth }, 252*37da2899SCharles.Forsyth 253*37da2899SCharles.Forsyth sizeof( T1_FaceRec ), 254*37da2899SCharles.Forsyth sizeof( T1_SizeRec ), 255*37da2899SCharles.Forsyth sizeof( T1_GlyphSlotRec ), 256*37da2899SCharles.Forsyth 257*37da2899SCharles.Forsyth (FT_Face_InitFunc) T1_Face_Init, 258*37da2899SCharles.Forsyth (FT_Face_DoneFunc) T1_Face_Done, 259*37da2899SCharles.Forsyth (FT_Size_InitFunc) T1_Size_Init, 260*37da2899SCharles.Forsyth (FT_Size_DoneFunc) T1_Size_Done, 261*37da2899SCharles.Forsyth (FT_Slot_InitFunc) T1_GlyphSlot_Init, 262*37da2899SCharles.Forsyth (FT_Slot_DoneFunc) T1_GlyphSlot_Done, 263*37da2899SCharles.Forsyth 264*37da2899SCharles.Forsyth (FT_Size_ResetPointsFunc) T1_Size_Reset, 265*37da2899SCharles.Forsyth (FT_Size_ResetPixelsFunc) T1_Size_Reset, 266*37da2899SCharles.Forsyth (FT_Slot_LoadFunc) T1_Load_Glyph, 267*37da2899SCharles.Forsyth 268*37da2899SCharles.Forsyth #ifdef T1_CONFIG_OPTION_NO_AFM 269*37da2899SCharles.Forsyth (FT_Face_GetKerningFunc) 0, 270*37da2899SCharles.Forsyth (FT_Face_AttachFunc) 0, 271*37da2899SCharles.Forsyth #else 272*37da2899SCharles.Forsyth (FT_Face_GetKerningFunc) Get_Kerning, 273*37da2899SCharles.Forsyth (FT_Face_AttachFunc) T1_Read_AFM, 274*37da2899SCharles.Forsyth #endif 275*37da2899SCharles.Forsyth (FT_Face_GetAdvancesFunc) 0 276*37da2899SCharles.Forsyth }; 277*37da2899SCharles.Forsyth 278*37da2899SCharles.Forsyth 279*37da2899SCharles.Forsyth /* END */ 280