This commit is contained in:
David Turner 2000-03-17 10:13:52 +00:00
parent a6415244f1
commit 16afbe2d5f
1 changed files with 40 additions and 25 deletions

View File

@ -89,6 +89,7 @@
#define ROUND(x) (((x)+ONE_PIXEL/2) & -ONE_PIXEL)
#define UPSCALE(x) (PIXEL_BITS >= 6 ? (x) << (PIXEL_BITS-6) : (x) >> (6-PIXEL_BITS))
#define DOWNSCALE(x) (PIXEL_BITS >= 6 ? (x) >> (PIXEL_BITS-6) : (x) << (6-PIXEL_BITS))
/****************************************************************************/
/* */
@ -473,12 +474,12 @@ int render_conic( RAS_ARG_ FT_Vector* control, FT_Vector* to )
int* levels;
FT_Vector* arc;
dx = ras.x + to->x - (control->x << 1); if (dx < 0) dx = -dx;
dy = ras.y + to->y - (control->y << 1); if (dy < 0) dy = -dy;
dx = DOWNSCALE(ras.x) + to->x - (control->x << 1); if (dx < 0) dx = -dx;
dy = DOWNSCALE(ras.y) + to->y - (control->y << 1); if (dy < 0) dy = -dy;
if (dx < dy) dx = dy;
level = 1;
dx = dx/64;
dx = dx/32;
while ( dx > 0 )
{
dx >>= 1;
@ -561,13 +562,13 @@ int render_cubic( RAS_ARG_ FT_Vector* control1,
int* levels;
FT_Vector* arc;
dx = ras.x + to->x - (control1->x << 1); if (dx < 0) dx = -dx;
dy = ras.y + to->y - (control1->y << 1); if (dy < 0) dy = -dy;
dx = DOWNSCALE(ras.x) + to->x - (control1->x << 1); if (dx < 0) dx = -dx;
dy = DOWNSCALE(ras.y) + to->y - (control1->y << 1); if (dy < 0) dy = -dy;
if (dx < dy) dx = dy;
da = dx;
dx = ras.x + to->x - 3*(control1->x + control2->x); if (dx < 0) dx = -dx;
dy = ras.y + to->y - 3*(control1->x + control2->y); if (dy < 0) dy = -dy;
dx = DOWNSCALE(ras.x) + to->x - 3*(control1->x + control2->x); if (dx < 0) dx = -dx;
dy = DOWNSCALE(ras.y) + to->y - 3*(control1->x + control2->y); if (dy < 0) dy = -dy;
if (dx < dy) dx = dy;
db = dx;
@ -623,10 +624,10 @@ int render_cubic( RAS_ARG_ FT_Vector* control1,
/* a macro comparing two cell pointers. returns true if a <= b */
#define LESS_THAN(a,b) ( (a)->y<(b)->y || ((a)->y==(b)->y && (a)->x<=(b)->x) )
#define LESS_THAN(a,b) ( (a)->y<(b)->y || ((a)->y==(b)->y && (a)->x < (b)->x) )
#define SWAP_CELLS(a,b,temp) { temp = *(a); *(a) = *(b); *(b) = temp; }
#define DEBUG_SORT
#define SHELL_SORT
#define QUICK_SORT
#ifdef SHELL_SORT
/* A simple shell sort algorithm that works directly on our */
@ -668,7 +669,7 @@ void shell_sort ( PCell cells,
/* it should be faster than calling the stdlib qsort(), and we can even */
/* tailor our insertion threshold... */
#define QSORT_THRESHOLD 4 /* below this size, a sub-array will be sorted */
#define QSORT_THRESHOLD 7 /* below this size, a sub-array will be sorted */
/* through a normal insertion sort.. */
static
@ -686,37 +687,39 @@ void quick_sort( PCell cells,
for (;;)
{
int len = limit-base;
PCell i, j;
PCell i, j, pivot;
if ( len > QSORT_THRESHOLD)
{
/* we use base+len/2 as the pivot */
SWAP_CELLS( base, base+len/2, temp );
i = base+1;
j = limit-1;
pivot = base + len/2;
SWAP_CELLS( base, pivot, temp );
i = base + 1;
j = limit-1;
/* now ensure that *i <= *base <= *j */
if (LESS_THAN(j,i))
SWAP( i, j, temp );
SWAP_CELLS( i, j, temp );
if (LESS_THAN(base,i))
SWAP( base, i, temp );
SWAP_CELLS( base, i, temp );
if (LESS_THAN(j,base))
SWAP( base, j, temp );
SWAP_CELLS( base, j, temp );
for (;;)
{
do i++ while (LESS_THAN(i,base));
do j-- while (LESS_THAN(base,j));
do i++; while (LESS_THAN(i,base));
do j--; while (LESS_THAN(base,j));
if (i > j)
break;
SWAP( i,j );
SWAP_CELLS( i,j, temp );
}
/* move pivot to correct place */
SWAP( base, j, temp );
SWAP_CELLS( base, j, temp );
/* now, push the largest sub-array */
if ( j - base > limit -i )
{
@ -741,11 +744,19 @@ void quick_sort( PCell cells,
{
for ( ; LESS_THAN(j+1,j); j-- )
{
SWAP( j+1, j, temp );
SWAP_CELLS( j+1, j, temp );
if (j == base)
break;
}
}
if (top > stack)
{
top -= 2;
base = top[0];
limit = top[1];
}
else
break;
}
}
}
@ -1489,8 +1500,12 @@ int check_sort( PCell cells, int count )
if (Convert_Glyph( (PRaster)raster, outline ))
return 1;
#ifdef SHELL_SORT
shell_sort( ras.cells, ras.num_cells );
#else
quick_sort( ras.cells, ras.num_cells );
#endif
#ifdef DEBUG_GRAYS
check_sort( ras.cells, ras.num_cells );