1 /***************************************************************************/
5 /* Experimental Type 1 driver interface (body). */
7 /* Copyright 1996-2000 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
16 /***************************************************************************/
19 #ifdef FT_FLAT_COMPILE
28 #include <freetype/src/type1z/z1driver.h>
29 #include <freetype/src/type1z/z1gload.h>
30 #include <freetype/src/type1z/z1load.h>
31 #include <freetype/src/type1z/z1afm.h>
36 #include <freetype/internal/ftdebug.h>
37 #include <freetype/internal/ftstream.h>
38 #include <freetype/internal/psnames.h>
40 #include <string.h> /* for strcmp() */
43 /*************************************************************************/
45 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
46 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
47 /* messages during execution. */
50 #define FT_COMPONENT trace_z1driver
54 FT_Error get_z1_glyph_name( T1_Face face,
62 gname = face->type1.glyph_names[glyph_index];
66 FT_UInt len = strlen( gname );
69 if (len >= buffer_max)
72 MEM_Copy( buffer, gname, len );
73 ((FT_Byte*)buffer)[len] = 0;
80 /*************************************************************************/
86 /* Each driver can provide one or more extensions to the base */
87 /* FreeType API. These can be used to access format specific */
88 /* features (e.g., all TrueType/OpenType resources share a common */
89 /* file structure and common tables which can be accessed through the */
90 /* `sfnt' interface), or more simply generic ones (e.g., the */
91 /* `postscript names' interface which can be used to retrieve the */
92 /* PostScript name of a given glyph index). */
95 /* driver :: A handle to a driver object. */
98 /* interface :: A string designing the interface. Examples are */
99 /* `sfnt', `post_names', `charmaps', etc. */
102 /* A typeless pointer to the extension's interface (normally a table */
103 /* of function pointers). Returns NULL if the requested extension */
104 /* isn't available (i.e., wasn't compiled in the driver at build */
108 FT_Module_Interface Get_Interface( FT_Driver driver,
109 const FT_String* interface )
112 FT_UNUSED( interface );
114 if ( strcmp( (const char*)interface, "glyph_name" ) == 0 )
115 return (FT_Module_Interface)get_z1_glyph_name;
117 #ifndef Z1_CONFIG_OPTION_NO_MM_SUPPORT
118 if ( strcmp( (const char*)interface, "get_mm" ) == 0 )
119 return (FT_Module_Interface)Z1_Get_Multi_Master;
121 if ( strcmp( (const char*)interface, "set_mm_design") == 0 )
122 return (FT_Module_Interface)Z1_Set_MM_Design;
124 if ( strcmp( (const char*)interface, "set_mm_blend") == 0 )
125 return (FT_Module_Interface)Z1_Set_MM_Blend;
131 #ifndef Z1_CONFIG_OPTION_NO_AFM
133 /*************************************************************************/
139 /* A driver method used to return the kerning vector between two */
140 /* glyphs of the same face. */
143 /* face :: A handle to the source face object. */
145 /* left_glyph :: The index of the left glyph in the kern pair. */
147 /* right_glyph :: The index of the right glyph in the kern pair. */
150 /* kerning :: The kerning vector. This is in font units for */
151 /* scalable formats, and in pixels for fixed-sizes */
155 /* FreeType error code. 0 means success. */
158 /* Only horizontal layouts (left-to-right & right-to-left) are */
159 /* supported by this function. Other layouts, or more sophisticated */
160 /* kernings are out of scope of this method (the basic driver */
161 /* interface is meant to be simple). */
163 /* They can be implemented by format-specific interfaces. */
166 FT_Error Get_Kerning( T1_Face face,
177 afm = (Z1_AFM*)face->afm_data;
179 Z1_Get_Kerning( afm, left_glyph, right_glyph, kerning );
185 #endif /* T1_CONFIG_OPTION_NO_AFM */
188 /*************************************************************************/
194 /* Uses a charmap to return a given character code's glyph index. */
197 /* charmap :: A handle to the source charmap object. */
198 /* charcode :: The character code. */
201 /* Glyph index. 0 means `undefined character code'. */
204 FT_UInt Get_Char_Index( FT_CharMap charmap,
209 PSNames_Interface* psnames;
212 face = (T1_Face)charmap->face;
213 psnames = (PSNames_Interface*)face->psnames;
215 switch ( charmap->encoding )
217 /*******************************************************************/
219 /* Unicode encoding support */
221 case ft_encoding_unicode:
222 /* use the `PSNames' module to synthetize the Unicode charmap */
223 result = psnames->lookup_unicode( &face->unicode_map,
224 (FT_ULong)charcode );
226 /* the function returns 0xFFFF if the Unicode charcode has */
227 /* no corresponding glyph */
228 if ( result == 0xFFFF )
232 /*******************************************************************/
234 /* Custom Type 1 encoding */
236 case ft_encoding_adobe_custom:
238 T1_Encoding* encoding = &face->type1.encoding;
241 if ( charcode >= encoding->code_first &&
242 charcode <= encoding->code_last )
243 result = encoding->char_index[charcode];
247 /*******************************************************************/
249 /* Adobe Standard & Expert encoding support */
252 if ( charcode < 256 )
256 const char* glyph_name;
259 code = psnames->adobe_std_encoding[charcode];
260 if ( charmap->encoding == ft_encoding_adobe_expert )
261 code = psnames->adobe_expert_encoding[charcode];
263 glyph_name = psnames->adobe_std_strings( code );
267 for ( n = 0; n < face->type1.num_glyphs; n++ )
269 const char* gname = face->type1.glyph_names[n];
272 if ( gname && gname[0] == glyph_name[0] &&
273 strcmp( gname, glyph_name ) == 0 )
286 const FT_Driver_Class t1_driver_class =
289 ft_module_font_driver | ft_module_driver_scalable,
290 sizeof( FT_DriverRec ),
296 0, /* format interface */
298 (FT_Module_Constructor)Z1_Init_Driver,
299 (FT_Module_Destructor) Z1_Done_Driver,
300 (FT_Module_Requester) Get_Interface,
303 sizeof( T1_FaceRec ),
304 sizeof( Z1_SizeRec ),
305 sizeof( Z1_GlyphSlotRec ),
307 (FTDriver_initFace) Z1_Init_Face,
308 (FTDriver_doneFace) Z1_Done_Face,
309 (FTDriver_initSize) 0,
310 (FTDriver_doneSize) 0,
311 (FTDriver_initGlyphSlot)0,
312 (FTDriver_doneGlyphSlot)0,
314 (FTDriver_setCharSizes) 0,
315 (FTDriver_setPixelSizes)0,
316 (FTDriver_loadGlyph) Z1_Load_Glyph,
317 (FTDriver_getCharIndex) Get_Char_Index,
319 #ifdef Z1_CONFIG_OPTION_NO_AFM
320 (FTDriver_getKerning) 0,
321 (FTDriver_attachFile) 0,
323 (FTDriver_getKerning) Get_Kerning,
324 (FTDriver_attachFile) Z1_Read_AFM,
326 (FTDriver_getAdvances) 0
330 #ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS
332 EXPORT_FUNC( const FT_Driver_Class* ) getDriverClass( void )
334 return &t1z_driver_class;
337 #endif /* FT_CONFIG_OPTION_DYNAMIC_DRIVERS */