| Index: third_party/freetype/src/base/ftoutln.c
 | 
| diff --git a/third_party/freetype/src/base/ftoutln.c b/third_party/freetype/src/base/ftoutln.c
 | 
| index 8749d64ce79dbc2be29fd21f2e6d49c9939e5549..35cc9f5569299b45c52e9523e9274a101fea94fe 100644
 | 
| --- a/third_party/freetype/src/base/ftoutln.c
 | 
| +++ b/third_party/freetype/src/base/ftoutln.c
 | 
| @@ -4,7 +4,7 @@
 | 
|  /*                                                                         */
 | 
|  /*    FreeType outline management (body).                                  */
 | 
|  /*                                                                         */
 | 
| -/*  Copyright 1996-2008, 2010, 2012-2014 by                                */
 | 
| +/*  Copyright 1996-2015 by                                                 */
 | 
|  /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 | 
|  /*                                                                         */
 | 
|  /*  This file is part of the FreeType project, and may only be used,       */
 | 
| @@ -52,8 +52,9 @@
 | 
|                          const FT_Outline_Funcs*  func_interface,
 | 
|                          void*                    user )
 | 
|    {
 | 
| -#undef SCALED
 | 
| -#define SCALED( x )  ( ( (x) << shift ) - delta )
 | 
| +#undef  SCALED
 | 
| +#define SCALED( x )  ( ( (x) < 0 ? -( -(x) << shift )             \
 | 
| +                                 :  (  (x) << shift ) ) - delta )
 | 
|  
 | 
|      FT_Vector   v_last;
 | 
|      FT_Vector   v_control;
 | 
| @@ -279,7 +280,7 @@
 | 
|        if ( error )
 | 
|          goto Exit;
 | 
|  
 | 
| -      first = last + 1;
 | 
| +      first = (FT_UInt)last + 1;
 | 
|      }
 | 
|  
 | 
|      FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
 | 
| @@ -320,7 +321,7 @@
 | 
|           FT_NEW_ARRAY( anoutline->contours, numContours ) )
 | 
|        goto Fail;
 | 
|  
 | 
| -    anoutline->n_points    = (FT_UShort)numPoints;
 | 
| +    anoutline->n_points    = (FT_Short)numPoints;
 | 
|      anoutline->n_contours  = (FT_Short)numContours;
 | 
|      anoutline->flags      |= FT_OUTLINE_OWNER;
 | 
|  
 | 
| @@ -612,7 +613,6 @@
 | 
|                       FT_Raster_Params*  params )
 | 
|    {
 | 
|      FT_Error     error;
 | 
| -    FT_Bool      update = FALSE;
 | 
|      FT_Renderer  renderer;
 | 
|      FT_ListNode  node;
 | 
|  
 | 
| @@ -646,14 +646,8 @@
 | 
|        /* format                                                */
 | 
|        renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
 | 
|                                       &node );
 | 
| -      update   = TRUE;
 | 
|      }
 | 
|  
 | 
| -    /* if we changed the current renderer for the glyph image format */
 | 
| -    /* we need to select it as the next current one                  */
 | 
| -    if ( !error && update && renderer )
 | 
| -      error = FT_Set_Renderer( library, renderer, 0, 0 );
 | 
| -
 | 
|      return error;
 | 
|    }
 | 
|  
 | 
| @@ -914,8 +908,7 @@
 | 
|                           FT_Pos       ystrength )
 | 
|    {
 | 
|      FT_Vector*  points;
 | 
| -    FT_Vector   v_prev, v_first, v_next, v_cur;
 | 
| -    FT_Int      c, n, first;
 | 
| +    FT_Int      c, first, last;
 | 
|      FT_Int      orientation;
 | 
|  
 | 
|  
 | 
| @@ -941,87 +934,95 @@
 | 
|      first = 0;
 | 
|      for ( c = 0; c < outline->n_contours; c++ )
 | 
|      {
 | 
| -      FT_Vector  in, out, shift;
 | 
| -      FT_Fixed   l_in, l_out, l, q, d;
 | 
| -      int        last = outline->contours[c];
 | 
| +      FT_Vector  in, out, anchor, shift;
 | 
| +      FT_Fixed   l_in, l_out, l_anchor = 0, l, q, d;
 | 
| +      FT_Int     i, j, k;
 | 
|  
 | 
|  
 | 
| -      v_first = points[first];
 | 
| -      v_prev  = points[last];
 | 
| -      v_cur   = v_first;
 | 
| +      l_in = 0;
 | 
| +      last = outline->contours[c];
 | 
|  
 | 
| -      /* compute incoming normalized vector */
 | 
| -      in.x = v_cur.x - v_prev.x;
 | 
| -      in.y = v_cur.y - v_prev.y;
 | 
| -      l_in = FT_Vector_Length( &in );
 | 
| -      if ( l_in )
 | 
| +      /* Counter j cycles though the points; counter i advances only  */
 | 
| +      /* when points are moved; anchor k marks the first moved point. */
 | 
| +      for ( i = last, j = first, k = -1;
 | 
| +            j != i && i != k;
 | 
| +            j = j < last ? j + 1 : first )
 | 
|        {
 | 
| -        in.x = FT_DivFix( in.x, l_in );
 | 
| -        in.y = FT_DivFix( in.y, l_in );
 | 
| -      }
 | 
| +        if ( j != k )
 | 
| +        {
 | 
| +          out.x = points[j].x - points[i].x;
 | 
| +          out.y = points[j].y - points[i].y;
 | 
| +          l_out = (FT_Fixed)FT_Vector_NormLen( &out );
 | 
|  
 | 
| -      for ( n = first; n <= last; n++ )
 | 
| -      {
 | 
| -        if ( n < last )
 | 
| -          v_next = points[n + 1];
 | 
| +          if ( l_out == 0 )
 | 
| +            continue;
 | 
| +        }
 | 
|          else
 | 
| -          v_next = v_first;
 | 
| -
 | 
| -        /* compute outgoing normalized vector */
 | 
| -        out.x = v_next.x - v_cur.x;
 | 
| -        out.y = v_next.y - v_cur.y;
 | 
| -        l_out = FT_Vector_Length( &out );
 | 
| -        if ( l_out )
 | 
|          {
 | 
| -          out.x = FT_DivFix( out.x, l_out );
 | 
| -          out.y = FT_DivFix( out.y, l_out );
 | 
| +          out   = anchor;
 | 
| +          l_out = l_anchor;
 | 
|          }
 | 
|  
 | 
| -        d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
 | 
| -
 | 
| -        /* shift only if turn is less than ~160 degrees */
 | 
| -        if ( d > -0xF000L )
 | 
| +        if ( l_in != 0 )
 | 
|          {
 | 
| -          d = d + 0x10000L;
 | 
| +          if ( k < 0 )
 | 
| +          {
 | 
| +            k        = i;
 | 
| +            anchor   = in;
 | 
| +            l_anchor = l_in;
 | 
| +          }
 | 
|  
 | 
| -          /* shift components are aligned along lateral bisector */
 | 
| -          /* and directed according to the outline orientation.  */
 | 
| -          shift.x = in.y + out.y;
 | 
| -          shift.y = in.x + out.x;
 | 
| +          d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
 | 
|  
 | 
| -          if ( orientation == FT_ORIENTATION_TRUETYPE )
 | 
| -            shift.x = -shift.x;
 | 
| -          else
 | 
| -            shift.y = -shift.y;
 | 
| +          /* shift only if turn is less than ~160 degrees */
 | 
| +          if ( d > -0xF000L )
 | 
| +          {
 | 
| +            d = d + 0x10000L;
 | 
|  
 | 
| -          /* restrict shift magnitude to better handle collapsing segments */
 | 
| -          q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
 | 
| -          if ( orientation == FT_ORIENTATION_TRUETYPE )
 | 
| -            q = -q;
 | 
| +            /* shift components along lateral bisector in proper orientation */
 | 
| +            shift.x = in.y + out.y;
 | 
| +            shift.y = in.x + out.x;
 | 
|  
 | 
| -          l = FT_MIN( l_in, l_out );
 | 
| +            if ( orientation == FT_ORIENTATION_TRUETYPE )
 | 
| +              shift.x = -shift.x;
 | 
| +            else
 | 
| +              shift.y = -shift.y;
 | 
|  
 | 
| -          /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
 | 
| -          if ( FT_MulFix( xstrength, q ) <= FT_MulFix( d, l ) )
 | 
| -            shift.x = FT_MulDiv( shift.x, xstrength, d );
 | 
| -          else
 | 
| -            shift.x = FT_MulDiv( shift.x, l, q );
 | 
| +            /* restrict shift magnitude to better handle collapsing segments */
 | 
| +            q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
 | 
| +            if ( orientation == FT_ORIENTATION_TRUETYPE )
 | 
| +              q = -q;
 | 
| +
 | 
| +            l = FT_MIN( l_in, l_out );
 | 
| +
 | 
| +            /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
 | 
| +            if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) )
 | 
| +              shift.x = FT_MulDiv( shift.x, xstrength, d );
 | 
| +            else
 | 
| +              shift.x = FT_MulDiv( shift.x, l, q );
 | 
|  
 | 
|  
 | 
| -          if ( FT_MulFix( ystrength, q ) <= FT_MulFix( d, l ) )
 | 
| -            shift.y = FT_MulDiv( shift.y, ystrength, d );
 | 
| +            if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) )
 | 
| +              shift.y = FT_MulDiv( shift.y, ystrength, d );
 | 
| +            else
 | 
| +              shift.y = FT_MulDiv( shift.y, l, q );
 | 
| +          }
 | 
|            else
 | 
| -            shift.y = FT_MulDiv( shift.y, l, q );
 | 
| +            shift.x = shift.y = 0;
 | 
| +
 | 
| +          for ( ;
 | 
| +                i != j;
 | 
| +                i = i < last ? i + 1 : first )
 | 
| +          {
 | 
| +            points[i].x += xstrength + shift.x;
 | 
| +            points[i].y += ystrength + shift.y;
 | 
| +          }
 | 
|          }
 | 
|          else
 | 
| -          shift.x = shift.y = 0;
 | 
| -
 | 
| -        outline->points[n].x = v_cur.x + xstrength + shift.x;
 | 
| -        outline->points[n].y = v_cur.y + ystrength + shift.y;
 | 
| +          i = j;
 | 
|  
 | 
| -        in    = out;
 | 
| -        l_in  = l_out;
 | 
| -        v_cur = v_next;
 | 
| +        in   = out;
 | 
| +        l_in = l_out;
 | 
|        }
 | 
|  
 | 
|        first = last + 1;
 | 
| @@ -1050,7 +1051,7 @@
 | 
|      /* We use the nonzero winding rule to find the orientation.       */
 | 
|      /* Since glyph outlines behave much more `regular' than arbitrary */
 | 
|      /* cubic or quadratic curves, this test deals with the polygon    */
 | 
| -    /* only which is spanned up by the control points.                */
 | 
| +    /* only that is spanned up by the control points.                 */
 | 
|  
 | 
|      FT_Outline_Get_CBox( outline, &cbox );
 | 
|  
 | 
| @@ -1058,10 +1059,11 @@
 | 
|      if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax )
 | 
|        return FT_ORIENTATION_NONE;
 | 
|  
 | 
| -    xshift = FT_MSB( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) - 14;
 | 
| +    xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) |
 | 
| +                                  FT_ABS( cbox.xMin ) ) ) - 14;
 | 
|      xshift = FT_MAX( xshift, 0 );
 | 
|  
 | 
| -    yshift = FT_MSB( cbox.yMax - cbox.yMin ) - 14;
 | 
| +    yshift = FT_MSB( (FT_UInt32)( cbox.yMax - cbox.yMin ) ) - 14;
 | 
|      yshift = FT_MAX( yshift, 0 );
 | 
|  
 | 
|      points = outline->points;
 | 
| 
 |