summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype2/freetype-src/src/truetype/ttgload.c
diff options
context:
space:
mode:
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.c219
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: