/*********************************************************/
/*																		 	*/
/*						 	 Demo-Quelltext fr						*/
/*							die Bearbeitung von						*/
/*							 Off-Screen-Bitmaps						*/
/*																			*/
/*********************************************************/
/* sb */
/* 28.04.93 */

/* Includes */
#include <portab.h>
#include <vdi.h>
#include <aes.h>
#include <tos.h>
#include	<eddilib.h>

/* Funktionsprototypen */
WORD	open_vwk( WORD *work_out );
WORD	open_bitmap( WORD x, WORD y, MFDB *bitmap, WORD *work_out );
void	clip_screen( void );		
void	clip_bitmap( void );		
void	draw( void );

/* Globale Variablen */
WORD  s_handle,
		b_handle,
		screen_out[128],
		bitmap_out[128];
MFDB	bitmap,
		screen;

/* virtuelle Workstation ”ffnen */
WORD	open_vwk( WORD *work_out )
{
	WORD	count,
			dummy,
			handle,
			work_in[11];

	handle = graf_handle( &dummy, &dummy, &dummy, &dummy );

	for( count = 1; count < 10; count++ )
		work_in[count] = 1;

	work_in[0] = Getrez()+2; 
	work_in[10] = 2;								/* Rasterkoordinaten */

	v_opnvwk( work_in, &handle, work_out );

	return( handle );
}

/* Clipping fr den Bildschirm setzen */
void	clip_screen( void )		
{
	WORD	xyarr[4];
	
	xyarr[0] = 0;
	xyarr[1] = 0;
	xyarr[2] = screen_out[0];
	xyarr[3] = screen_out[1];
	vs_clip( s_handle, 1, xyarr );	/* Clipping fr den Bildschirm */
}

/* Clipping fr die Bitmap setzen */
void	clip_bitmap( void )		
{
	WORD	xyarr[4];
	
	xyarr[0] = 0;
	xyarr[1] = 0;
	xyarr[2] = bitmap_out[0];
	xyarr[3] = bitmap_out[1];
	vs_clip( b_handle, 1, xyarr );	/* Clipping fr den Bildschirm */
}

/* Auf der Off-Screen-Bitmap zeichnen */
void	draw( void )
{
	BYTE	bezarr[512];
	WORD	xyarr[512],
			extent[4],
			actual,
			totpts,
			totmoves;

	vsf_color( b_handle, 3 );
	vsf_interior( b_handle, 2 ); 
	vsf_style( b_handle, 1 );
	vsf_perimeter( b_handle, 1 );
	vswr_mode( b_handle, 1 );
	
	xyarr[0] = 0;
	xyarr[1] = 0;
	xyarr[2] = 250;
	xyarr[3] = 250;
	v_bar( b_handle, xyarr );
	
	vsf_color( b_handle, 1 );
	vsf_style( b_handle, 3 );
	v_bez_on( b_handle );
	v_bez_qual( b_handle, 100, &actual );
	
	xyarr[0] = 100;
	xyarr[1] = 100;
	xyarr[2] = 400;
	xyarr[3] = 100;
	xyarr[4] = 400;
	xyarr[5] = 400;
	xyarr[6] = 100;
	xyarr[7] = 400;
	
	xyarr[8] = 200;
	xyarr[9] = 200;
	xyarr[10] = 300;
	xyarr[11] = 200;
	xyarr[12] = 300;
	xyarr[13] = 300;
	xyarr[14] = 200;
	xyarr[15] = 300;

	bezarr[0] = 1;
	bezarr[1] = 0;
	bezarr[2] = 0;
	bezarr[3] = 0;
	bezarr[4] = 3;
	bezarr[5] = 0;
	bezarr[6] = 0;
	bezarr[7] = 0;
	 
	v_bez_off( b_handle );
	
	v_gtext( b_handle, 50, 50, "Text!" );
}

main()
{
	WORD	xyarr[8];
	
	if (( s_handle = open_vwk( screen_out )) != 0 )
	{
		bitmap.fd_addr = 0;						/* VDI alloziert Bitmap */
		bitmap.fd_nplanes = 0;					/* Planeanzahl wie Bildschirm */
		if (( b_handle = open_bitmap( 799, 607, &bitmap, bitmap_out)) != 0 )
		{
			clip_screen();							/* Clipping fr den Bildschirm setzen */
			clip_bitmap();							/* Clipping fr die Bitmap setzen */
			draw();									/* auf der Off-Screen-Bitmap zeichnen */

			/* und jetzt die Bitmap auf den Bildschirm kopieren... */
			screen.fd_addr = 0;
			xyarr[0] = 0;
			xyarr[1] = 0;
			xyarr[2] = 799;
			xyarr[3] = 607;
			xyarr[4] = 100;
			xyarr[5] = 100;
			xyarr[6] = 899;
			xyarr[7] = 707;
			vro_cpyfm( s_handle, S_ONLY, xyarr, &bitmap, &screen );
	
			v_clsbm( b_handle );					/* Bitmap schliežen */
		}
		v_clsvwk( s_handle );					/* virtuelle Workstation schliežen */
	} 
	return(0);	
}