| Index: src/smooth/ftgrays.c
|
| diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
|
| index 4c0eea596d5222a13917ff8c93de4f6bd0786ae3..d2158e77e5fb1373fc70354e33ab1f4d51da1ba5 100644
|
| --- a/src/smooth/ftgrays.c
|
| +++ b/src/smooth/ftgrays.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* A new `perfect' anti-aliasing renderer (body). */
|
| /* */
|
| -/* Copyright 2000-2003, 2005-2012 by */
|
| +/* Copyright 2000-2003, 2005-2013 by */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used, */
|
| @@ -94,6 +94,11 @@
|
| #ifdef _STANDALONE_
|
|
|
|
|
| + /* Auxiliary macros for token concatenation. */
|
| +#define FT_ERR_XCAT( x, y ) x ## y
|
| +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
|
| +
|
| +
|
| /* define this to dump debugging information */
|
| /* #define FT_DEBUG_LEVEL_TRACE */
|
|
|
| @@ -154,6 +159,21 @@ typedef ptrdiff_t FT_PtrDist;
|
| va_end( ap );
|
| }
|
|
|
| +
|
| + /* empty function useful for setting a breakpoint to catch errors */
|
| + int
|
| + FT_Throw( int error,
|
| + int line,
|
| + const char* file )
|
| + {
|
| + FT_UNUSED( error );
|
| + FT_UNUSED( line );
|
| + FT_UNUSED( file );
|
| +
|
| + return 0;
|
| + }
|
| +
|
| +
|
| /* we don't handle tracing levels in stand-alone mode; */
|
| #ifndef FT_TRACE5
|
| #define FT_TRACE5( varformat ) FT_Message varformat
|
| @@ -165,11 +185,19 @@ typedef ptrdiff_t FT_PtrDist;
|
| #define FT_ERROR( varformat ) FT_Message varformat
|
| #endif
|
|
|
| +#define FT_THROW( e ) \
|
| + ( FT_Throw( FT_ERR_CAT( ErrRaster, e ), \
|
| + __LINE__, \
|
| + __FILE__ ) | \
|
| + FT_ERR_CAT( ErrRaster, e ) )
|
| +
|
| #else /* !FT_DEBUG_LEVEL_TRACE */
|
|
|
| #define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */
|
| #define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */
|
| #define FT_ERROR( x ) do { } while ( 0 ) /* nothing */
|
| +#define FT_THROW( e ) FT_ERR_CAT( ErrRaster_, e )
|
| +
|
|
|
| #endif /* !FT_DEBUG_LEVEL_TRACE */
|
|
|
| @@ -202,6 +230,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| raster_done_ \
|
| };
|
|
|
| +
|
| #else /* !_STANDALONE_ */
|
|
|
|
|
| @@ -215,13 +244,14 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| #include "ftspic.h"
|
|
|
| -#define ErrRaster_Invalid_Mode Smooth_Err_Cannot_Render_Glyph
|
| -#define ErrRaster_Invalid_Outline Smooth_Err_Invalid_Outline
|
| +#define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph
|
| +#define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory
|
| #define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory
|
| -#define ErrRaster_Invalid_Argument Smooth_Err_Invalid_Argument
|
| +
|
|
|
| #endif /* !_STANDALONE_ */
|
|
|
| +
|
| #ifndef FT_MEM_SET
|
| #define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
|
| #endif
|
| @@ -312,7 +342,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| #endif /* PIXEL_BITS >= 8 */
|
|
|
|
|
| - /* maximal number of gray spans in a call to the span callback */
|
| + /* maximum number of gray spans in a call to the span callback */
|
| #define FT_MAX_GRAY_SPANS 32
|
|
|
|
|
| @@ -600,7 +630,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| TPos x2,
|
| TCoord y2 )
|
| {
|
| - TCoord ex1, ex2, fx1, fx2, delta, mod, lift, rem;
|
| + TCoord ex1, ex2, fx1, fx2, delta, mod;
|
| long p, first, dx;
|
| int incr;
|
|
|
| @@ -661,6 +691,9 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| if ( ex1 != ex2 )
|
| {
|
| + TCoord lift, rem;
|
| +
|
| +
|
| p = ONE_PIXEL * ( y2 - y1 + delta );
|
| lift = (TCoord)( p / dx );
|
| rem = (TCoord)( p % dx );
|
| @@ -1091,11 +1124,11 @@ typedef ptrdiff_t FT_PtrDist;
|
| if ( s > s_limit )
|
| goto Split;
|
|
|
| - /* If P1 or P2 is outside P0-P3, split the curve. */
|
| - if ( dy * dy1 + dx * dx1 < 0 ||
|
| - dy * dy2 + dx * dx2 < 0 ||
|
| - dy * (arc[3].y - arc[1].y) + dx * (arc[3].x - arc[1].x) < 0 ||
|
| - dy * (arc[3].y - arc[2].y) + dx * (arc[3].x - arc[2].x) < 0 )
|
| + /* Split super curvy segments where the off points are so far
|
| + from the chord that the angles P0-P1-P3 or P0-P2-P3 become
|
| + acute as detected by appropriate dot products. */
|
| + if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||
|
| + dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )
|
| goto Split;
|
|
|
| /* No reason to split. */
|
| @@ -1227,9 +1260,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| TPos area,
|
| TCoord acount )
|
| {
|
| - FT_Span* span;
|
| - int count;
|
| - int coverage;
|
| + int coverage;
|
|
|
|
|
| /* compute the coverage line's coverage, depending on the */
|
| @@ -1271,6 +1302,10 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
| if ( coverage )
|
| {
|
| + FT_Span* span;
|
| + int count;
|
| +
|
| +
|
| /* see whether we can add this span to the current list */
|
| count = ras.num_gray_spans;
|
| span = ras.gray_spans + count - 1;
|
| @@ -1400,7 +1435,26 @@ typedef ptrdiff_t FT_PtrDist;
|
| ras.render_span( ras.span_y, ras.num_gray_spans,
|
| ras.gray_spans, ras.render_span_data );
|
|
|
| +#ifdef FT_DEBUG_LEVEL_TRACE
|
| +
|
| + if ( ras.num_gray_spans > 0 )
|
| + {
|
| + FT_Span* span;
|
| + int n;
|
| +
|
| +
|
| + FT_TRACE7(( "y = %3d ", ras.span_y ));
|
| + span = ras.gray_spans;
|
| + for ( n = 0; n < ras.num_gray_spans; n++, span++ )
|
| + FT_TRACE7(( "[%d..%d]:%02x ",
|
| + span->x, span->x + span->len - 1, span->coverage ));
|
| + FT_TRACE7(( "\n" ));
|
| + }
|
| +
|
| FT_TRACE7(( "gray_sweep: end\n" ));
|
| +
|
| +#endif /* FT_DEBUG_LEVEL_TRACE */
|
| +
|
| }
|
|
|
|
|
| @@ -1467,7 +1521,7 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
|
|
| if ( !outline || !func_interface )
|
| - return ErrRaster_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| shift = func_interface->shift;
|
| delta = func_interface->delta;
|
| @@ -1680,7 +1734,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| return error;
|
|
|
| Invalid_Outline:
|
| - return ErrRaster_Invalid_Outline;
|
| + return FT_THROW( Invalid_Outline );
|
| }
|
|
|
| #endif /* _STANDALONE_ */
|
| @@ -1718,7 +1772,7 @@ typedef ptrdiff_t FT_PtrDist;
|
| gray_record_cell( RAS_VAR );
|
| }
|
| else
|
| - error = ErrRaster_Memory_Overflow;
|
| + error = FT_THROW( Memory_Overflow );
|
|
|
| return error;
|
| }
|
| @@ -1871,21 +1925,21 @@ typedef ptrdiff_t FT_PtrDist;
|
|
|
|
|
| if ( !raster || !raster->buffer || !raster->buffer_size )
|
| - return ErrRaster_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| if ( !outline )
|
| - return ErrRaster_Invalid_Outline;
|
| + return FT_THROW( Invalid_Outline );
|
|
|
| /* return immediately if the outline is empty */
|
| if ( outline->n_points == 0 || outline->n_contours <= 0 )
|
| return 0;
|
|
|
| if ( !outline->contours || !outline->points )
|
| - return ErrRaster_Invalid_Outline;
|
| + return FT_THROW( Invalid_Outline );
|
|
|
| if ( outline->n_points !=
|
| outline->contours[outline->n_contours - 1] + 1 )
|
| - return ErrRaster_Invalid_Outline;
|
| + return FT_THROW( Invalid_Outline );
|
|
|
| worker = raster->worker;
|
|
|
| @@ -1893,19 +1947,19 @@ typedef ptrdiff_t FT_PtrDist;
|
| if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
|
| {
|
| if ( !target_map )
|
| - return ErrRaster_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| /* nothing to do */
|
| if ( !target_map->width || !target_map->rows )
|
| return 0;
|
|
|
| if ( !target_map->buffer )
|
| - return ErrRaster_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
| }
|
|
|
| /* this version does not support monochrome rendering */
|
| if ( !( params->flags & FT_RASTER_FLAG_AA ) )
|
| - return ErrRaster_Invalid_Mode;
|
| + return FT_THROW( Invalid_Mode );
|
|
|
| /* compute clipping box */
|
| if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
|
|
|