?? cffdrivr.c
字號:
FT_MEM_COPY( buffer, gname, len ); ((FT_Byte*)buffer)[len] = 0; } FT_FREE( gname ); error = CFF_Err_Ok; Exit: return error; } static FT_UInt cff_get_name_index( CFF_Face face, FT_String* glyph_name ) { CFF_Font cff; CFF_Charset charset; FT_Service_PsCMaps psnames; FT_Memory memory = FT_FACE_MEMORY( face ); FT_String* name; FT_UShort sid; FT_UInt i; FT_Int result; cff = (CFF_FontRec *)face->extra.data; charset = &cff->charset; FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); if ( !psnames ) return 0; for ( i = 0; i < cff->num_glyphs; i++ ) { sid = charset->sids[i]; if ( sid > 390 ) name = cff_index_get_name( &cff->string_index, sid - 391 ); else name = (FT_String *)psnames->adobe_std_strings( sid ); result = ft_strcmp( glyph_name, name ); if ( sid > 390 ) FT_FREE( name ); if ( !result ) return i; } return 0; } static const FT_Service_GlyphDictRec cff_service_glyph_dict = { (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, (FT_GlyphDict_NameIndexFunc)cff_get_name_index, }; /* * POSTSCRIPT INFO SERVICE * */ static FT_Int cff_ps_has_glyph_names( FT_Face face ) { return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; } static const FT_Service_PsInfoRec cff_service_ps_info = { (PS_GetFontInfoFunc) NULL, /* unsupported with CFF fonts */ (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ }; /* * TT CMAP INFO * * If the charmap is a synthetic Unicode encoding cmap or * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO * service defined in SFNT module. * * Otherwise call the service function in the sfnt module. * */ static FT_Error cff_get_cmap_info( FT_CharMap charmap, TT_CMapInfo *cmap_info ) { FT_CMap cmap = FT_CMAP( charmap ); FT_Error error = CFF_Err_Ok; cmap_info->language = 0; if ( cmap->clazz != &cff_cmap_encoding_class_rec && cmap->clazz != &cff_cmap_unicode_class_rec ) { FT_Face face = FT_CMAP_FACE( cmap ); FT_Library library = FT_FACE_LIBRARY( face ); FT_Module sfnt = FT_Get_Module( library, "sfnt" ); FT_Service_TTCMaps service = (FT_Service_TTCMaps)ft_module_get_service( sfnt, FT_SERVICE_ID_TT_CMAP ); if ( service && service->get_cmap_info ) error = service->get_cmap_info( charmap, cmap_info ); } return error; } static const FT_Service_TTCMapsRec cff_service_get_cmap_info = { (TT_CMap_Info_GetFunc)cff_get_cmap_info }; /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** D R I V E R I N T E R F A C E ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ static const FT_ServiceDescRec cff_services[] = { { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF }, { FT_SERVICE_ID_POSTSCRIPT_INFO, &cff_service_ps_info },#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES { FT_SERVICE_ID_GLYPH_DICT, &cff_service_glyph_dict },#endif { FT_SERVICE_ID_TT_CMAP, &cff_service_get_cmap_info }, { NULL, NULL } }; FT_CALLBACK_DEF( FT_Module_Interface ) cff_get_interface( FT_Module driver, /* CFF_Driver */ const char* module_interface ) { FT_Module sfnt; FT_Module_Interface result; result = ft_service_list_lookup( cff_services, module_interface ); if ( result != NULL ) return result; /* we pass our request to the `sfnt' module */ sfnt = FT_Get_Module( driver->library, "sfnt" ); return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; } /* The FT_DriverInterface structure is defined in ftdriver.h. */ FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec cff_driver_class = { /* begin with the FT_Module_Class fields */ { FT_MODULE_FONT_DRIVER | FT_MODULE_DRIVER_SCALABLE | FT_MODULE_DRIVER_HAS_HINTER, sizeof( CFF_DriverRec ), "cff", 0x10000L, 0x20000L, 0, /* module-specific interface */ cff_driver_init, cff_driver_done, cff_get_interface, }, /* now the specific driver fields */ sizeof( TT_FaceRec ), sizeof( CFF_SizeRec ), sizeof( CFF_GlyphSlotRec ), cff_face_init, cff_face_done, cff_size_init, cff_size_done, cff_slot_init, cff_slot_done,#ifdef FT_CONFIG_OPTION_OLD_INTERNALS ft_stub_set_char_sizes, ft_stub_set_pixel_sizes,#endif Load_Glyph, cff_get_kerning, 0, /* FT_Face_AttachFunc */ 0, /* FT_Face_GetAdvancesFunc */ cff_size_request,#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS cff_size_select#else 0 /* FT_Size_SelectFunc */#endif };/* END */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -