/**************************************************************************** * * ttgload.c * * TrueType Glyph Loader (body). * * Copyright (C) 1996-2023 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 <freetype/internal/ftdebug.h> #include FT_CONFIG_CONFIG_H #include <freetype/internal/ftcalc.h> #include <freetype/internal/ftstream.h> #include <freetype/internal/sfnt.h> #include <freetype/tttags.h> #include <freetype/ftoutln.h> #include <freetype/ftdriver.h> #include <freetype/ftlist.h> #include "ttgload.h" #include "ttpload.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 … /************************************************************************** * * Simple glyph flags. */ #define ON_CURVE_POINT … #define X_SHORT_VECTOR … #define Y_SHORT_VECTOR … #define REPEAT_FLAG … #define X_POSITIVE … #define SAME_X … #define Y_POSITIVE … #define SAME_Y … #define OVERLAP_SIMPLE … /************************************************************************** * * Composite glyph flags. */ #define ARGS_ARE_WORDS … #define ARGS_ARE_XY_VALUES … #define ROUND_XY_TO_GRID … #define WE_HAVE_A_SCALE … /* reserved 0x0010 */ #define MORE_COMPONENTS … #define WE_HAVE_AN_XY_SCALE … #define WE_HAVE_A_2X2 … #define WE_HAVE_INSTR … #define USE_MY_METRICS … #define OVERLAP_COMPOUND … #define SCALED_COMPONENT_OFFSET … #define UNSCALED_COMPONENT_OFFSET … #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #define IS_DEFAULT_INSTANCE( _face ) … #else #define IS_DEFAULT_INSTANCE … #endif /************************************************************************** * * Return the horizontal metrics in font units for a given glyph. */ FT_LOCAL_DEF( void ) TT_Get_HMetrics( TT_Face face, FT_UInt idx, FT_Short* lsb, FT_UShort* aw ) { … } /************************************************************************** * * Return the vertical metrics in font units for a given glyph. * See function `tt_loader_set_pp' below for explanations. */ FT_LOCAL_DEF( void ) TT_Get_VMetrics( TT_Face face, FT_UInt idx, FT_Pos yMax, FT_Short* tsb, FT_UShort* ah ) { … } static FT_Error tt_get_metrics( TT_Loader loader, FT_UInt glyph_index ) { … } #ifdef FT_CONFIG_OPTION_INCREMENTAL static void tt_get_metrics_incremental( TT_Loader loader, FT_UInt glyph_index ) { … } #endif /* FT_CONFIG_OPTION_INCREMENTAL */ /************************************************************************** * * The following functions are used by default with TrueType fonts. * However, they can be replaced by alternatives if we need to support * TrueType-compressed formats (like MicroType) in the future. * */ FT_CALLBACK_DEF( FT_Error ) TT_Access_Glyph_Frame( TT_Loader loader, FT_UInt glyph_index, FT_ULong offset, FT_UInt byte_count ) { … } FT_CALLBACK_DEF( void ) TT_Forget_Glyph_Frame( TT_Loader loader ) { … } FT_CALLBACK_DEF( FT_Error ) TT_Load_Glyph_Header( TT_Loader loader ) { … } FT_CALLBACK_DEF( FT_Error ) TT_Load_Simple_Glyph( TT_Loader load ) { … } FT_CALLBACK_DEF( FT_Error ) TT_Load_Composite_Glyph( TT_Loader loader ) { … } FT_LOCAL_DEF( void ) TT_Init_Glyph_Loading( TT_Face face ) { … } static void tt_prepare_zone( TT_GlyphZone zone, FT_GlyphLoad load, FT_UInt start_point, FT_UInt start_contour ) { … } /************************************************************************** * * @Function: * TT_Hint_Glyph * * @Description: * Hint the glyph using the zone prepared by the caller. Note that * the zone is supposed to include four phantom points. */ static FT_Error TT_Hint_Glyph( TT_Loader loader, FT_Bool is_composite ) { … } /************************************************************************** * * @Function: * TT_Process_Simple_Glyph * * @Description: * Once a simple glyph has been loaded, it needs to be processed. * Usually, this means scaling and hinting through bytecode * interpretation. */ static FT_Error TT_Process_Simple_Glyph( TT_Loader loader ) { … } /************************************************************************** * * @Function: * TT_Process_Composite_Component * * @Description: * Once a composite component has been loaded, it needs to be * processed. Usually, this means transforming and translating. */ static FT_Error TT_Process_Composite_Component( TT_Loader loader, FT_SubGlyph subglyph, FT_UInt start_point, FT_UInt num_base_points ) { … } /************************************************************************** * * @Function: * TT_Process_Composite_Glyph * * @Description: * This is slightly different from TT_Process_Simple_Glyph, in that * its sole purpose is to hint the glyph. Thus this function is * only available when bytecode interpreter is enabled. */ static FT_Error TT_Process_Composite_Glyph( TT_Loader loader, FT_UInt start_point, FT_UInt start_contour ) { … } /* * Calculate the phantom points * * Defining the right side bearing (rsb) as * * rsb = aw - (lsb + xmax - xmin) * * (with `aw' the advance width, `lsb' the left side bearing, and `xmin' * and `xmax' the glyph's minimum and maximum x value), the OpenType * specification defines the initial position of horizontal phantom points * as * * pp1 = (round(xmin - lsb), 0) , * pp2 = (round(pp1 + aw), 0) . * * Note that the rounding to the grid (in the device space) is not * documented currently in the specification. * * However, the specification lacks the precise definition of vertical * phantom points. Greg Hitchcock provided the following explanation. * * - a `vmtx' table is present * * For any glyph, the minimum and maximum y values (`ymin' and `ymax') * are given in the `glyf' table, the top side bearing (tsb) and advance * height (ah) are given in the `vmtx' table. The bottom side bearing * (bsb) is then calculated as * * bsb = ah - (tsb + ymax - ymin) , * * and the initial position of vertical phantom points is * * pp3 = (x, round(ymax + tsb)) , * pp4 = (x, round(pp3 - ah)) . * * See below for value `x'. * * - no `vmtx' table in the font * * If there is an `OS/2' table, we set * * DefaultAscender = sTypoAscender , * DefaultDescender = sTypoDescender , * * otherwise we use data from the `hhea' table: * * DefaultAscender = Ascender , * DefaultDescender = Descender . * * With these two variables we can now set * * ah = DefaultAscender - sDefaultDescender , * tsb = DefaultAscender - yMax , * * and proceed as if a `vmtx' table was present. * * Usually we have * * x = aw / 2 , (1) * * but there is one compatibility case where it can be set to * * x = -DefaultDescender - * ((DefaultAscender - DefaultDescender - aw) / 2) . (2) * * and another one with * * x = 0 . (3) * * In Windows, the history of those values is quite complicated, * depending on the hinting engine (that is, the graphics framework). * * framework from to formula * ---------------------------------------------------------- * GDI Windows 98 current (1) * (Windows 2000 for NT) * GDI+ Windows XP Windows 7 (2) * GDI+ Windows 8 current (3) * DWrite Windows 7 current (3) * * For simplicity, FreeType uses (1) for grayscale subpixel hinting and * (3) for everything else. * */ static void tt_loader_set_pp( TT_Loader loader ) { … } /* a utility function to retrieve i-th node from given FT_List */ static FT_ListNode ft_list_get_node_at( FT_List list, FT_UInt idx ) { … } /************************************************************************** * * @Function: * load_truetype_glyph * * @Description: * Loads a given truetype glyph. Handles composites and uses a * TT_Loader object. */ static FT_Error load_truetype_glyph( TT_Loader loader, FT_UInt glyph_index, FT_UInt recurse_count, FT_Bool header_only ) { … } static FT_Error compute_glyph_metrics( TT_Loader loader, FT_UInt glyph_index ) { … } #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS static FT_Error load_sbit_image( TT_Size size, TT_GlyphSlot glyph, FT_UInt glyph_index, FT_Int32 load_flags ) { … } #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ static FT_Error tt_loader_init( TT_Loader loader, TT_Size size, TT_GlyphSlot glyph, FT_Int32 load_flags, FT_Bool glyf_table_only ) { … } static void tt_loader_done( TT_Loader loader ) { … } /************************************************************************** * * @Function: * TT_Load_Glyph * * @Description: * A function used to load a single glyph within a given glyph slot, * for a given size. * * @InOut: * glyph :: * A handle to a target slot object where the glyph * will be loaded. * * @Input: * size :: * A handle to the source face size at which the glyph * must be scaled/loaded. * * glyph_index :: * The index of the glyph in the font file. * * load_flags :: * A flag indicating what to load for this glyph. The * FT_LOAD_XXX constants can be used to control the * glyph loading process (e.g., whether the outline * should be scaled, whether to load bitmaps or not, * whether to hint the outline, etc). * * @Return: * FreeType error code. 0 means success. */ FT_LOCAL_DEF( FT_Error ) TT_Load_Glyph( TT_Size size, TT_GlyphSlot glyph, FT_UInt glyph_index, FT_Int32 load_flags ) { … } /* END */