1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* t42drivr.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* High-level Type 42 driver interface (body). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 2002 by Roberto Alameda. */ 8*37da2899SCharles.Forsyth /* */ 9*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 10*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 11*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 12*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 13*37da2899SCharles.Forsyth /* understand and accept it fully. */ 14*37da2899SCharles.Forsyth /* */ 15*37da2899SCharles.Forsyth /***************************************************************************/ 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsyth /*************************************************************************/ 19*37da2899SCharles.Forsyth /* */ 20*37da2899SCharles.Forsyth /* This driver implements Type42 fonts as described in the */ 21*37da2899SCharles.Forsyth /* Technical Note #5012 from Adobe, with these limitations: */ 22*37da2899SCharles.Forsyth /* */ 23*37da2899SCharles.Forsyth /* 1) CID Fonts are not currently supported. */ 24*37da2899SCharles.Forsyth /* 2) Incremental fonts making use of the GlyphDirectory keyword */ 25*37da2899SCharles.Forsyth /* will be loaded, but the rendering will be using the TrueType */ 26*37da2899SCharles.Forsyth /* tables. */ 27*37da2899SCharles.Forsyth /* 3) The sfnts array is expected to be ASCII, not binary. */ 28*37da2899SCharles.Forsyth /* 4) As for Type1 fonts, CDevProc is not supported. */ 29*37da2899SCharles.Forsyth /* 5) The Metrics dictionary is not supported. */ 30*37da2899SCharles.Forsyth /* 6) AFM metrics are not supported. */ 31*37da2899SCharles.Forsyth /* */ 32*37da2899SCharles.Forsyth /* In other words, this driver supports Type42 fonts derived from */ 33*37da2899SCharles.Forsyth /* TrueType fonts in a non-CID manner, as done by usual conversion */ 34*37da2899SCharles.Forsyth /* programs. */ 35*37da2899SCharles.Forsyth /* */ 36*37da2899SCharles.Forsyth /*************************************************************************/ 37*37da2899SCharles.Forsyth 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth #include "t42drivr.h" 40*37da2899SCharles.Forsyth #include "t42objs.h" 41*37da2899SCharles.Forsyth #include "t42error.h" 42*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 43*37da2899SCharles.Forsyth 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsyth #undef FT_COMPONENT 46*37da2899SCharles.Forsyth #define FT_COMPONENT trace_t42 47*37da2899SCharles.Forsyth 48*37da2899SCharles.Forsyth 49*37da2899SCharles.Forsyth static FT_Error t42_get_glyph_name(T42_Face face,FT_UInt glyph_index,FT_Pointer buffer,FT_UInt buffer_max)50*37da2899SCharles.Forsyth t42_get_glyph_name( T42_Face face, 51*37da2899SCharles.Forsyth FT_UInt glyph_index, 52*37da2899SCharles.Forsyth FT_Pointer buffer, 53*37da2899SCharles.Forsyth FT_UInt buffer_max ) 54*37da2899SCharles.Forsyth { 55*37da2899SCharles.Forsyth FT_String* gname; 56*37da2899SCharles.Forsyth 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth gname = face->type1.glyph_names[glyph_index]; 59*37da2899SCharles.Forsyth 60*37da2899SCharles.Forsyth if ( buffer_max > 0 ) 61*37da2899SCharles.Forsyth { 62*37da2899SCharles.Forsyth FT_UInt len = (FT_UInt)( ft_strlen( gname ) ); 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsyth 65*37da2899SCharles.Forsyth if ( len >= buffer_max ) 66*37da2899SCharles.Forsyth len = buffer_max - 1; 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth FT_MEM_COPY( buffer, gname, len ); 69*37da2899SCharles.Forsyth ((FT_Byte*)buffer)[len] = 0; 70*37da2899SCharles.Forsyth } 71*37da2899SCharles.Forsyth 72*37da2899SCharles.Forsyth return T42_Err_Ok; 73*37da2899SCharles.Forsyth } 74*37da2899SCharles.Forsyth 75*37da2899SCharles.Forsyth 76*37da2899SCharles.Forsyth static const char* t42_get_ps_name(T42_Face face)77*37da2899SCharles.Forsyth t42_get_ps_name( T42_Face face ) 78*37da2899SCharles.Forsyth { 79*37da2899SCharles.Forsyth return (const char*)face->type1.font_name; 80*37da2899SCharles.Forsyth } 81*37da2899SCharles.Forsyth 82*37da2899SCharles.Forsyth 83*37da2899SCharles.Forsyth static FT_UInt t42_get_name_index(T42_Face face,FT_String * glyph_name)84*37da2899SCharles.Forsyth t42_get_name_index( T42_Face face, 85*37da2899SCharles.Forsyth FT_String* glyph_name ) 86*37da2899SCharles.Forsyth { 87*37da2899SCharles.Forsyth FT_Int i; 88*37da2899SCharles.Forsyth FT_String* gname; 89*37da2899SCharles.Forsyth 90*37da2899SCharles.Forsyth 91*37da2899SCharles.Forsyth for ( i = 0; i < face->type1.num_glyphs; i++ ) 92*37da2899SCharles.Forsyth { 93*37da2899SCharles.Forsyth gname = face->type1.glyph_names[i]; 94*37da2899SCharles.Forsyth 95*37da2899SCharles.Forsyth if ( !ft_strcmp( glyph_name, gname ) ) 96*37da2899SCharles.Forsyth return ft_atoi( (const char *)face->type1.charstrings[i] ); 97*37da2899SCharles.Forsyth } 98*37da2899SCharles.Forsyth 99*37da2899SCharles.Forsyth return 0; 100*37da2899SCharles.Forsyth } 101*37da2899SCharles.Forsyth 102*37da2899SCharles.Forsyth 103*37da2899SCharles.Forsyth static FT_Module_Interface T42_Get_Interface(FT_Driver driver,const FT_String * t42_interface)104*37da2899SCharles.Forsyth T42_Get_Interface( FT_Driver driver, 105*37da2899SCharles.Forsyth const FT_String* t42_interface ) 106*37da2899SCharles.Forsyth { 107*37da2899SCharles.Forsyth FT_UNUSED( driver ); 108*37da2899SCharles.Forsyth 109*37da2899SCharles.Forsyth /* Any additional interface are defined here */ 110*37da2899SCharles.Forsyth if (ft_strcmp( (const char*)t42_interface, "glyph_name" ) == 0 ) 111*37da2899SCharles.Forsyth return (FT_Module_Interface)t42_get_glyph_name; 112*37da2899SCharles.Forsyth 113*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t42_interface, "name_index" ) == 0 ) 114*37da2899SCharles.Forsyth return (FT_Module_Interface)t42_get_name_index; 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth if ( ft_strcmp( (const char*)t42_interface, "postscript_name" ) == 0 ) 117*37da2899SCharles.Forsyth return (FT_Module_Interface)t42_get_ps_name; 118*37da2899SCharles.Forsyth 119*37da2899SCharles.Forsyth return 0; 120*37da2899SCharles.Forsyth } 121*37da2899SCharles.Forsyth 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsyth const FT_Driver_ClassRec t42_driver_class = 124*37da2899SCharles.Forsyth { 125*37da2899SCharles.Forsyth { 126*37da2899SCharles.Forsyth ft_module_font_driver | 127*37da2899SCharles.Forsyth ft_module_driver_scalable | 128*37da2899SCharles.Forsyth #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER 129*37da2899SCharles.Forsyth ft_module_driver_has_hinter, 130*37da2899SCharles.Forsyth #else 131*37da2899SCharles.Forsyth 0, 132*37da2899SCharles.Forsyth #endif 133*37da2899SCharles.Forsyth 134*37da2899SCharles.Forsyth sizeof ( T42_DriverRec ), 135*37da2899SCharles.Forsyth 136*37da2899SCharles.Forsyth "type42", 137*37da2899SCharles.Forsyth 0x10000L, 138*37da2899SCharles.Forsyth 0x20000L, 139*37da2899SCharles.Forsyth 140*37da2899SCharles.Forsyth 0, /* format interface */ 141*37da2899SCharles.Forsyth 142*37da2899SCharles.Forsyth (FT_Module_Constructor)T42_Driver_Init, 143*37da2899SCharles.Forsyth (FT_Module_Destructor) T42_Driver_Done, 144*37da2899SCharles.Forsyth (FT_Module_Requester) T42_Get_Interface, 145*37da2899SCharles.Forsyth }, 146*37da2899SCharles.Forsyth 147*37da2899SCharles.Forsyth sizeof ( T42_FaceRec ), 148*37da2899SCharles.Forsyth sizeof ( T42_SizeRec ), 149*37da2899SCharles.Forsyth sizeof ( T42_GlyphSlotRec ), 150*37da2899SCharles.Forsyth 151*37da2899SCharles.Forsyth (FT_Face_InitFunc) T42_Face_Init, 152*37da2899SCharles.Forsyth (FT_Face_DoneFunc) T42_Face_Done, 153*37da2899SCharles.Forsyth (FT_Size_InitFunc) T42_Size_Init, 154*37da2899SCharles.Forsyth (FT_Size_DoneFunc) T42_Size_Done, 155*37da2899SCharles.Forsyth (FT_Slot_InitFunc) T42_GlyphSlot_Init, 156*37da2899SCharles.Forsyth (FT_Slot_DoneFunc) T42_GlyphSlot_Done, 157*37da2899SCharles.Forsyth 158*37da2899SCharles.Forsyth (FT_Size_ResetPointsFunc) T42_Size_SetChars, 159*37da2899SCharles.Forsyth (FT_Size_ResetPixelsFunc) T42_Size_SetPixels, 160*37da2899SCharles.Forsyth (FT_Slot_LoadFunc) T42_GlyphSlot_Load, 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth (FT_Face_GetKerningFunc) 0, 163*37da2899SCharles.Forsyth (FT_Face_AttachFunc) 0, 164*37da2899SCharles.Forsyth 165*37da2899SCharles.Forsyth (FT_Face_GetAdvancesFunc) 0 166*37da2899SCharles.Forsyth }; 167*37da2899SCharles.Forsyth 168*37da2899SCharles.Forsyth 169*37da2899SCharles.Forsyth /* END */ 170