/*
 *	Vdi output functions library interface
 *
 *		v_pline 	polyline
 *		v_pmarker	draw markers
 *		v_gtext 	draw text
 *		v_fillarea	filled area
 *		v_cellarray draw array of rectangles
 *		v_contourfill	flood fill
 *		vr_recfl	fill rect
 *
 *			++jrb	bammi@cadence.com
 *			modified: mj -- ntomczak@vm.ucs.ualberta.ca
 */
#include "common.h"


#ifdef __DEF_ALL__

#define L_v_pline
#define L_v_pmarke
#define L_v_gtext
#define L_v_fillar
#define L_v_cellar
#define L_v_contou
#define L_vr_recfl

#endif /* __DEF_ALL__ */


#ifdef L_v_pline

/* v_pline	polyline
 *	returns void
 */
void v_pline(int handle, int count, int pxyarray[])
{
#ifdef __MSHORT__		/* we have 16 bit ints, just change vdi params */
	_vdiparams[2] = (void *) &pxyarray[0];
#else					/* 32 bit ints - let's copy */
	register short i;
	register short *pts = &_ptsin[0];
	register int   *pxy = &pxyarray[0];

	for(i = count; i != 0; i-- )
	{
		*pts++ = *pxy++;
		*pts++ = *pxy++;
	}
#endif

	__vdi__(VDI_CONTRL_ENCODE(6, count, 0, 0), handle);

#ifdef __MSHORT__
	_vdiparams[2] = (void *)&_ptsin[0]; /* restore vdi parameters */
#endif
}
#endif /* L_v_pline */


#ifdef L_v_pmarke

/* v_pmarker	draw markers
 *	returns void
 */
void v_pmarker(int handle, int count, int pxyarray[])
{
#ifdef __MSHORT__		/* we have 16 bit ints, just change vdi params */
	_vdiparams[2] = (void *) &pxyarray[0];
#else					/* 32 bit ints - let's copy */
	register short i;
	register short *pts = &_ptsin[0];
	register int   *pxy = &pxyarray[0];

	for(i = count; i != 0; i-- )
	{
		*pts++ = *pxy++;
		*pts++ = *pxy++;
	}
#endif

	__vdi__(VDI_CONTRL_ENCODE(7, count, 0, 0), handle);

#ifdef __MSHORT__
	_vdiparams[2] = (void *)&_ptsin[0]; /* restore vdi parameters */
#endif
}
#endif /* L_v_pmarke */


#ifdef L_v_gtext

/* v_gtext	draw text	(extra super slow -- don't ask me why)
 * returns void
 */
v_gtext(int handle, int x, int y, char *str)
{
	unsigned char	ch;
	short *ptr = _intin;

	_ptsin[0] = x;
	_ptsin[1] = y;
	while ( ch	= (unsigned char) *str++)
	*ptr++ = ch;

	__vdi__(VDI_CONTRL_ENCODE(8, 1, (int)(ptr - _intin), 0), handle);
}
#endif /* L_v_gtext */


#ifdef L_v_fillar

/* v_fillarea	filled area
 *	returns void
 */
void v_fillarea(int handle, int count, int pxyarray[])
{
#ifdef __MSHORT__		/* we have 16 bit ints, just change vdi params */
	_vdiparams[2] = (void *) &pxyarray[0];
#else					/* 32 bit ints - let's copy */
	register short i;
	register short *pts = &_ptsin[0];
	register int   *pxy = &pxyarray[0];

	for(i = count; i != 0; i-- )
	{
		*pts++ = *pxy++;
		*pts++ = *pxy++;
	}
#endif

	__vdi__(VDI_CONTRL_ENCODE(9, count, 0, 0), handle);

#ifdef __MSHORT__
	_vdiparams[2] = (void *)&_ptsin[0]; /* restore vdi parameters */
#endif
}
#endif /* L_v_fillar */


#ifdef L_v_cellar

/* v_cellarray	draw array of rectangles
 * returns void
 */
void v_cellarray(int handle, int pxyarray[], int row_length,
		 int elements, int nrows, int write_mode, int colarray[])
{
	short *wptr, *end;

	wptr = _ptsin;
	end  = wptr + 4;
	do {
	*wptr++ = *pxyarray++;
	} while (wptr < end);
	wptr = (short *)&_contrl[7];
	*wptr++ = row_length;
	*wptr++ = elements;
	*wptr++ = nrows;
	*wptr	= write_mode;

	wptr = _intin;
	end = wptr + (short)nrows * (short)elements;
	while (wptr < end)
	*wptr++ = *colarray++;

	__vdi__(VDI_CONTRL_ENCODE(10, 2, (int)(wptr - _intin), 0), handle);
}
#endif /* L_v_cellar */


#ifdef L_v_contou

/* v_contourfill flood fill from seed point to either dsp.edge or colr index
 * returns void
 */
void v_contourfill(int handle, int x, int y, int index)
{
	_ptsin[0] = x;
	_ptsin[1] = y;
	_intin[0] = index;
	__vdi__(VDI_CONTRL_ENCODE(103, 1, 1, 0), handle);
}
#endif /* L_v_contou */


#ifdef L_vr_recfl

/* vr_recfl fill rect
 * returns void
 */
void vr_recfl(int handle, int pxyarray[])
{
#ifdef __MSHORT__		/* we have 16 bit ints, just change vdi params */
	_vdiparams[2] = (void *) &pxyarray[0];
#else					/* 32 bit ints - let's copy */
	short *wptr = _ptsin;

	*wptr++ = *pxyarray++;
	*wptr++ = *pxyarray++;
	*wptr++ = *pxyarray++;
	*wptr =   *pxyarray;
#endif

	__vdi__(VDI_CONTRL_ENCODE(114, 2, 0, 0), handle);

#ifdef __MSHORT__
	_vdiparams[2] = (void *)&_ptsin[0]; /* restore vdi parameters */
#endif
}
#endif /* L_vr_recfl */

/* -eof- */
