00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <ft2build.h>
00020 #include "t1driver.h"
00021 #include "t1gload.h"
00022 #include "t1load.h"
00023
00024 #include "t1errors.h"
00025
00026 #ifndef T1_CONFIG_OPTION_NO_AFM
00027 #include "t1afm.h"
00028 #endif
00029
00030 #include FT_INTERNAL_DEBUG_H
00031 #include FT_INTERNAL_STREAM_H
00032
00033 #include FT_SERVICE_MULTIPLE_MASTERS_H
00034 #include FT_SERVICE_GLYPH_DICT_H
00035 #include FT_SERVICE_XFREE86_NAME_H
00036 #include FT_SERVICE_POSTSCRIPT_NAME_H
00037 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
00038 #include FT_SERVICE_POSTSCRIPT_INFO_H
00039 #include FT_SERVICE_KERNING_H
00040
00041
00042
00043
00044
00045
00046
00047
00048 #undef FT_COMPONENT
00049 #define FT_COMPONENT trace_t1driver
00050
00051
00052
00053
00054
00055
00056 static FT_Error
00057 t1_get_glyph_name( T1_Face face,
00058 FT_UInt glyph_index,
00059 FT_Pointer buffer,
00060 FT_UInt buffer_max )
00061 {
00062 FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
00063
00064 return T1_Err_Ok;
00065 }
00066
00067
00068 static FT_UInt
00069 t1_get_name_index( T1_Face face,
00070 FT_String* glyph_name )
00071 {
00072 FT_Int i;
00073 FT_String* gname;
00074
00075
00076 for ( i = 0; i < face->type1.num_glyphs; i++ )
00077 {
00078 gname = face->type1.glyph_names[i];
00079
00080 if ( !ft_strcmp( glyph_name, gname ) )
00081 return (FT_UInt)i;
00082 }
00083
00084 return 0;
00085 }
00086
00087
00088 static const FT_Service_GlyphDictRec t1_service_glyph_dict =
00089 {
00090 (FT_GlyphDict_GetNameFunc) t1_get_glyph_name,
00091 (FT_GlyphDict_NameIndexFunc)t1_get_name_index
00092 };
00093
00094
00095
00096
00097
00098
00099
00100 static const char*
00101 t1_get_ps_name( T1_Face face )
00102 {
00103 return (const char*) face->type1.font_name;
00104 }
00105
00106
00107 static const FT_Service_PsFontNameRec t1_service_ps_name =
00108 {
00109 (FT_PsName_GetFunc)t1_get_ps_name
00110 };
00111
00112
00113
00114
00115
00116
00117
00118 #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
00119 static const FT_Service_MultiMastersRec t1_service_multi_masters =
00120 {
00121 (FT_Get_MM_Func) T1_Get_Multi_Master,
00122 (FT_Set_MM_Design_Func) T1_Set_MM_Design,
00123 (FT_Set_MM_Blend_Func) T1_Set_MM_Blend,
00124 (FT_Get_MM_Var_Func) T1_Get_MM_Var,
00125 (FT_Set_Var_Design_Func)T1_Set_Var_Design
00126 };
00127 #endif
00128
00129
00130
00131
00132
00133
00134
00135 static FT_Error
00136 t1_ps_get_font_info( FT_Face face,
00137 PS_FontInfoRec* afont_info )
00138 {
00139 *afont_info = ((T1_Face)face)->type1.font_info;
00140
00141 return T1_Err_Ok;
00142 }
00143
00144
00145 static FT_Error
00146 t1_ps_get_font_extra( FT_Face face,
00147 PS_FontExtraRec* afont_extra )
00148 {
00149 *afont_extra = ((T1_Face)face)->type1.font_extra;
00150
00151 return T1_Err_Ok;
00152 }
00153
00154
00155 static FT_Int
00156 t1_ps_has_glyph_names( FT_Face face )
00157 {
00158 FT_UNUSED( face );
00159
00160 return 1;
00161 }
00162
00163
00164 static FT_Error
00165 t1_ps_get_font_private( FT_Face face,
00166 PS_PrivateRec* afont_private )
00167 {
00168 *afont_private = ((T1_Face)face)->type1.private_dict;
00169
00170 return T1_Err_Ok;
00171 }
00172
00173
00174 static const FT_Service_PsInfoRec t1_service_ps_info =
00175 {
00176 (PS_GetFontInfoFunc) t1_ps_get_font_info,
00177 (PS_GetFontExtraFunc) t1_ps_get_font_extra,
00178 (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
00179 (PS_GetFontPrivateFunc)t1_ps_get_font_private,
00180 };
00181
00182
00183 #ifndef T1_CONFIG_OPTION_NO_AFM
00184 static const FT_Service_KerningRec t1_service_kerning =
00185 {
00186 T1_Get_Track_Kerning,
00187 };
00188 #endif
00189
00190
00191
00192
00193
00194
00195
00196 static const FT_ServiceDescRec t1_services[] =
00197 {
00198 { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
00199 { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict },
00200 { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 },
00201 { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info },
00202
00203 #ifndef T1_CONFIG_OPTION_NO_AFM
00204 { FT_SERVICE_ID_KERNING, &t1_service_kerning },
00205 #endif
00206
00207 #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
00208 { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters },
00209 #endif
00210 { NULL, NULL }
00211 };
00212
00213
00214 static FT_Module_Interface
00215 Get_Interface( FT_Driver driver,
00216 const FT_String* t1_interface )
00217 {
00218 FT_UNUSED( driver );
00219
00220 return ft_service_list_lookup( t1_services, t1_interface );
00221 }
00222
00223
00224 #ifndef T1_CONFIG_OPTION_NO_AFM
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 static FT_Error
00259 Get_Kerning( T1_Face face,
00260 FT_UInt left_glyph,
00261 FT_UInt right_glyph,
00262 FT_Vector* kerning )
00263 {
00264 kerning->x = 0;
00265 kerning->y = 0;
00266
00267 if ( face->afm_data )
00268 T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
00269 left_glyph,
00270 right_glyph,
00271 kerning );
00272
00273 return T1_Err_Ok;
00274 }
00275
00276
00277 #endif
00278
00279
00280 FT_CALLBACK_TABLE_DEF
00281 const FT_Driver_ClassRec t1_driver_class =
00282 {
00283 {
00284 FT_MODULE_FONT_DRIVER |
00285 FT_MODULE_DRIVER_SCALABLE |
00286 FT_MODULE_DRIVER_HAS_HINTER,
00287
00288 sizeof( FT_DriverRec ),
00289
00290 "type1",
00291 0x10000L,
00292 0x20000L,
00293
00294 0,
00295
00296 (FT_Module_Constructor)T1_Driver_Init,
00297 (FT_Module_Destructor) T1_Driver_Done,
00298 (FT_Module_Requester) Get_Interface,
00299 },
00300
00301 sizeof( T1_FaceRec ),
00302 sizeof( T1_SizeRec ),
00303 sizeof( T1_GlyphSlotRec ),
00304
00305 (FT_Face_InitFunc) T1_Face_Init,
00306 (FT_Face_DoneFunc) T1_Face_Done,
00307 (FT_Size_InitFunc) T1_Size_Init,
00308 (FT_Size_DoneFunc) T1_Size_Done,
00309 (FT_Slot_InitFunc) T1_GlyphSlot_Init,
00310 (FT_Slot_DoneFunc) T1_GlyphSlot_Done,
00311
00312 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
00313 ft_stub_set_char_sizes,
00314 ft_stub_set_pixel_sizes,
00315 #endif
00316 (FT_Slot_LoadFunc) T1_Load_Glyph,
00317
00318 #ifdef T1_CONFIG_OPTION_NO_AFM
00319 (FT_Face_GetKerningFunc) 0,
00320 (FT_Face_AttachFunc) 0,
00321 #else
00322 (FT_Face_GetKerningFunc) Get_Kerning,
00323 (FT_Face_AttachFunc) T1_Read_Metrics,
00324 #endif
00325 (FT_Face_GetAdvancesFunc) T1_Get_Advances,
00326 (FT_Size_RequestFunc) T1_Size_Request,
00327 (FT_Size_SelectFunc) 0
00328 };
00329
00330
00331