📄 t1objs.c
字号:
/***************************************************************************//* *//* t1objs.c *//* *//* Type 1 objects manager (body). *//* *//* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 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 <ft2build.h>#include FT_INTERNAL_DEBUG_H#include FT_INTERNAL_STREAM_H#include FT_TRUETYPE_IDS_H#include "t1gload.h"#include "t1load.h"#include "t1errors.h"#ifndef T1_CONFIG_OPTION_NO_AFM#include "t1afm.h"#endif#include FT_SERVICE_POSTSCRIPT_CMAPS_H#include FT_INTERNAL_POSTSCRIPT_AUX_H /*************************************************************************/ /* */ /* 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_t1objs /*************************************************************************/ /* */ /* SIZE FUNCTIONS */ /* */ /* note that we store the global hints in the size's "internal" root */ /* field */ /* */ /*************************************************************************/ static PSH_Globals_Funcs T1_Size_Get_Globals_Funcs( T1_Size size ) { T1_Face face = (T1_Face)size->root.face; PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; FT_Module module; module = FT_Get_Module( size->root.face->driver->root.library, "pshinter" ); return ( module && pshinter && pshinter->get_globals_funcs ) ? pshinter->get_globals_funcs( module ) : 0 ; } FT_LOCAL_DEF( void ) T1_Size_Done( T1_Size size ) { if ( size->root.internal ) { PSH_Globals_Funcs funcs; funcs = T1_Size_Get_Globals_Funcs( size ); if ( funcs ) funcs->destroy( (PSH_Globals)size->root.internal ); size->root.internal = 0; } } FT_LOCAL_DEF( FT_Error ) T1_Size_Init( T1_Size size ) { FT_Error error = 0; PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); if ( funcs ) { PSH_Globals globals; T1_Face face = (T1_Face)size->root.face; error = funcs->create( size->root.face->memory, &face->type1.private_dict, &globals ); if ( !error ) size->root.internal = (FT_Size_Internal)(void*)globals; } return error; } FT_LOCAL_DEF( FT_Error ) T1_Size_Request( T1_Size size, FT_Size_Request req ) { PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); FT_Request_Metrics( size->root.face, req ); if ( funcs ) funcs->set_scale( (PSH_Globals)size->root.internal, size->root.metrics.x_scale, size->root.metrics.y_scale, 0, 0 ); return T1_Err_Ok; } /*************************************************************************/ /* */ /* SLOT FUNCTIONS */ /* */ /*************************************************************************/ FT_LOCAL_DEF( void ) T1_GlyphSlot_Done( T1_GlyphSlot slot ) { slot->root.internal->glyph_hints = 0; } FT_LOCAL_DEF( FT_Error ) T1_GlyphSlot_Init( T1_GlyphSlot slot ) { T1_Face face; PSHinter_Service pshinter; face = (T1_Face)slot->root.face; pshinter = (PSHinter_Service)face->pshinter; if ( pshinter ) { FT_Module module; module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" ); if (module) { T1_Hints_Funcs funcs; funcs = pshinter->get_t1_funcs( module ); slot->root.internal->glyph_hints = (void*)funcs; } } return 0; } /*************************************************************************/ /* */ /* FACE FUNCTIONS */ /* */ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* T1_Face_Done */ /* */ /* <Description> */ /* The face object destructor. */ /* */ /* <Input> */ /* face :: A typeless pointer to the face object to destroy. */ /* */ FT_LOCAL_DEF( void ) T1_Face_Done( T1_Face face ) { FT_Memory memory; T1_Font type1 = &face->type1; if ( face ) { memory = face->root.memory;#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT /* release multiple masters information */ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); if ( face->buildchar ) { FT_FREE( face->buildchar ); face->buildchar = NULL; face->len_buildchar = 0; } T1_Done_Blend( face ); face->blend = 0;#endif /* release font info strings */ { PS_FontInfo info = &type1->font_info; FT_FREE( info->version ); FT_FREE( info->notice ); FT_FREE( info->full_name ); FT_FREE( info->family_name ); FT_FREE( info->weight ); } /* release top dictionary */ FT_FREE( type1->charstrings_len ); FT_FREE( type1->charstrings ); FT_FREE( type1->glyph_names ); FT_FREE( type1->subrs ); FT_FREE( type1->subrs_len ); FT_FREE( type1->subrs_block ); FT_FREE( type1->charstrings_block ); FT_FREE( type1->glyph_names_block ); FT_FREE( type1->encoding.char_index ); FT_FREE( type1->encoding.char_name ); FT_FREE( type1->font_name );#ifndef T1_CONFIG_OPTION_NO_AFM /* release afm data if present */ if ( face->afm_data ) T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );#endif /* release unicode map, if any */#if 0 FT_FREE( face->unicode_map_rec.maps ); face->unicode_map_rec.num_maps = 0; face->unicode_map = NULL;#endif face->root.family_name = 0; face->root.style_name = 0; } } /*************************************************************************/ /* */ /* <Function> */ /* T1_Face_Init */ /* */ /* <Description> */ /* The face object constructor. */ /* */ /* <Input> */ /* stream :: input stream where to load font data. */ /* */ /* 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 face record to build. */ /* */ /* <Return> */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -