📄 t2objs.c
字号:
/***************************************************************************//* *//* t2objs.c *//* *//* OpenType objects manager (body). *//* *//* Copyright 1996-2000 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 <freetype/internal/ftdebug.h>#include <freetype/internal/ftcalc.h>#include <freetype/internal/ftstream.h>#include <freetype/fterrors.h>#include <freetype/ttnameid.h>#include <freetype/tttags.h>#include <freetype/internal/sfnt.h>#include <freetype/internal/psnames.h>#ifdef FT_FLAT_COMPILE#include "t2objs.h"#include "t2load.h"#else#include <cff/t2objs.h>#include <cff/t2load.h>#endif#include <freetype/internal/t2errors.h>#include <string.h> /* for strlen() */ /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ /* messages during execution. */ /* */#undef FT_COMPONENT#define FT_COMPONENT trace_t2objs /*************************************************************************/ /* */ /* FACE FUNCTIONS */ /* */ /*************************************************************************/ static FT_String* T2_StrCopy( FT_Memory memory, const FT_String* source ) { FT_Error error; FT_String* result = 0; FT_Int len = (FT_Int)strlen( source ); if ( !ALLOC( result, len + 1 ) ) { MEM_Copy( result, source, len ); result[len] = 0; } return result; }#if 0 /* this function is used to build a Unicode charmap from the glyph names */ /* in a file */ static FT_Error CFF_Build_Unicode_Charmap( T2_Face face, FT_ULong base_offset, PSNames_Interface* psnames ) { CFF_Font* font = (CFF_Font*)face->extra.data; FT_Memory memory = FT_FACE_MEMORY(face); FT_UInt n, num_glyphs = face->root.num_glyphs; const char** glyph_names; FT_Error error; CFF_Font_Dict* dict = &font->top_font.font_dict; FT_ULong charset_offset; FT_Byte format; FT_Stream stream = face->root.stream; charset_offset = dict->charset_offset; if ( !charset_offset ) { FT_ERROR(( "CFF.Build_Unicode_Charmap: charset table is missing\n" )); error = T2_Err_Invalid_File_Format; goto Exit; } /* allocate the charmap */ if ( ALLOC( face->charmap, ... /* seek to charset table and allocate glyph names table */ if ( FILE_Seek( base_offset + charset_offset ) || ALLOC_ARRAY( glyph_names, num_glyphs, const char* ) ) goto Exit; /* now, read each glyph name and store it in the glyph name table */ if ( READ_Byte( format ) ) goto Fail; switch ( format ) { case 0: /* format 0 - one SID per glyph */ { const char** gname = glyph_names; const char** limit = gname + num_glyphs; if ( ACCESS_Frame( num_glyphs*2 ) ) goto Fail; for ( ; gname < limit; gname++ ) gname[0] = T2_Get_String( &font->string_index, GET_UShort(), psnames ); FORGET_Frame(); break; } case 1: /* format 1 - sequential ranges */ case 2: /* format 2 - sequential ranges with 16-bit counts */ { const char** gname = glyph_names; const char** limit = gname + num_glyphs; FT_UInt len = 3; if (format == 2) len++; while (gname < limit) { FT_UInt first; FT_UInt count; if ( ACCESS_Frame( len ) ) goto Fail; first = GET_UShort(); if (format == 3) count = GET_UShort(); else count = GET_Byte(); FORGET_Frame(); for ( ; count > 0; count-- ) { gname[0] = T2_Get_String( &font->string_index, first, psnames ); gname++; first++; } } break; } default: /* unknown charset format! */ FT_ERROR(( "CFF: unknown charset format!\n" )); error = T2_Err_Invalid_File_Format; goto Fail; } /* all right, the glyph names were loaded, we now need to create */ /* the corresponding unicode charmap.. */ Fail: for ( n = 0; n < num_glyphs; n++ ) FREE( glyph_names[n] ); FREE( glyph_names ); Exit: return error; }#endif /* 0 */ static FT_Encoding find_encoding( int platform_id, int encoding_id ) { typedef struct TEncoding { int platform_id; int encoding_id; FT_Encoding encoding; } TEncoding; static const TEncoding tt_encodings[] = { { TT_PLATFORM_ISO, -1, ft_encoding_unicode }, { TT_PLATFORM_APPLE_UNICODE, -1, ft_encoding_unicode }, { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, ft_encoding_apple_roman }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, ft_encoding_unicode }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, ft_encoding_sjis }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, ft_encoding_gb2312 }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, ft_encoding_big5 }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, ft_encoding_wansung }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, ft_encoding_johab } }; const TEncoding *cur, *limit; cur = tt_encodings; limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); for ( ; cur < limit; cur++ ) { if ( cur->platform_id == platform_id ) { if ( cur->encoding_id == encoding_id || cur->encoding_id == -1 ) return cur->encoding; } } return ft_encoding_none; } /*************************************************************************/ /* */ /* <Function> */ /* T2_Init_Face */ /* */ /* <Description> */ /* Initializes a given OpenType face object. */ /* */ /* <Input> */ /* stream :: The source font stream. */ /* */ /* face_index :: The index of the font face in the resource. */ /* */ /* num_params :: Number of additional generic parameters. Ignored. */ /* */ /* params :: Additional generic parameters. Ignored. */ /* */ /* <InOut> */ /* face :: The newly built face object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL FT_Error T2_Init_Face( FT_Stream stream, T2_Face face, FT_Int face_index, FT_Int num_params, FT_Parameter* params ) { FT_Error error; SFNT_Interface* sfnt; PSNames_Interface* psnames; FT_Bool pure_cff = 1; FT_Bool sfnt_format = 0; sfnt = (SFNT_Interface*)FT_Get_Module_Interface( face->root.driver->root.library, "sfnt" ); if ( !sfnt ) goto Bad_Format; psnames = (PSNames_Interface*)FT_Get_Module_Interface( face->root.driver->root.library, "psnames" ); /* create input stream from resource */ if ( FILE_Seek( 0 ) ) goto Exit; /* check that we have a valid OpenType file */ error = sfnt->init_face( stream, face, face_index, num_params, params ); if ( !error ) { if ( face->format_tag != 0x4F54544FL ) /* `OTTO'; OpenType/CFF font */ {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -