diff options
Diffstat (limited to 'Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c')
-rw-r--r-- | Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c | 219 |
1 files changed, 57 insertions, 162 deletions
diff --git a/Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c b/Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c index b189f982ff0..11968f6fdcf 100644 --- a/Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c +++ b/Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c @@ -4,7 +4,7 @@ * * TrueType Glyph Loader (body). * - * Copyright (C) 1996-2022 by + * Copyright (C) 1996-2021 by * David Turner, Robert Wilhelm, and Werner Lemberg. * * This file is part of the FreeType project, and may only be used, @@ -2230,6 +2230,10 @@ FT_UInt glyph_index ) { TT_Face face = loader->face; +#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ + defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); +#endif FT_BBox bbox; FT_Fixed y_scale; @@ -2252,10 +2256,53 @@ glyph->metrics.horiBearingX = bbox.xMin; glyph->metrics.horiBearingY = bbox.yMax; - if ( loader->widthp ) - glyph->metrics.horiAdvance = loader->widthp[glyph_index] * 64; - else - glyph->metrics.horiAdvance = SUB_LONG(loader->pp2.x, loader->pp1.x); + glyph->metrics.horiAdvance = SUB_LONG(loader->pp2.x, loader->pp1.x); + + /* Adjust advance width to the value contained in the hdmx table */ + /* unless FT_LOAD_COMPUTE_METRICS is set or backward compatibility */ + /* mode of the v40 interpreter is active. See `ttinterp.h' for */ + /* details on backward compatibility mode. */ + if ( +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + ( loader->exec && loader->exec->backward_compatibility ) ) && +#endif + !face->postscript.isFixedPitch && + IS_HINTED( loader->load_flags ) && + !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) ) + { + FT_Byte* widthp; + + + widthp = tt_face_get_device_metrics( face, + size->metrics->x_ppem, + glyph_index ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + FT_Bool ignore_x_mode; + + + ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) != + FT_RENDER_MODE_MONO ); + + if ( widthp && + ( ( ignore_x_mode && loader->exec->compatible_widths ) || + !ignore_x_mode || + SPH_OPTION_BITMAP_WIDTHS ) ) + glyph->metrics.horiAdvance = *widthp * 64; + } + else + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + { + if ( widthp ) + glyph->metrics.horiAdvance = *widthp * 64; + } + } /* set glyph dimensions */ glyph->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin ); @@ -2688,58 +2735,12 @@ /* note that this flag can also be modified in a glyph's bytecode */ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && exec->GS.instruct_control & 4 ) - exec->ignore_x_mode = FALSE; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ - -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* - * Toggle backward compatibility according to what font wants, except - * when - * - * 1) we have a `tricky' font that heavily relies on the interpreter to - * render glyphs correctly, for example DFKai-SB, or - * 2) FT_RENDER_MODE_MONO (i.e, monochome rendering) is requested. - * - * In those cases, backward compatibility needs to be turned off to get - * correct rendering. The rendering is then completely up to the - * font's programming. - * - */ - if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && - subpixel_hinting_lean && - !FT_IS_TRICKY( glyph->face ) ) - exec->backward_compatibility = !( exec->GS.instruct_control & 4 ); - else - exec->backward_compatibility = FALSE; -#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ + exec->ignore_x_mode = 0; +#endif exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); loader->exec = exec; loader->instructions = exec->glyphIns; - - /* Use the hdmx table if any unless FT_LOAD_COMPUTE_METRICS */ - /* is set or backward compatibility mode of the v38 or v40 */ - /* interpreters is active. See `ttinterp.h' for details on */ - /* backward compatibility mode. */ - if ( IS_HINTED( loader->load_flags ) && - !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) && -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && - exec->backward_compatibility ) && -#endif -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - !( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && - !SPH_OPTION_BITMAP_WIDTHS && - FT_LOAD_TARGET_MODE( loader->load_flags ) != - FT_RENDER_MODE_MONO && - exec->compatible_widths ) && -#endif - !face->postscript.isFixedPitch ) - { - loader->widthp = size->widthp; - } - else - loader->widthp = NULL; } #endif /* TT_USE_BYTECODE_INTERPRETER */ @@ -2787,12 +2788,11 @@ * A function used to load a single glyph within a given glyph slot, * for a given size. * - * @InOut: + * @Input: * 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. @@ -2897,12 +2897,8 @@ } else { - if ( FT_IS_SCALABLE( glyph->face ) || - FT_HAS_SBIX( glyph->face ) ) + if ( FT_IS_SCALABLE( glyph->face ) ) { - TT_Face face = (TT_Face)glyph->face; - - /* for the bbox we need the header only */ (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); @@ -2910,35 +2906,6 @@ glyph->linearHoriAdvance = loader.linear; glyph->linearVertAdvance = loader.vadvance; - /* Bitmaps from the 'sbix' table need special treatment: */ - /* if there is a glyph contour, the bitmap origin must be */ - /* shifted to be relative to the lower left corner of the */ - /* glyph bounding box, also taking the left-side bearing */ - /* (or top bearing) into account. */ - if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX && - loader.n_contours > 0 ) - { - FT_Int bitmap_left; - FT_Int bitmap_top; - - - if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) - { - /* This is a guess, since Apple's CoreText engine doesn't */ - /* really do vertical typesetting. */ - bitmap_left = loader.bbox.xMin; - bitmap_top = loader.top_bearing; - } - else - { - bitmap_left = loader.left_bearing; - bitmap_top = loader.bbox.yMin; - } - - glyph->bitmap_left += FT_MulFix( bitmap_left, x_scale ) >> 6; - glyph->bitmap_top += FT_MulFix( bitmap_top, y_scale ) >> 6; - } - /* sanity checks: if `xxxAdvance' in the sbit metric */ /* structure isn't set, use `linearXXXAdvance' */ if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) @@ -2953,12 +2920,6 @@ } } - if ( load_flags & FT_LOAD_SBITS_ONLY ) - { - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ @@ -2968,81 +2929,16 @@ goto Exit; } -#ifdef FT_CONFIG_OPTION_SVG - - /* check for OT-SVG */ - if ( ( load_flags & FT_LOAD_COLOR ) && ( (TT_Face)glyph->face )->svg ) - { - SFNT_Service sfnt; - - FT_Short leftBearing; - FT_Short topBearing; - FT_UShort advanceX; - FT_UShort advanceY; - - - FT_TRACE3(( "Trying to load SVG glyph\n" )); - sfnt = (SFNT_Service)( (TT_Face)glyph->face )->sfnt; - - error = sfnt->load_svg_doc( glyph, glyph_index ); - if ( !error ) - { - TT_Face face = (TT_Face)glyph->face; - - - FT_TRACE3(( "Successfully loaded SVG glyph\n" )); - - glyph->format = FT_GLYPH_FORMAT_SVG; - - sfnt->get_metrics( face, - FALSE, - glyph_index, - &leftBearing, - &advanceX ); - sfnt->get_metrics( face, - TRUE, - glyph_index, - &topBearing, - &advanceY ); - - advanceX = (FT_UShort)FT_MulDiv( advanceX, - glyph->face->size->metrics.x_ppem, - glyph->face->units_per_EM ); - advanceY = (FT_UShort)FT_MulDiv( advanceY, - glyph->face->size->metrics.y_ppem, - glyph->face->units_per_EM ); - - glyph->metrics.horiAdvance = advanceX << 6; - glyph->metrics.vertAdvance = advanceY << 6; - - return error; - } - - FT_TRACE3(( "Failed to load SVG glyph\n" )); - } - - /* return immediately if we only want SVG glyphs */ - if ( load_flags & FT_LOAD_SVG_ONLY ) + if ( load_flags & FT_LOAD_SBITS_ONLY ) { error = FT_THROW( Invalid_Argument ); goto Exit; } -#endif /* FT_CONFIG_OPTION_SVG */ - error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); if ( error ) goto Exit; - /* done if we are only interested in the `hdmx` advance */ - if ( load_flags & FT_LOAD_ADVANCE_ONLY && - !( load_flags & FT_LOAD_VERTICAL_LAYOUT ) && - loader.widthp ) - { - glyph->metrics.horiAdvance = loader.widthp[glyph_index] * 64; - goto Done; - } - glyph->format = FT_GLYPH_FORMAT_OUTLINE; glyph->num_subglyphs = 0; glyph->outline.flags = 0; @@ -3121,7 +3017,6 @@ glyph->outline.n_points, glyph->outline.flags )); - Done: tt_loader_done( &loader ); Exit: |