diff --git a/ChangeLog b/ChangeLog index e79dce8ec..e6982254a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2016-09-22 Alexei Podtelezhnikov + + [smooth] Reduce divisions in the line renderer. + + We don't need some divisions if a line segments stays within a single + row or a single column of pixels. + + * src/smooth/ftgrays.c (gray_render_line) [FT_LONG64]: Make divisions + conditional. + 2016-09-15 Alexei Podtelezhnikov * src/smooth/ftgrays.c (gray_sweep): Remove check for empty table. diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index 75108da21..7558312fc 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -371,8 +371,9 @@ typedef ptrdiff_t FT_PtrDist; /* These macros speed up repetitive divisions by replacing them */ /* with multiplications and right shifts. */ -#define FT_UDIVPREP( b ) \ - long b ## _r = (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) +#define FT_UDIVPREP( c, b ) \ + long b ## _r = c ? (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) \ + : 0 #define FT_UDIV( a, b ) \ ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) ) @@ -890,8 +891,8 @@ typedef ptrdiff_t FT_PtrDist; else /* any other line */ { TPos prod = dx * fy1 - dy * fx1; - FT_UDIVPREP( dx ); - FT_UDIVPREP( dy ); + FT_UDIVPREP( ex1 != ex2, dx ); + FT_UDIVPREP( ey1 != ey2, dy ); /* The fundamental value `prod' determines which side and the */