| Index: src/pshinter/pshglob.c
|
| diff --git a/src/pshinter/pshglob.c b/src/pshinter/pshglob.c
|
| index 31231ad0094083ee1f7a9f49d15dea5b15adbd79..9285efc9e166369243ed31351e788620a2fe4e07 100644
|
| --- a/src/pshinter/pshglob.c
|
| +++ b/src/pshinter/pshglob.c
|
| @@ -5,7 +5,7 @@
|
| /* PostScript hinter global hinting management (body). */
|
| /* Inspired by the new auto-hinter module. */
|
| /* */
|
| -/* Copyright 2001, 2002, 2003, 2004, 2006, 2010 by */
|
| +/* Copyright 2001-2004, 2006, 2010, 2012 by */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used */
|
| @@ -522,6 +522,28 @@
|
| }
|
|
|
|
|
| + /* calculate the maximum height of given blue zones */
|
| + static FT_Short
|
| + psh_calc_max_height( FT_UInt num,
|
| + const FT_Short* values,
|
| + FT_Short cur_max )
|
| + {
|
| + FT_UInt count;
|
| +
|
| +
|
| + for ( count = 0; count < num; count += 2 )
|
| + {
|
| + FT_Short cur_height = values[count + 1] - values[count];
|
| +
|
| +
|
| + if ( cur_height > cur_max )
|
| + cur_max = cur_height;
|
| + }
|
| +
|
| + return cur_max;
|
| + }
|
| +
|
| +
|
| FT_LOCAL_DEF( void )
|
| psh_blues_snap_stem( PSH_Blues blues,
|
| FT_Int stem_top,
|
| @@ -684,7 +706,32 @@
|
| priv->family_blues, priv->num_family_other_blues,
|
| priv->family_other_blues, priv->blue_fuzz, 1 );
|
|
|
| - globals->blues.blue_scale = priv->blue_scale;
|
| + /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
|
| + {
|
| + FT_Fixed max_scale;
|
| + FT_Short max_height = 1;
|
| +
|
| +
|
| + max_height = psh_calc_max_height( priv->num_blue_values,
|
| + priv->blue_values,
|
| + max_height );
|
| + max_height = psh_calc_max_height( priv->num_other_blues,
|
| + priv->other_blues,
|
| + max_height );
|
| + max_height = psh_calc_max_height( priv->num_family_blues,
|
| + priv->family_blues,
|
| + max_height );
|
| + max_height = psh_calc_max_height( priv->num_family_other_blues,
|
| + priv->family_other_blues,
|
| + max_height );
|
| +
|
| + /* BlueScale is scaled 1000 times */
|
| + max_scale = FT_DivFix( 1000, max_height );
|
| + globals->blues.blue_scale = priv->blue_scale < max_scale
|
| + ? priv->blue_scale
|
| + : max_scale;
|
| + }
|
| +
|
| globals->blues.blue_shift = priv->blue_shift;
|
| globals->blues.blue_fuzz = priv->blue_fuzz;
|
|
|
|
|