home *** CD-ROM | disk | FTP | other *** search
- /* 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;
- }
-
-
-