📄 ttdriver.c
字号:
/***************************************************************************//* *//* ttdriver.c *//* *//* TrueType font driver implementation (body). *//* *//* Copyright 1996-2001, 2002, 2003, 2004, 2005 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_INTERNAL_SFNT_H#include FT_TRUETYPE_IDS_H#include FT_SERVICE_XFREE86_NAME_H#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT#include FT_MULTIPLE_MASTERS_H#include FT_SERVICE_MULTIPLE_MASTERS_H#endif#include "ttdriver.h"#include "ttgload.h"#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT#include "ttgxvar.h"#endif#include "tterrors.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_ttdriver /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** F A C E S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/#undef PAIR_TAG#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ (FT_ULong)right ) /*************************************************************************/ /* */ /* <Function> */ /* tt_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 FT_Error tt_get_kerning( FT_Face ttface, /* TT_Face */ FT_UInt left_glyph, FT_UInt right_glyph, FT_Vector* kerning ) { TT_Face face = (TT_Face)ttface; SFNT_Service sfnt = (SFNT_Service)face->sfnt; kerning->x = 0; kerning->y = 0; if ( sfnt ) kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); return 0; }#undef PAIR_TAG /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /**** ****/ /**** ****/ /**** S I Z E S ****/ /**** ****/ /**** ****/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* */ /* <Function> */ /* Set_Char_Sizes */ /* */ /* <Description> */ /* A driver method used to reset a size's character sizes (horizontal */ /* and vertical) expressed in fractional points. */ /* */ /* <Input> */ /* char_width :: The character width expressed in 26.6 */ /* fractional points. */ /* */ /* char_height :: The character height expressed in 26.6 */ /* fractional points. */ /* */ /* horz_resolution :: The horizontal resolution of the output device. */ /* */ /* vert_resolution :: The vertical resolution of the output device. */ /* */ /* <InOut> */ /* size :: A handle to the target size object. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ static FT_Error Set_Char_Sizes( FT_Size ttsize, /* TT_Size */ FT_F26Dot6 char_width, FT_F26Dot6 char_height, FT_UInt horz_resolution, FT_UInt vert_resolution ) { TT_Size size = (TT_Size)ttsize; FT_Size_Metrics* metrics = &size->root.metrics; FT_Size_Metrics* metrics2 = &size->metrics; TT_Face face = (TT_Face)size->root.face; FT_Long dim_x, dim_y; *metrics2 = *metrics; /* This bit flag, when set, indicates that the pixel size must be */ /* truncated to an integer. Nearly all TrueType fonts have this */ /* bit set, as hinting won't work really well otherwise. */ /* */ if ( ( face->header.Flags & 8 ) != 0 ) { /* we need to use rounding in the following computations. Otherwise, * the resulting hinted outlines will be very slightly distorted */ dim_x = ( ( char_width * horz_resolution + (36+32*72) ) / 72 ) & ~63; dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63; } else { dim_x = ( ( char_width * horz_resolution + 36 ) / 72 ); dim_y = ( ( char_height * vert_resolution + 36 ) / 72 ); } /* we only modify "metrics2", not "metrics", so these changes have */ /* no effect on the result of the auto-hinter when it is used */ /* */ metrics2->x_ppem = (FT_UShort)( dim_x >> 6 ); metrics2->y_ppem = (FT_UShort)( dim_y >> 6 ); metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM ); metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM ); size->ttmetrics.valid = FALSE;#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS size->strike_index = 0xFFFFU;#endif return tt_size_reset( size ); } /*************************************************************************/ /* */ /* <Function> */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -