| 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; | 
|  | 
|  |