1 /***************************************************************************/ 2 /* */ 3 /* cidriver.c */ 4 /* */ 5 /* CID driver interface (body). */ 6 /* */ 7 /* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9 /* */ 10 /* This file is part of the FreeType project, and may only be used, */ 11 /* modified, and distributed under the terms of the FreeType project */ 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13 /* this file you indicate that you have read the license and */ 14 /* understand and accept it fully. */ 15 /* */ 16 /***************************************************************************/ 17 18 19 #include <ft2build.h> 20 #include "cidriver.h" 21 #include "cidgload.h" 22 #include FT_INTERNAL_DEBUG_H 23 24 #include "ciderrs.h" 25 26 #include FT_SERVICE_POSTSCRIPT_NAME_H 27 #include FT_SERVICE_XFREE86_NAME_H 28 #include FT_SERVICE_POSTSCRIPT_INFO_H 29 #include FT_SERVICE_CID_H 30 31 32 /*************************************************************************/ 33 /* */ 34 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 35 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 36 /* messages during execution. */ 37 /* */ 38 #undef FT_COMPONENT 39 #define FT_COMPONENT trace_ciddriver 40 41 42 /* 43 * POSTSCRIPT NAME SERVICE 44 * 45 */ 46 47 static const char* cid_get_postscript_name(CID_Face face)48 cid_get_postscript_name( CID_Face face ) 49 { 50 const char* result = face->cid.cid_font_name; 51 52 53 if ( result && result[0] == '/' ) 54 result++; 55 56 return result; 57 } 58 59 60 static const FT_Service_PsFontNameRec cid_service_ps_name = 61 { 62 (FT_PsName_GetFunc) cid_get_postscript_name 63 }; 64 65 66 /* 67 * POSTSCRIPT INFO SERVICE 68 * 69 */ 70 71 static FT_Error cid_ps_get_font_info(FT_Face face,PS_FontInfoRec * afont_info)72 cid_ps_get_font_info( FT_Face face, 73 PS_FontInfoRec* afont_info ) 74 { 75 *afont_info = ((CID_Face)face)->cid.font_info; 76 77 return FT_Err_Ok; 78 } 79 80 static FT_Error cid_ps_get_font_extra(FT_Face face,PS_FontExtraRec * afont_extra)81 cid_ps_get_font_extra( FT_Face face, 82 PS_FontExtraRec* afont_extra ) 83 { 84 *afont_extra = ((CID_Face)face)->font_extra; 85 86 return FT_Err_Ok; 87 } 88 89 static const FT_Service_PsInfoRec cid_service_ps_info = 90 { 91 (PS_GetFontInfoFunc) cid_ps_get_font_info, 92 (PS_GetFontExtraFunc) cid_ps_get_font_extra, 93 (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */ 94 (PS_GetFontPrivateFunc)NULL, /* unsupported */ 95 (PS_GetFontValueFunc) NULL /* not implemented */ 96 }; 97 98 99 /* 100 * CID INFO SERVICE 101 * 102 */ 103 static FT_Error cid_get_ros(CID_Face face,const char ** registry,const char ** ordering,FT_Int * supplement)104 cid_get_ros( CID_Face face, 105 const char* *registry, 106 const char* *ordering, 107 FT_Int *supplement ) 108 { 109 CID_FaceInfo cid = &face->cid; 110 111 112 if ( registry ) 113 *registry = cid->registry; 114 115 if ( ordering ) 116 *ordering = cid->ordering; 117 118 if ( supplement ) 119 *supplement = cid->supplement; 120 121 return FT_Err_Ok; 122 } 123 124 125 static FT_Error cid_get_is_cid(CID_Face face,FT_Bool * is_cid)126 cid_get_is_cid( CID_Face face, 127 FT_Bool *is_cid ) 128 { 129 FT_Error error = FT_Err_Ok; 130 FT_UNUSED( face ); 131 132 133 if ( is_cid ) 134 *is_cid = 1; /* cid driver is only used for CID keyed fonts */ 135 136 return error; 137 } 138 139 140 static FT_Error cid_get_cid_from_glyph_index(CID_Face face,FT_UInt glyph_index,FT_UInt * cid)141 cid_get_cid_from_glyph_index( CID_Face face, 142 FT_UInt glyph_index, 143 FT_UInt *cid ) 144 { 145 FT_Error error = FT_Err_Ok; 146 FT_UNUSED( face ); 147 148 149 if ( cid ) 150 *cid = glyph_index; /* identity mapping */ 151 152 return error; 153 } 154 155 156 static const FT_Service_CIDRec cid_service_cid_info = 157 { 158 (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros, 159 (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid, 160 (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index 161 }; 162 163 164 /* 165 * SERVICE LIST 166 * 167 */ 168 169 static const FT_ServiceDescRec cid_services[] = 170 { 171 { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, 172 { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, 173 { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, 174 { FT_SERVICE_ID_CID, &cid_service_cid_info }, 175 { NULL, NULL } 176 }; 177 178 179 FT_CALLBACK_DEF( FT_Module_Interface ) cid_get_interface(FT_Module module,const char * cid_interface)180 cid_get_interface( FT_Module module, 181 const char* cid_interface ) 182 { 183 FT_UNUSED( module ); 184 185 return ft_service_list_lookup( cid_services, cid_interface ); 186 } 187 188 189 190 FT_CALLBACK_TABLE_DEF 191 const FT_Driver_ClassRec t1cid_driver_class = 192 { 193 /* first of all, the FT_Module_Class fields */ 194 { 195 FT_MODULE_FONT_DRIVER | 196 FT_MODULE_DRIVER_SCALABLE | 197 FT_MODULE_DRIVER_HAS_HINTER, 198 199 sizeof ( FT_DriverRec ), 200 "t1cid", /* module name */ 201 0x10000L, /* version 1.0 of driver */ 202 0x20000L, /* requires FreeType 2.0 */ 203 204 0, 205 206 cid_driver_init, 207 cid_driver_done, 208 cid_get_interface 209 }, 210 211 /* then the other font drivers fields */ 212 sizeof ( CID_FaceRec ), 213 sizeof ( CID_SizeRec ), 214 sizeof ( CID_GlyphSlotRec ), 215 216 cid_face_init, 217 cid_face_done, 218 219 cid_size_init, 220 cid_size_done, 221 cid_slot_init, 222 cid_slot_done, 223 224 cid_slot_load_glyph, 225 226 0, /* FT_Face_GetKerningFunc */ 227 0, /* FT_Face_AttachFunc */ 228 229 0, /* FT_Face_GetAdvancesFunc */ 230 231 cid_size_request, 232 0 /* FT_Size_SelectFunc */ 233 }; 234 235 236 /* END */ 237