[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.
This commit is contained in:
Alexei Podtelezhnikov 2016-09-22 22:48:15 -04:00
parent c95b7652d8
commit 53ae7a542d
2 changed files with 15 additions and 4 deletions

View File

@ -1,3 +1,13 @@
2016-09-22 Alexei Podtelezhnikov <apodtele@gmail.com>
[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 <apodtele@gmail.com>
* src/smooth/ftgrays.c (gray_sweep): Remove check for empty table.

View File

@ -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 */