home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Education Master 1994 (4th Edition)
/
EDUCATIONS_MASTER_4TH_EDITION.bin
/
files
/
progng_c
/
pcxc
/
vgrfill.c
< prev
Wrap
C/C++ Source or Header
|
1988-04-10
|
3KB
|
132 lines
/* VGRFILL.c - Routine to fill an outline in a bit map.
DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER!
*****************************************************************************
* NOTE CAREFULLY: *
*****************************************************************************
* This function uses ***LOTS*** *
* of stack space!!! ie: count on up to about 10K *
* for every 100 levels of call nesting, with a *
* possibility of >200 levels being reached!!! *
*****************************************************************************
DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER! DANGER!
*/
#include "lib.h"
#include "vgr.h"
#ifdef __STDC__
void vgr_fill(int x,int y,int color);
static void _fill_y(int x,int y,int yinc);
static void _fill_x(int x,int y);
static int __fill_x(int x,int y,int xinc);
#else
void vgr_fill();
static void _fill_y();
static void _fill_x();
static int __fill_x();
#endif
static unsigned char _color, _search;
static int _set_cnt, _up_cnt, _dn_cnt, _y_ok;
void vgr_fill( x, y, color )
int x, y, color;
{
if ( (_search = VGR_GET( x, y )) == (_color = color) )
return;
_fill_y( x, y+1, 1 );
_fill_y( x, y , -1 );
}
static void _fill_y( x, y, yinc )
int x, y, yinc;
{
for ( ; y >= 0 && y < VGR_VRES; y += yinc )
if ( _search == VGR_GET( x, y ) )
_fill_x( x, y );
else return;
}
static void _fill_x( x, y )
int x, y;
{
int i, l, h, u, d, c;
void _fill_y();
#ifdef DEBUG
static int depth;
putcur(0,0);
printf("%d ", ++depth );
if ( constat() )
if ( conin() == 27 )
{ video_mode(3);
exit(1);
};
#endif
_set_cnt = _up_cnt = _dn_cnt = 0;
_y_ok = ( (y >= 1) && (y < (VGR_VRES-1)) );
h = __fill_x( x+1, y, 1 );
l = __fill_x( x , y, -1 );
/* The purpose of the following code is to prevent
excessive call nesting. It can be removed, but
the resulting several thousand useless function
calls slow down processing considerably, as well
as killing the system when SP rolls over...
*/
if ( !_y_ok )
{
#ifdef DEBUG
depth--;
#endif
return;
};
c = _set_cnt;
u = _up_cnt;
d = _dn_cnt;
if ( c != u )
for ( i = l+1; i <= h-1; i++ )
if ( _search == VGR_GET( i, y-1 ) )
_fill_y( i, y-1, -1 );
if ( c != d )
for ( i = l+1; i <= h-1; i++ )
if ( _search == VGR_GET( i, y+1 ) )
_fill_y( i, y+1, 1 );
#ifdef DEBUG
depth--;
#endif
}
static int __fill_x( x, y, xinc )
int x, y, xinc;
{
for ( ; x >= 0 && x < VGR_HRES; x += xinc )
if ( _search == VGR_GET( x, y ) )
{ VGR_SET( x, y, _color );
_set_cnt++;
if ( _y_ok )
{ if ( _search == VGR_GET(x,y-1) )
_up_cnt++;
if ( _search == VGR_GET(x,y+1) )
_dn_cnt++;
};
} else return x;
}