[smooth] Variable type revision (part 1).

This patch restores original `TCoord' definition as `int' so that the
rendering pool is used more efficiently on LP64 platforms (unix).

* src/smooth/ftgrays.c (gray_TWorker, TCell, gray_TBand): Switch some
fields to `TCoord'.
(gray_find_cell, gray_render_scanline, gray_render_line, gray_hline,
gray_sweep, gray_convert_glyph): Updated.
This commit is contained in:
Alexei Podtelezhnikov 2016-07-01 23:27:41 -04:00
parent ef0a3e7e65
commit 597c69596c
2 changed files with 60 additions and 46 deletions

View File

@ -1,3 +1,15 @@
2016-07-01 Alexei Podtelezhnikov <apodtele@gmail.com>
[smooth] Variable type revision (part 1).
This patch restores original `TCoord' definition as `int' so that the
rendering pool is used more efficiently on LP64 platforms (unix).
* src/smooth/ftgrays.c (gray_TWorker, TCell, gray_TBand): Switch some
fields to `TCoord'.
(gray_find_cell, gray_render_scanline, gray_render_line, gray_hline,
gray_sweep, gray_convert_glyph): Updated.
2016-06-28 Alexei Podtelezhnikov <apodtele@gmail.com>
[smooth] Minor clean-ups.

View File

@ -319,7 +319,7 @@ typedef ptrdiff_t FT_PtrDist;
#undef TRUNC
#undef SCALED
#define ONE_PIXEL ( 1L << PIXEL_BITS )
#define ONE_PIXEL ( 1 << PIXEL_BITS )
#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) )
#define SUBPIXELS( x ) ( (TPos)(x) * ONE_PIXEL )
#define FLOOR( x ) ( (x) & -ONE_PIXEL )
@ -387,7 +387,7 @@ typedef ptrdiff_t FT_PtrDist;
/* need to define them to "float" or "double" when experimenting with */
/* new algorithms */
typedef long TCoord; /* integer scanline/pixel coordinate */
typedef int TCoord; /* integer scanline/pixel coordinate */
typedef long TPos; /* sub-pixel coordinate */
typedef long TArea; /* cell areas, coordinate products */
@ -396,7 +396,7 @@ typedef ptrdiff_t FT_PtrDist;
typedef struct TCell_
{
TPos x; /* same with gray_TWorker.ex */
TCoord x; /* same with gray_TWorker.ex */
TCoord cover; /* same with gray_TWorker.cover */
TArea area;
PCell next;
@ -428,9 +428,9 @@ typedef ptrdiff_t FT_PtrDist;
ft_jmp_buf jump_buffer;
TCoord ex, ey;
TPos min_ex, max_ex;
TPos min_ey, max_ey;
TPos count_ex, count_ey;
TCoord min_ex, max_ex;
TCoord min_ey, max_ey;
TCoord count_ex, count_ey;
TArea area;
TCoord cover;
@ -493,7 +493,7 @@ typedef ptrdiff_t FT_PtrDist;
printf( "%3d:", yindex );
for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )
printf( " (%3ld, c:%4ld, a:%6ld)",
printf( " (%3d, c:%4d, a:%6ld)",
cell->x, cell->cover, cell->area );
printf( "\n" );
}
@ -510,7 +510,7 @@ typedef ptrdiff_t FT_PtrDist;
gray_find_cell( RAS_ARG )
{
PCell *pcell, cell;
TPos x = ras.ex;
TCoord x = ras.ex;
if ( x > ras.count_ex )
@ -615,10 +615,10 @@ typedef ptrdiff_t FT_PtrDist;
TCoord ey )
{
if ( ex > ras.max_ex )
ex = (TCoord)( ras.max_ex );
ex = ras.max_ex;
if ( ex < ras.min_ex )
ex = (TCoord)( ras.min_ex - 1 );
ex = ras.min_ex - 1;
ras.area = 0;
ras.cover = 0;
@ -642,8 +642,8 @@ typedef ptrdiff_t FT_PtrDist;
TPos x2,
TCoord y2 )
{
TCoord ex1, ex2, fx1, fx2, delta, mod;
long p, first, dx;
TCoord ex1, ex2, fx1, fx2, first, delta, mod;
TPos p, dx;
int incr;
@ -737,10 +737,9 @@ typedef ptrdiff_t FT_PtrDist;
gray_render_line( RAS_ARG_ TPos to_x,
TPos to_y )
{
TCoord ey1, ey2, fy1, fy2, mod;
TPos dx, dy, x, x2;
long p, first;
int delta, rem, lift, incr;
TCoord ey1, ey2, fy1, fy2, first, delta, mod;
TPos p, dx, dy, x, x2;
int incr;
ey1 = TRUNC( ras.y );
@ -781,14 +780,14 @@ typedef ptrdiff_t FT_PtrDist;
incr = -1;
}
delta = (int)( first - fy1 );
delta = first - fy1;
ras.area += (TArea)two_fx * delta;
ras.cover += delta;
ey1 += incr;
gray_set_cell( RAS_VAR_ ex, ey1 );
delta = (int)( first + first - ONE_PIXEL );
delta = first + first - ONE_PIXEL;
area = (TArea)two_fx * delta;
while ( ey1 != ey2 )
{
@ -799,7 +798,7 @@ typedef ptrdiff_t FT_PtrDist;
gray_set_cell( RAS_VAR_ ex, ey1 );
}
delta = (int)( fy2 - ONE_PIXEL + first );
delta = fy2 - ONE_PIXEL + first;
ras.area += (TArea)two_fx * delta;
ras.cover += delta;
@ -819,19 +818,22 @@ typedef ptrdiff_t FT_PtrDist;
dy = -dy;
}
FT_DIV_MOD( int, p, dy, delta, mod );
FT_DIV_MOD( TCoord, p, dy, delta, mod );
x = ras.x + delta;
gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, first );
ey1 += incr;
gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
if ( ey1 != ey2 )
{
p = ONE_PIXEL * dx;
FT_DIV_MOD( int, p, dy, lift, rem );
mod -= (int)dy;
TCoord lift, rem;
p = ONE_PIXEL * dx;
FT_DIV_MOD( TCoord, p, dy, lift, rem );
mod -= (TCoord)dy;
do
{
@ -839,14 +841,14 @@ typedef ptrdiff_t FT_PtrDist;
mod += rem;
if ( mod >= 0 )
{
mod -= (int)dy;
mod -= (TCoord)dy;
delta++;
}
x2 = x + delta;
gray_render_scanline( RAS_VAR_ ey1, x,
(TCoord)( ONE_PIXEL - first ), x2,
(TCoord)first );
gray_render_scanline( RAS_VAR_ ey1,
x, ONE_PIXEL - first,
x2, first );
x = x2;
ey1 += incr;
@ -854,9 +856,9 @@ typedef ptrdiff_t FT_PtrDist;
} while ( ey1 != ey2 );
}
gray_render_scanline( RAS_VAR_ ey1, x,
(TCoord)( ONE_PIXEL - first ), to_x,
fy2 );
gray_render_scanline( RAS_VAR_ ey1,
x, ONE_PIXEL - first,
to_x, fy2 );
End:
ras.x = to_x;
@ -1312,7 +1314,7 @@ typedef ptrdiff_t FT_PtrDist;
static void
gray_hline( RAS_ARG_ TCoord x,
TCoord y,
TPos area,
TArea area,
TCoord acount )
{
int coverage;
@ -1344,8 +1346,8 @@ typedef ptrdiff_t FT_PtrDist;
coverage = 255;
}
y += (TCoord)ras.min_ey;
x += (TCoord)ras.min_ex;
y += ras.min_ey;
x += ras.min_ex;
if ( coverage )
{
@ -1356,10 +1358,10 @@ typedef ptrdiff_t FT_PtrDist;
/* see whether we can add this span to the current list */
count = ras.num_gray_spans;
span = ras.gray_spans + count - 1;
if ( span->coverage == coverage &&
(TCoord)span->x + span->len == x &&
ras.span_y == y &&
count > 0 )
if ( span->coverage == coverage &&
span->x + span->len == x &&
ras.span_y == y &&
count > 0 )
{
span->len = (unsigned short)( span->len + acount );
return;
@ -1429,15 +1431,15 @@ typedef ptrdiff_t FT_PtrDist;
for ( ; cell != NULL; cell = cell->next )
{
TPos area;
TArea area;
if ( cell->x > x && cover != 0 )
gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
gray_hline( RAS_VAR_ x, yindex, (TArea)cover * ( ONE_PIXEL * 2 ),
cell->x - x );
cover += cell->cover;
area = cover * ( ONE_PIXEL * 2 ) - cell->area;
area = (TArea)cover * ( ONE_PIXEL * 2 ) - cell->area;
if ( area != 0 && cell->x >= 0 )
gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );
@ -1446,7 +1448,7 @@ typedef ptrdiff_t FT_PtrDist;
}
if ( cover != 0 )
gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
gray_hline( RAS_VAR_ x, yindex, (TArea)cover * ( ONE_PIXEL * 2 ),
ras.count_ex - x );
}
@ -1839,7 +1841,7 @@ typedef ptrdiff_t FT_PtrDist;
typedef struct gray_TBand_
{
TPos min, max;
TCoord min, max;
} gray_TBand;
@ -1887,7 +1889,7 @@ typedef ptrdiff_t FT_PtrDist;
gray_TBand bands[40];
gray_TBand* band;
int n, num_bands;
TPos min, max, max_y;
TCoord min, max, max_y;
/* set up vertical bands */
@ -1912,8 +1914,8 @@ typedef ptrdiff_t FT_PtrDist;
do
{
TPos bottom, top, middle;
int error;
TCoord bottom, top, middle;
int error;
/* memory management */