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