/*
 *	Vdi inquiry funcs library interface
 *
 *		vq_extnd	extended inquire
 *		vq_color	inquire color rep.
 *		vql_attribute	inquire polyline attribute
 *		vqm_attributes	inquire polymarker atribs
 *		vqf_attributes	inquire fill area atribs
 *		vqt_attributes	inquire text atribs
 *		vqt_extent	inquire text extent
 *		vqt_width	inquire char cell width
 *		vqt_name	inquire face name
 *		vq_cellarray	inquire cell array
 *		vqin_mode	inquire input mode
 *		vqt_fontinfo	get font info
 *
 *			++jrb	bammi@cadence.com
 *			modified: mj -- ntomczak@vm.ucs.ualberta.ca
 *
 */
/*
 *	Note that at this moment (Sept. 91) Atari modified vqt_name()
 *	interface and a string returned from it has a length 33 with
 *	the 33rd byte serving as a flag.  This should not matter if
 *	your program was allocating this extra byte anyway for a
 *	terminating null, but it may kill you if this space was tight!
 *	THIS IS NOT OFFICIAL yet and it may change!!!
 *
 *******
 *
 *		This is official now (jan 93 SpeedoGDOS docs from atari).
 *		To quote the doc "A new parameter has been added to this function.
 *		It is a flag that indicates whether or not the font in question is
 *		an outline font or bitmap font.  The flag will be contained in
 *		intin[33]; 0 will signify a bitmap font, and 1 will indicate an
 *		outline font."
 */

#include "common.h"

#ifdef __DEF_ALL__

#define L_vq_extnd
#define L_vq_color
#define L_vql_attr
#define L_vqm_attr
#define L_vqf_attr
#define L_vqt_attr
#define L_vqt_exte
#define L_vqt_widt
#define L_vqt_name
#define L_vq_cella
#define L_vqin_mod
#define L_vqt_font

#endif /* __DEF_ALL__ */


#ifdef L_vq_extnd

/* vq_extnd extended inquire
 * returns void (results in args)
 */
void vq_extnd(int handle, int flag, int work_out[])
{
#ifndef __MSHORT__
	short *iptr;
	int   *wptr, *end;

	_intin[0] = flag;

	__vdi__(VDI_CONTRL_ENCODE(102, 0, 1, 0), handle);

	wptr = work_out;
	end = wptr + 45;
	iptr = _intout;
	do {
	*wptr++ = *iptr++;
	} while (wptr < end);
	end += 12;
	iptr = _ptsout;
	do {
	*wptr++ = *iptr++;
	} while (wptr < end);
#else
	_intin[0] = flag;

	_vdiparams[3] = &work_out[0];
	_vdiparams[4] = &work_out[45];
	__vdi__(VDI_CONTRL_ENCODE(102, 0, 1, 0), handle);
	_vdiparams[3] = &_intout[0];
	_vdiparams[4] = &_ptsout[0];

#endif	/* __MSHORT__ */
}
#endif /* L_vq_extnd */

#ifdef L_vq_color

/* vq_color inquire color rep.
 * returns index or -1 if index out of range
 */
int vq_color(int handle, int index, int flag, int rgb[])
{
	short *wptr;

	_intin[0] = index;
	_intin[1] = flag;

	__vdi__(VDI_CONTRL_ENCODE(26, 0, 2, 0), handle);

	wptr = &_intout[1];
	*rgb++ = *wptr++;
	*rgb++ = *wptr++;
	*rgb   = *wptr;

	return (int)_intout[0];
}
#endif /* L_vq_color */


#ifdef L_vql_attr

/* vql_attribute	inquire polyline attribute
 * returns void (results in arg)
 */
void vql_attribute(int handle, int atrib[])
{
	short *wptr;

	__vdi__(VDI_CONTRL_ENCODE(35, 0, 0, 0), handle);

	wptr = &_intout[0];
	*atrib++ = *wptr++;
	*atrib++ = *wptr++;
	*atrib++ = *wptr;
	*atrib = _ptsout[0];
}
#endif /* L_vql_attr */

#ifdef L_vqm_attr

/* vqm_attributes	inquire polymarker atribs
 * returns void (result in arg)
 */
void vqm_attributes(int handle, int atrib[])
{
	short *wptr;

	__vdi__(VDI_CONTRL_ENCODE(36, 0, 0, 0), handle);

	wptr = &_intout[0];
	*atrib++ = *wptr++;
	*atrib++ = *wptr++;
	*atrib++ = *wptr;
	*atrib = _ptsout[1];
}
#endif /* L_vqm_attr */

#ifdef L_vqf_attr

/* vqf_attributes	inquire fill area atribs
 * returns void (result in arg)
 */
void vqf_attributes(int handle, int atrib[])
{
	short *wptr;

	__vdi__(VDI_CONTRL_ENCODE(37, 0, 0, 0), handle);

	wptr = &_intout[0];
	*atrib++ = *wptr++;
	*atrib++ = *wptr++;
	*atrib++ = *wptr++;
	*atrib++ = *wptr;
}
#endif /* L_vqf_attr */

#ifdef L_vqt_attr

/* vqt_attributes	inquire text atribs
 * reurns void (results in arg)
 */
void vqt_attributes(int handle, int atrib[])
{
#ifndef __MSHORT__
	short *wptr;
	int   *end;

	__vdi__(VDI_CONTRL_ENCODE(38, 0, 0, 0), handle);

	wptr = &_intout[0];
	end  = &atrib[6];
	do {
	*atrib++ = *wptr++;
	} while (atrib < end);
	wptr = &_ptsout[0];
	end += 4;
	do {
	*atrib++ = *wptr++;
	} while (atrib < end);
#else
	_vdiparams[3] = &atrib[0];
	_vdiparams[4] = &atrib[6];
	__vdi__(VDI_CONTRL_ENCODE(38, 0, 0, 0), handle);
	_vdiparams[3] = &_intout[0];
	_vdiparams[4] = &_ptsout[0];
#endif /* __MSHORT__ */
}
#endif /* L_vqt_attr */

#ifdef L_vqt_exte

/* vqt_extent	inquire text extent
 * returns void (result in arg)
 */
void vqt_extent(int handle, char *str, int extent[])
{
	unsigned char ch;
	short *ptr;
	int   *ept, *end;

	ptr = _intin;
	while ( ch = *str++)
	*ptr++ = ch;

	__vdi__(VDI_CONTRL_ENCODE(116, 0, (int)(ptr - _intin), 0), handle);

	ptr = _ptsout;
	ept = extent;
	end = ept + 8;
	do {
	*ept++ = *ptr++;
	} while (ept < end);
}
#endif /* L_vqt_exte */

#ifdef L_vqt_widt

/* vqt_width	inquire char cell width
 * returns status (and results in args)
 */
int vqt_width(int handle, int chr,
		  int *cw, int *ldelta, int *rdelta)
{
	_intin[0] = chr;

	__vdi__(VDI_CONTRL_ENCODE(117, 0, 1, 0), handle);

	*cw = _ptsout[0];
	*ldelta = _ptsout[2];
	*rdelta = _ptsout[4];

	return (int)_intout[0];
}
#endif /* L_vqt_widt */

#ifdef L_vqt_name

/* vqt_name inquire face name
 * returns index (name in arg)
 */
int vqt_name(int handle, int element, char *name)
{
	short *wptr, *end;

	_intin[0] = element;

	__vdi__(VDI_CONTRL_ENCODE(130, 0, 1, 0), handle);

	wptr = &_intout[1];
	end  = wptr + 33;		/* 32 string elements + flag */
	do {
	*name++ = *wptr++;
	} while (wptr < end);
	return (int)_intout[0];
}
#endif /* L_vqt_name */

#ifdef L_vq_cella

/* vq_cellarray 	inquire cell array
 * returns void (results in args)
 */
void vq_cellarray(int handle, int pxyarray[], int row_len, int nrows,
		  int *el_used, int *rows_used, int *status, int color[])
{
	short *end, *wptr = _ptsin;

	end = wptr + 4;
	do {
	*wptr++ = *pxyarray++;
	} while (wptr < end);
	_contrl[7] = row_len;
	_contrl[8] = nrows;

	__vdi__(VDI_CONTRL_ENCODE(27, 2, 0, 0), handle);

	wptr = _intout;
	end = wptr + (short) nrows * (short) row_len;
	while (wptr < end)
	*color++ = *wptr++;
	*el_used = _contrl[9];
	*rows_used = _contrl[10];
	*status    = _contrl[11];
}
#endif /* L_vq_cella */

#ifdef L_vqin_mod

/* vqin_mode	inquire input mode
 * returns void (desult in arg)
 */
void vqin_mode(int handle, int dev, int *mode)
{
	_intin[0] = dev;

	__vdi__(VDI_CONTRL_ENCODE(115, 0, 1, 0), handle);

	*mode = _intout[0];
}
#endif /* L_vqin_mod */

/* vqt_fontinfo (alias vqt_font_info)	get font info
 * returns void (results in args)
 */

#ifdef L_vqt_font

__asm__(".stabs \"_vqt_font_info\",5,0,0,_vqt_fontinfo");
					/* dept of clean tricks */
void vqt_fontinfo(int handle, int *minade, int *maxade, int distances[],
		  int *maxwidth, int effects[])
{
	short *wptr, *end;

	__vdi__(VDI_CONTRL_ENCODE(131, 0, 0, 0), handle);

	*minade = _intout[0];
	*maxade = _intout[1];

	wptr = _ptsout;
	*maxwidth = *wptr++;
	end = wptr + 6;
	do {
	*distances++ = *wptr++;
	*effects++	 = *wptr++;
	} while (wptr < end);
	*distances++ = *wptr;
	*distances	 = wptr[2];
}
#endif /* L_vqt_font */

/* -eof- */
