/*
 *	Vdi attribute funcs library interface
 *
 *		vswr_mode	set writing mode
 *		vs_color	set color index to rgb
 *		vsl_type	set polyline type
 *		vsl_udsty	set user defined line style
 *		vsl_width	set polyline width
 *		vsl_color	set polyline color index
 *		vsl_ends	set polyline end styles
 *		vsm_type	set polymarker type
 *		vsm_height	set polymarker height (in y coord units)
 *		vsm_color	set polymarker color index
 *		vst_height	set text height (baseline to top of char cell)
 *		vst_point	set char cell point size
 *		vst_rotation	set char baseline rot
 *		vst_font	set text face
 *		vst_color	set text color
 *		vst_effects	set text atribs
 *		vst_alignment	set text alignment
 *		vsf_interior	set fill interior style
 *		vsf_fill	set fill style (alias vsf_style)
 *		vsf_color	set fill color
 *		vsf_perimeter	set fill perimeter visibility
 *		vsf_udpat	set user defied fill pattern
 *
 *		    ++jrb	bammi@cadence.com
 *		    modified: mj -- ntomczak@vm.ucs.ualberta.ca
 *
 * 92/03/10 mmn -- Markus_Nick@mz.maus.de
 *		changed return type of vst_height from void to int
 *		because vst_height returns the selected height
 */
#include "common.h"

#ifdef __DEF_ALL__

#define L_vswr_mod
#define L_vs_color
#define L_vsl_type
#define L_vsl_udst
#define L_vsl_widt
#define L_vsl_colo
#define L_vsl_ends
#define L_vsm_type
#define L_vsm_heig
#define L_vsm_colo
#define L_vst_heig
#define L_vst_poin
#define L_vst_rota
#define L_vst_font
#define L_vst_colo
#define L_vst_effe
#define L_vst_alig
#define L_vsf_inte
#define L_vsf_fill 	/* synonymous to vsf_style */
#define L_vsf_colo
#define L_vsf_peri
#define L_vsf_udpa

#endif /* __DEF_ALL__ */


#ifdef L_vswr_mod

/* vswr_mode	set writing mode
 * returns writing mode
 */
int vswr_mode(int handle, int mode)
{
    _intin[0] = mode;
    __vdi__(VDI_CONTRL_ENCODE(32, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vswr_mod */

#ifdef L_vs_color

/* vs_color	set color index to rgb
 * returns void
 */
void vs_color(int handle, int index, int rgb[])
{
    _intin[0] = index;
    _intin[1] = rgb[0];
    _intin[2] = rgb[1];
    _intin[3] = rgb[2];

    __vdi__(VDI_CONTRL_ENCODE(14, 0, 4, 0), handle);
}
#endif /* L_vs_color */

#ifdef L_vsl_type

/* vsl_type	set polyline type
 * returns type selected
 */
int vsl_type(int handle, int style)
{
    _intin[0] = style;
    __vdi__(VDI_CONTRL_ENCODE(15, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsl_type */

#ifdef L_vsl_udst

/* vsl_udsty	set user defined line style
 * returns void
 */
void vsl_udsty(int handle, int pat)
{
    _intin[0] = pat;
    __vdi__(VDI_CONTRL_ENCODE(113, 0, 1, 0), handle);
}
#endif /* L_vsl_udst */

#ifdef L_vsl_widt

/* vsl_width	set polyline width
 * returns selected width in x-axis units
 */
int vsl_width(int handle, int width)
{
    _ptsin[0] = width;
    _ptsin[1] = 0;
    __vdi__(VDI_CONTRL_ENCODE(16, 1, 0, 0), handle);
    return (int)_ptsout[0];
}
#endif /* L_vsl_widt */

#ifdef L_vsl_colo

/* vsl_color	set polyline color index
 * returns setting
 */
int vsl_color(int handle, int index)
{
    _intin[0] = index;
    __vdi__(VDI_CONTRL_ENCODE(17, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsl_colo */

#ifdef L_vsl_ends

/* vsl_ends	set polyline end styles
 * returns void
 */
void vsl_ends(int handle, int begstyle, int endstyle)
{
    _intin[0] = begstyle;
    _intin[1] = endstyle;
    __vdi__(VDI_CONTRL_ENCODE(108, 0, 2, 0), handle);
}
#endif /* L_vsl_ends */

#ifdef L_vsm_type

/* vsm_type	set polymarker type
 * returns type selected
 */
int vsm_type(int handle, int symbol)
{
    _intin[0] = symbol;
    __vdi__(VDI_CONTRL_ENCODE(18, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsm_type */

#ifdef L_vsm_heig

/* vsm_height	set polymarker height (in y coord units)
 * returns void (height in _ptsout [0][1])
 */
void vsm_height(int handle, int height)
{
    _ptsin[0] = 0;
    _ptsin[1] = height;
    __vdi__(VDI_CONTRL_ENCODE(19, 1, 0, 0), handle);
}
#endif /* L_vsm_heig */

#ifdef L_vsm_colo

/* vsm_color	set polymarker color index
 * returns selected color
 */
int vsm_color(int handle, int index)
{
    _intin[0] = index;
    __vdi__(VDI_CONTRL_ENCODE(20, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsm_colo */

#ifdef L_vst_heig

/* vst_height	set text height (baseline to top of char cell)
 * returns void (char info args)
 */
int vst_height(int handle, int height,
		int *charw, int *charh, int *cellw, int *cellh)
{
    _ptsin[0] = 0;
    _ptsin[1] = height;
    __vdi__(VDI_CONTRL_ENCODE(12, 1, 0, 0), handle);
    
    *charw = _ptsout[0];
    *charh = _ptsout[1];
    *cellw = _ptsout[2];
    *cellh = _ptsout[3];

    return (int)_intout[0];		/* mmn */
}    
#endif /* L_vst_heig */

#ifdef L_vst_poin

/* vst_point	set char cell point size
 * returns selected cell height in points (and info in args)
 */
int vst_point(int handle, int point,
		int *charw, int *charh, int *cellw, int *cellh)
{
    _intin[0] = point;
    __vdi__(VDI_CONTRL_ENCODE(107, 0, 1, 0), handle);
    
    *charw = _ptsout[0];
    *charh = _ptsout[1];
    *cellw = _ptsout[2];
    *cellh = _ptsout[3];

    return (int)_intout[0];
}    
#endif /* L_vst_poin */

#ifdef L_vst_rota

/* vst_rotation	set char baseline rot
 * returns angle selected
 */
int vst_rotation(int handle, int ang)
{
    _intin[0] = ang;
    __vdi__(VDI_CONTRL_ENCODE(13, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vst_rota */

#ifdef L_vst_font

/* vst_font	set text face
 * returns face selected
 */
int vst_font(int handle, int font)
{
    _intin[0] = font;
    __vdi__(VDI_CONTRL_ENCODE(21, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vst_font */

#ifdef L_vst_colo

/* vst_color	set text color
 * returns selected color
 */
int vst_color(int handle, int index)
{
    _intin[0] = index;
    __vdi__(VDI_CONTRL_ENCODE(22, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vst_colo */

#ifdef L_vst_effe

/* vst_effects	set text atribs
 * returns style actually selected
 */
int vst_effects(int handle, int effects)
{
    _intin[0] = effects;
    __vdi__(VDI_CONTRL_ENCODE(106, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vst_effe */


#ifdef L_vst_alig

/* vst_alignment	set text alignment
 * returns void (results in args)
 */
void vst_alignment(int handle, int hin, int vin,
		   int *hout, int *vout)
{
    _intin[0] = hin;
    _intin[1] = vin;
    __vdi__(VDI_CONTRL_ENCODE(39, 0, 2, 0), handle);
    
    *hout = _intout[0];
    *vout = _intout[1];
}
#endif /* L_vst_alig */

#ifdef L_vsf_inte

/* vsf_interior	set fill interior style
 * returns style selected
 */
int vsf_interior(int handle, int style)
{
    _intin[0] = style;
    __vdi__(VDI_CONTRL_ENCODE(23, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsf_inte */

#ifdef L_vsf_fill

/* vsf_fill	set fill style
 * returns style selected
 */
__asm__(".stabs \"_vsf_style\",5,0,0,_vsf_fill"); /* dept of clean tricks */
int vsf_fill(int handle, int style)
{
    _intin[0] = style;
    __vdi__(VDI_CONTRL_ENCODE(24, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsf_fill */

#ifdef L_vsf_colo

/* vsf_color	set fill color
 * returns color index selected
 */
int vsf_color(int handle, int index)
{
    _intin[0] = index;
    __vdi__(VDI_CONTRL_ENCODE(25, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsf_colo */

#ifdef L_vsf_peri

/* vsf_perimeter	set fill perimeter visibility
 * returns visibility
 */
int vsf_perimeter(int handle, int vis)
{
    _intin[0] = vis;
    __vdi__(VDI_CONTRL_ENCODE(104, 0, 1, 0), handle);
    return (int)_intout[0];
}
#endif /* L_vsf_peri */

#ifdef L_vsf_udpa

/* vsf_udpat	set user defined fill pattern
 * returns void
 */
void vsf_udpat(int handle, int pat[], int planes)
{
#ifndef __MSHORT__

    register int i, j;
    
    j = planes << 4;
    for(i = 0; i < j; i++)
	_intin[i] = pat[i];
    __vdi__(VDI_CONTRL_ENCODE(112, 0, j, 0), handle);
#else
    _vdiparams[1] = &pat[0];
    __vdi__(VDI_CONTRL_ENCODE(112, 0, (planes << 4), 0), handle);
    _vdiparams[1] = (void *)&_intin[0];
#endif
}
#endif /* L_vsf_udpa */

/* -eof- */
