📄 t1driver.c
字号:
/******************************************************************* * * t1driver.c * * High-level Type1 driver interface for FreeType 2.0 * * Copyright 1996-1998 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, * modified, and distributed under the terms of the FreeType project * license, LICENSE.TXT. By continuing to use, modify, or distribute * this file you indicate that you have read the license and * understand and accept it fully. * ******************************************************************/#include <t1driver.h>#include <t1gload.h>#include <t1afm.h>#include <ftdebug.h>#include <ftstream.h>#include <psnames.h>#undef FT_COMPONENT#define FT_COMPONENT trace_t1driver#ifndef T1_CONFIG_OPTION_NO_AFM /*************************************************************************/ /* */ /* <Function> */ /* Get_Interface */ /* */ /* <Description> */ /* Each driver can provide one or more extensions to the base */ /* FreeType API. These can be used to access format specific */ /* features (e.g., all TrueType/OpenType resources share a common */ /* file structure and common tables which can be accessed through the */ /* `sfnt' interface), or more simply generic ones (e.g., the */ /* `postscript names' interface which can be used to retrieve the */ /* PostScript name of a given glyph index). */ /* */ /* <InOut> */ /* driver :: A handle to a driver object. */ /* */ /* <Input> */ /* interface :: A string designing the interface. Examples are */ /* `sfnt', `post_names', `charmaps', etc. */ /* */ /* <Return> */ /* A typeless pointer to the extension's interface (normally a table */ /* of function pointers). Returns NULL if the requested extension */ /* isn't available (i.e., wasn't compiled in the driver at build */ /* time). */ /* */ static FTDriver_Interface Get_Interface( FT_Driver driver, const FT_String* interface ) { if ( strcmp( (const char*)interface, "attach_file" ) == 0 ) return (FTDriver_Interface)T1_Read_AFM; return 0; } /*************************************************************************/ /* */ /* <Function> */ /* Get_Kerning */ /* */ /* <Description> */ /* A driver method used to return the kerning vector between two */ /* glyphs of the same face. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* */ /* left_glyph :: The index of the left glyph in the kern pair. */ /* */ /* right_glyph :: The index of the right glyph in the kern pair. */ /* */ /* <Output> */ /* kerning :: The kerning vector. This is in font units for */ /* scalable formats, and in pixels for fixed-sizes */ /* formats. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ /* <Note> */ /* Only horizontal layouts (left-to-right & right-to-left) are */ /* supported by this function. Other layouts, or more sophisticated */ /* kernings are out of scope of this method (the basic driver */ /* interface is meant to be simple). */ /* */ /* They can be implemented by format-specific interfaces. */ /* */ static T1_Error Get_Kerning( T1_Face face, T1_UInt left_glyph, T1_UInt right_glyph, T1_Vector* kerning ) { T1_AFM* afm; kerning->x = 0; kerning->y = 0; afm = (T1_AFM*)face->afm_data; if (afm) T1_Get_Kerning( afm, left_glyph, right_glyph, kerning ); return T1_Err_Ok; }#endif /******************************************************************/ /* */ /* <Function> Set_Char_Sizes */ /* */ /* <Description> */ /* A driver method used to reset a size's character sizes */ /* (horizontal and vertical) expressed in fractional points. */ /* */ /* <Input> */ /* size :: handle to target size object */ /* char_width :: character width expressed in 26.6 points */ /* char_height :: character height expressed in 26.6 points */ /* */ /* <Return> */ /* FreeType error code. 0 means success */ /* */ static T1_Error Set_Char_Sizes( T1_Size size, T1_F26Dot6 char_width, T1_F26Dot6 char_height, T1_UInt horz_resolution, T1_UInt vert_resolution ) { UNUSED(char_width); UNUSED(horz_resolution); UNUSED(vert_resolution); size->valid = FALSE; return T1_Reset_Size( size ); } /******************************************************************/ /* */ /* <Function> Set_Pixel_Sizes */ /* */ /* <Description> */ /* A driver method used to reset a size's character sizes */ /* (horizontal and vertical) expressed in integer pixels. */ /* */ /* <Input> */ /* size :: handle to target size object */ /* */ /* pixel_width :: character width expressed in 26.6 points */ /* */ /* pixel_height :: character height expressed in 26.6 points */ /* */ /* char_size :: the corresponding character size in points */ /* This value is only sent to the TrueType */ /* bytecode interpreter, even though 99% of */ /* glyph programs will simply ignore it. A */ /* safe value there is the maximum of the */ /* pixel width and height (multiplied by */ /* 64 to make it a 26.6 fixed float !) */ /* <Return> */ /* FreeType error code. 0 means success */ /* */ static T1_Error Set_Pixel_Sizes( T1_Size size, T1_Int pixel_width, T1_Int pixel_height ) { UNUSED(pixel_width); UNUSED(pixel_height); size->valid = FALSE; return T1_Reset_Size(size); } /*************************************************************************/ /* */ /* <Function> */ /* Get_Char_Index */ /* */ /* <Description> */ /* Uses a charmap to return a given character code's glyph index. */ /* */ /* <Input> */ /* charmap :: A handle to the source charmap object. */ /* charcode :: The character code. */ /* */ /* <Return> */ /* Glyph index. 0 means `undefined character code'. */ /* */ static T1_UInt Get_Char_Index( FT_CharMap charmap, T1_Long charcode ) { T1_Face face; T1_UInt result = 0; PSNames_Interface* psnames; face = (T1_Face)charmap->face; psnames = (PSNames_Interface*)face->psnames; if (psnames) switch (charmap->encoding) { /********************************************************************/ /* */ /* Unicode encoding support */ /* */ case ft_encoding_unicode: { /* use the "psnames" module to synthetize the Unicode charmap */ result = psnames->lookup_unicode( &face->unicode_map, (T1_ULong)charcode ); /* the function returns 0xFFFF when the Unicode charcode has */ /* no corresponding glyph.. */ if (result == 0xFFFF) result = 0; goto Exit; } /********************************************************************/ /* */ /* Custom Type 1 encoding */ /* */ case ft_encoding_adobe_custom: { T1_Encoding* encoding = &face->type1.encoding; if (charcode >= encoding->code_first && charcode <= encoding->code_last) { result = encoding->char_index[charcode]; } goto Exit; } /********************************************************************/ /* */ /* Adobe Standard & Expert encoding support */ /* */ default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -