| Index: src/truetype/ttgload.c
|
| diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
|
| index ce8c8887b9f53f2bb4e73ed439ba7669027d43a0..f640a6c78ed3ea96012164cf7eaff08b09227665 100644
|
| --- a/src/truetype/ttgload.c
|
| +++ b/src/truetype/ttgload.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* TrueType Glyph Loader (body). */
|
| /* */
|
| -/* Copyright 1996-2012 */
|
| +/* Copyright 1996-2013 */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used, */
|
| @@ -23,6 +23,7 @@
|
| #include FT_INTERNAL_SFNT_H
|
| #include FT_TRUETYPE_TAGS_H
|
| #include FT_OUTLINE_H
|
| +#include FT_TRUETYPE_DRIVER_H
|
|
|
| #include "ttgload.h"
|
| #include "ttpload.h"
|
| @@ -32,6 +33,7 @@
|
| #endif
|
|
|
| #include "tterrors.h"
|
| +#include "ttsubpix.h"
|
|
|
|
|
| /*************************************************************************/
|
| @@ -131,7 +133,10 @@
|
| tt_get_metrics( TT_Loader loader,
|
| FT_UInt glyph_index )
|
| {
|
| - TT_Face face = (TT_Face)loader->face;
|
| + TT_Face face = (TT_Face)loader->face;
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
|
| +#endif
|
|
|
| FT_Short left_bearing = 0, top_bearing = 0;
|
| FT_UShort advance_width = 0, advance_height = 0;
|
| @@ -149,6 +154,18 @@
|
| loader->top_bearing = top_bearing;
|
| loader->vadvance = advance_height;
|
|
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
|
| + {
|
| + if ( loader->exec )
|
| + loader->exec->sph_tweak_flags = 0;
|
| +
|
| + /* this may not be the right place for this, but it works */
|
| + if ( loader->exec && loader->exec->ignore_x_mode )
|
| + sph_set_tweaks( loader, glyph_index );
|
| + }
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
| +
|
| if ( !loader->linear_def )
|
| {
|
| loader->linear_def = 1;
|
| @@ -252,10 +269,6 @@
|
| }
|
|
|
|
|
| -#undef IS_HINTED
|
| -#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
|
| -
|
| -
|
| /*************************************************************************/
|
| /* */
|
| /* The following functions are used by default with TrueType fonts. */
|
| @@ -286,7 +299,7 @@
|
| loader->cursor = stream->cursor;
|
| loader->limit = stream->limit;
|
|
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
|
|
|
|
| @@ -308,7 +321,7 @@
|
|
|
|
|
| if ( p + 10 > limit )
|
| - return TT_Err_Invalid_Outline;
|
| + return FT_THROW( Invalid_Outline );
|
|
|
| loader->n_contours = FT_NEXT_SHORT( p );
|
|
|
| @@ -324,7 +337,7 @@
|
| loader->bbox.yMax ));
|
| loader->cursor = p;
|
|
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
|
|
|
|
| @@ -409,14 +422,14 @@
|
| {
|
| FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n",
|
| n_ins ));
|
| - error = TT_Err_Too_Many_Hints;
|
| + error = FT_THROW( Too_Many_Hints );
|
| goto Fail;
|
| }
|
|
|
| if ( ( limit - p ) < n_ins )
|
| {
|
| FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
|
| - error = TT_Err_Too_Many_Hints;
|
| + error = FT_THROW( Too_Many_Hints );
|
| goto Fail;
|
| }
|
|
|
| @@ -546,7 +559,7 @@
|
| return error;
|
|
|
| Invalid_Outline:
|
| - error = TT_Err_Invalid_Outline;
|
| + error = FT_THROW( Invalid_Outline );
|
| goto Fail;
|
| }
|
|
|
| @@ -667,7 +680,7 @@
|
| return error;
|
|
|
| Invalid_Composite:
|
| - error = TT_Err_Invalid_Composite;
|
| + error = FT_THROW( Invalid_Composite );
|
| goto Fail;
|
| }
|
|
|
| @@ -714,6 +727,11 @@
|
| TT_Hint_Glyph( TT_Loader loader,
|
| FT_Bool is_composite )
|
| {
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + TT_Face face = (TT_Face)loader->face;
|
| + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
|
| +#endif
|
| +
|
| TT_GlyphZone zone = &loader->zone;
|
| FT_Pos origin;
|
|
|
| @@ -813,7 +831,18 @@
|
| loader->pp4 = zone->cur[zone->n_points - 1];
|
| }
|
|
|
| - return TT_Err_Ok;
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
|
| + {
|
| + if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
|
| + FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
|
| +
|
| + else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
|
| + FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
|
| + }
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
| +
|
| + return FT_Err_Ok;
|
| }
|
|
|
|
|
| @@ -831,7 +860,7 @@
|
| TT_Process_Simple_Glyph( TT_Loader loader )
|
| {
|
| FT_GlyphLoader gloader = loader->gloader;
|
| - FT_Error error = TT_Err_Ok;
|
| + FT_Error error = FT_Err_Ok;
|
| FT_Outline* outline;
|
| FT_Int n_points;
|
|
|
| @@ -889,25 +918,83 @@
|
| loader->zone.n_points + 4 );
|
| }
|
|
|
| - /* scale the glyph */
|
| - if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
| {
|
| - FT_Vector* vec = outline->points;
|
| - FT_Vector* limit = outline->points + n_points;
|
| - FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale;
|
| - FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + TT_Face face = (TT_Face)loader->face;
|
| + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
|
| +
|
| + FT_String* family = face->root.family_name;
|
| + FT_Int ppem = loader->size->metrics.x_ppem;
|
| + FT_String* style = face->root.style_name;
|
| + FT_Int x_scale_factor = 1000;
|
| +#endif
|
| +
|
| + FT_Vector* vec = outline->points;
|
| + FT_Vector* limit = outline->points + n_points;
|
| +
|
| + FT_Fixed x_scale = 0; /* pacify compiler */
|
| + FT_Fixed y_scale = 0;
|
| +
|
| + FT_Bool do_scale = FALSE;
|
|
|
|
|
| - for ( ; vec < limit; vec++ )
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| +
|
| + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
|
| {
|
| - vec->x = FT_MulFix( vec->x, x_scale );
|
| - vec->y = FT_MulFix( vec->y, y_scale );
|
| + /* scale, but only if enabled and only if TT hinting is being used */
|
| + if ( IS_HINTED( loader->load_flags ) )
|
| + x_scale_factor = sph_test_tweak_x_scaling( face,
|
| + family,
|
| + ppem,
|
| + style,
|
| + loader->glyph_index );
|
| + /* scale the glyph */
|
| + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
|
| + x_scale_factor != 1000 )
|
| + {
|
| + x_scale = FT_MulDiv( ((TT_Size)loader->size)->metrics.x_scale,
|
| + x_scale_factor, 1000 );
|
| + y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
| +
|
| + /* compensate for any scaling by de/emboldening; */
|
| + /* the amount was determined via experimentation */
|
| + if ( x_scale_factor != 1000 && ppem > 11 )
|
| + FT_Outline_EmboldenXY( outline,
|
| + FT_MulFix( 1280 * ppem,
|
| + 1000 - x_scale_factor ),
|
| + 0 );
|
| + do_scale = TRUE;
|
| + }
|
| }
|
| + else
|
| +
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
| - loader->pp1 = outline->points[n_points - 4];
|
| - loader->pp2 = outline->points[n_points - 3];
|
| - loader->pp3 = outline->points[n_points - 2];
|
| - loader->pp4 = outline->points[n_points - 1];
|
| + {
|
| + /* scale the glyph */
|
| + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
|
| + {
|
| + x_scale = ((TT_Size)loader->size)->metrics.x_scale;
|
| + y_scale = ((TT_Size)loader->size)->metrics.y_scale;
|
| +
|
| + do_scale = TRUE;
|
| + }
|
| + }
|
| +
|
| + if ( do_scale )
|
| + {
|
| + for ( ; vec < limit; vec++ )
|
| + {
|
| + vec->x = FT_MulFix( vec->x, x_scale );
|
| + vec->y = FT_MulFix( vec->y, y_scale );
|
| + }
|
| +
|
| + loader->pp1 = outline->points[n_points - 4];
|
| + loader->pp2 = outline->points[n_points - 3];
|
| + loader->pp3 = outline->points[n_points - 2];
|
| + loader->pp4 = outline->points[n_points - 1];
|
| + }
|
| }
|
|
|
| if ( IS_HINTED( loader->load_flags ) )
|
| @@ -974,7 +1061,7 @@
|
| l += num_base_points;
|
| if ( k >= num_base_points ||
|
| l >= num_points )
|
| - return TT_Err_Invalid_Composite;
|
| + return FT_THROW( Invalid_Composite );
|
|
|
| p1 = gloader->base.outline.points + k;
|
| p2 = gloader->base.outline.points + l;
|
| @@ -988,7 +1075,7 @@
|
| y = subglyph->arg2;
|
|
|
| if ( !x && !y )
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
|
|
| /* Use a default value dependent on */
|
| /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */
|
| @@ -1033,16 +1120,10 @@
|
| /* */
|
| /* This algorithm is a guess and works much better than the above. */
|
| /* */
|
| - FT_Fixed mac_xscale = FT_SqrtFixed(
|
| - (FT_Int32)FT_MulFix( subglyph->transform.xx,
|
| - subglyph->transform.xx ) +
|
| - (FT_Int32)FT_MulFix( subglyph->transform.xy,
|
| - subglyph->transform.xy ) );
|
| - FT_Fixed mac_yscale = FT_SqrtFixed(
|
| - (FT_Int32)FT_MulFix( subglyph->transform.yy,
|
| - subglyph->transform.yy ) +
|
| - (FT_Int32)FT_MulFix( subglyph->transform.yx,
|
| - subglyph->transform.yx ) );
|
| + FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx,
|
| + subglyph->transform.xy );
|
| + FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy,
|
| + subglyph->transform.yx );
|
|
|
|
|
| x = FT_MulFix( x, mac_xscale );
|
| @@ -1074,7 +1155,7 @@
|
| base_vec + num_base_points,
|
| x, y );
|
|
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
|
|
|
|
| @@ -1143,7 +1224,7 @@
|
| FT_TRACE1(( "TT_Process_Composite_Glyph: "
|
| "too many instructions (%d) for glyph with length %d\n",
|
| n_ins, loader->byte_len ));
|
| - return TT_Err_Too_Many_Hints;
|
| + return FT_THROW( Too_Many_Hints );
|
| }
|
|
|
| tmp = loader->exec->glyphSize;
|
| @@ -1157,7 +1238,7 @@
|
| return error;
|
| }
|
| else if ( n_ins == 0 )
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
|
|
| if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
|
| return error;
|
| @@ -1213,7 +1294,7 @@
|
| FT_UInt recurse_count,
|
| FT_Bool header_only )
|
| {
|
| - FT_Error error = TT_Err_Ok;
|
| + FT_Error error = FT_Err_Ok;
|
| FT_Fixed x_scale, y_scale;
|
| FT_ULong offset;
|
| TT_Face face = (TT_Face)loader->face;
|
| @@ -1236,14 +1317,14 @@
|
| if ( recurse_count > 1 &&
|
| recurse_count > face->max_profile.maxComponentDepth )
|
| {
|
| - error = TT_Err_Invalid_Composite;
|
| + error = FT_THROW( Invalid_Composite );
|
| goto Exit;
|
| }
|
|
|
| /* check glyph index */
|
| if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
|
| {
|
| - error = TT_Err_Invalid_Glyph_Index;
|
| + error = FT_THROW( Invalid_Glyph_Index );
|
| goto Exit;
|
| }
|
|
|
| @@ -1307,7 +1388,7 @@
|
| #endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
| {
|
| FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
|
| - error = TT_Err_Invalid_Table;
|
| + error = FT_THROW( Invalid_Table );
|
| goto Exit;
|
| }
|
|
|
| @@ -1374,7 +1455,7 @@
|
| loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
|
| }
|
|
|
| - error = TT_Err_Ok;
|
| + error = FT_Err_Ok;
|
| goto Exit;
|
| }
|
|
|
| @@ -1588,7 +1669,7 @@
|
| else
|
| {
|
| /* invalid composite count (negative but not -1) */
|
| - error = TT_Err_Invalid_Outline;
|
| + error = FT_THROW( Invalid_Outline );
|
| goto Exit;
|
| }
|
|
|
| @@ -1618,11 +1699,15 @@
|
| compute_glyph_metrics( TT_Loader loader,
|
| FT_UInt glyph_index )
|
| {
|
| + TT_Face face = (TT_Face)loader->face;
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
|
| +#endif
|
| +
|
| FT_BBox bbox;
|
| - TT_Face face = (TT_Face)loader->face;
|
| FT_Fixed y_scale;
|
| TT_GlyphSlot glyph = loader->glyph;
|
| - TT_Size size = (TT_Size)loader->size;
|
| + TT_Size size = (TT_Size)loader->size;
|
|
|
|
|
| y_scale = 0x10000L;
|
| @@ -1653,8 +1738,30 @@
|
| size->root.metrics.x_ppem,
|
| glyph_index );
|
|
|
| - if ( widthp )
|
| - glyph->metrics.horiAdvance = *widthp << 6;
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| +
|
| + 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 << 6;
|
| + }
|
| + else
|
| +
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
| +
|
| + {
|
| + if ( widthp )
|
| + glyph->metrics.horiAdvance = *widthp << 6;
|
| + }
|
| }
|
|
|
| /* set glyph dimensions */
|
| @@ -1833,7 +1940,9 @@
|
| {
|
| TT_Face face;
|
| FT_Stream stream;
|
| +#ifdef TT_USE_BYTECODE_INTERPRETER
|
| FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
|
| +#endif
|
|
|
|
|
| face = (TT_Face)glyph->face;
|
| @@ -1849,6 +1958,23 @@
|
| TT_ExecContext exec;
|
| FT_Bool grayscale;
|
|
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
|
| +
|
| + FT_Bool subpixel_hinting = FALSE;
|
| + FT_Bool grayscale_hinting = TRUE;
|
| +
|
| +#if 0
|
| + /* not used yet */
|
| + FT_Bool compatible_widths;
|
| + FT_Bool symmetrical_smoothing;
|
| + FT_Bool bgr;
|
| + FT_Bool subpixel_positioned;
|
| +#endif
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
| +
|
| + FT_Bool reexecute = FALSE;
|
| +
|
|
|
| if ( !size->cvt_ready )
|
| {
|
| @@ -1863,24 +1989,113 @@
|
| exec = size->debug ? size->context
|
| : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
|
| if ( !exec )
|
| - return TT_Err_Could_Not_Find_Context;
|
| + return FT_THROW( Could_Not_Find_Context );
|
| +
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| +
|
| + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
|
| + {
|
| + subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )
|
| + != FT_RENDER_MODE_MONO ) &&
|
| + SPH_OPTION_SET_SUBPIXEL );
|
| +
|
| + if ( subpixel_hinting )
|
| + grayscale = grayscale_hinting = FALSE;
|
| + else if ( SPH_OPTION_SET_GRAYSCALE )
|
| + {
|
| + grayscale = grayscale_hinting = TRUE;
|
| + subpixel_hinting = FALSE;
|
| + }
|
| + else
|
| + grayscale = grayscale_hinting = FALSE;
|
| +
|
| + if ( FT_IS_TRICKY( glyph->face ) )
|
| + subpixel_hinting = grayscale_hinting = FALSE;
|
| +
|
| + exec->ignore_x_mode = subpixel_hinting || grayscale_hinting;
|
| + exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
|
| + if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
|
| + exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
|
| +
|
| +#if 1
|
| + exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
|
| + exec->symmetrical_smoothing = FALSE;
|
| + exec->bgr = FALSE;
|
| + exec->subpixel_positioned = TRUE;
|
| +#else /* 0 */
|
| + exec->compatible_widths =
|
| + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
| + TT_LOAD_COMPATIBLE_WIDTHS );
|
| + exec->symmetrical_smoothing =
|
| + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
| + TT_LOAD_SYMMETRICAL_SMOOTHING );
|
| + exec->bgr =
|
| + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
| + TT_LOAD_BGR );
|
| + exec->subpixel_positioned =
|
| + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
| + TT_LOAD_SUBPIXEL_POSITIONED );
|
| +#endif /* 0 */
|
| +
|
| + }
|
| + else
|
| +
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
| - grayscale =
|
| - FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO );
|
| + {
|
| + grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
|
| + FT_RENDER_MODE_MONO );
|
| + }
|
|
|
| TT_Load_Context( exec, face, size );
|
|
|
| - /* a change from mono to grayscale rendering (and vice versa) */
|
| - /* requires a re-execution of the CVT program */
|
| - if ( grayscale != exec->grayscale )
|
| +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
|
| +
|
| + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
|
| {
|
| - FT_UInt i;
|
| + /* a change from mono to subpixel rendering (and vice versa) */
|
| + /* requires a re-execution of the CVT program */
|
| + if ( subpixel_hinting != exec->subpixel_hinting )
|
| + {
|
| + FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
|
| + " re-executing `prep' table\n" ));
|
| +
|
| + exec->subpixel_hinting = subpixel_hinting;
|
| + reexecute = TRUE;
|
| + }
|
| +
|
| + /* a change from mono to grayscale rendering (and vice versa) */
|
| + /* requires a re-execution of the CVT program */
|
| + if ( grayscale != exec->grayscale_hinting )
|
| + {
|
| + FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
|
| + " re-executing `prep' table\n" ));
|
| +
|
| + exec->grayscale_hinting = grayscale_hinting;
|
| + reexecute = TRUE;
|
| + }
|
| + }
|
| + else
|
|
|
| +#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
|
|
|
| - FT_TRACE4(( "tt_loader_init: grayscale change,"
|
| - " re-executing `prep' table\n" ));
|
| + {
|
| + /* a change from mono to grayscale rendering (and vice versa) */
|
| + /* requires a re-execution of the CVT program */
|
| + if ( grayscale != exec->grayscale )
|
| + {
|
| + FT_TRACE4(( "tt_loader_init: grayscale change,"
|
| + " re-executing `prep' table\n" ));
|
| +
|
| + exec->grayscale = grayscale;
|
| + reexecute = TRUE;
|
| + }
|
| + }
|
| +
|
| + if ( reexecute )
|
| + {
|
| + FT_UInt i;
|
|
|
| - exec->grayscale = grayscale;
|
|
|
| for ( i = 0; i < size->cvt_size; i++ )
|
| size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
|
| @@ -1918,7 +2133,7 @@
|
| FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 );
|
|
|
|
|
| - if ( error == TT_Err_Table_Missing )
|
| + if ( FT_ERR_EQ( error, Table_Missing ) )
|
| loader->glyf_offset = 0;
|
| else if ( error )
|
| {
|
| @@ -1946,7 +2161,7 @@
|
| loader->glyph = (FT_GlyphSlot)glyph;
|
| loader->stream = stream;
|
|
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
|
|
|
|
| @@ -1983,13 +2198,11 @@
|
| FT_UInt glyph_index,
|
| FT_Int32 load_flags )
|
| {
|
| - TT_Face face;
|
| FT_Error error;
|
| TT_LoaderRec loader;
|
|
|
|
|
| - face = (TT_Face)glyph->face;
|
| - error = TT_Err_Ok;
|
| + error = FT_Err_Ok;
|
|
|
| #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
|
|
| @@ -2003,10 +2216,7 @@
|
| error = load_sbit_image( size, glyph, glyph_index, load_flags );
|
| if ( !error )
|
| {
|
| - FT_Face root = &face->root;
|
| -
|
| -
|
| - if ( FT_IS_SCALABLE( root ) )
|
| + if ( FT_IS_SCALABLE( glyph->face ) )
|
| {
|
| /* for the bbox we need the header only */
|
| (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
|
| @@ -2014,9 +2224,16 @@
|
| glyph->linearHoriAdvance = loader.linear;
|
| glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -
|
| loader.vadvance;
|
| +
|
| + /* sanity check: if `horiAdvance' in the sbit metric */
|
| + /* structure isn't set, use `linearHoriAdvance' */
|
| + if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )
|
| + glyph->metrics.horiAdvance =
|
| + FT_MulFix( glyph->linearHoriAdvance,
|
| + size->root.metrics.x_scale );
|
| }
|
|
|
| - return TT_Err_Ok;
|
| + return FT_Err_Ok;
|
| }
|
| }
|
|
|
| @@ -2024,10 +2241,10 @@
|
|
|
| /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
|
| if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
|
| - return TT_Err_Invalid_Size_Handle;
|
| + return FT_THROW( Invalid_Size_Handle );
|
|
|
| if ( load_flags & FT_LOAD_SBITS_ONLY )
|
| - return TT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
|
| if ( error )
|
|
|