[net.micro.atari16] ProGEM part 5 of 6

bammi@cwruecmp.UUCP (Jwahar R. Bammi) (03/22/86)

#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	apndx5.prf
#	apndx6.prf
#	apndx7.prf
#	apndx8.prf
# This archive created: Fri Mar 21 22:40:59 1986
# By:	Jwahar R. Bammi ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'apndx5.prf'" '(5475 characters)'
if test -f 'apndx5.prf'
then
	echo shar: over-writing existing file "'apndx5.prf'"
fi
sed 's/^X//' << \SHAR_EOF > 'apndx5.prf'
X.!****************************************************************************
X.! 
X.! ANTIC PUBLISHING INC., COPYRIGHT 1985.  REPRINTED BY PERMISSION.
X.!
X.! ** Professional GEM ** by Tim Oren
X.!
X.! Proff File by ST enthusiasts at
X.! Case Western Reserve University
X.! Cleveland, Ohio
X.! uucp : decvax!cwruecmp!bammi
X.! csnet: bammi@case
X.! arpa : bammi%case@csnet-relay
X.! compuserve: 71515,155
X.!
X.!****************************************************************************
X.!
X.!			Begin Appendix 5
X.!
X.!***************************************************************************
X.!
X.!
X.AP V Sample Code for Part VI
X/* >>>>>>>>>>>>>>>>>>>>>>>>>>> MFDB Structure <<<<<<<<<<<<<<<<<<<<<<<<<< */
X					/* Memory Form Definition Block */
Xtypedef struct fdbstr
X{
X	long		fd_addr;	/* Form address			*/
X	int		fd_w;		/* Form width in pixels		*/
X	int		fd_h;		/* Form height in pixels	*/
X	int		fd_wdwidth;	/* Form width in memory words	*/
X	int		fd_stand;	/* Standard form flag		*/
X	int		fd_nplanes;	/* Number of color planes	*/
X	int		fd_r1;		/* Dummy locations:		*/
X	int		fd_r2;		/* Reserved for future use	*/
X	int		fd_r3;
X} MFDB;
X.bp
X/* >>>>>>>>>>>>>>>>>>>> Resource Transform Utilities <<<<<<<<<<<<<<<<<< */
X/*------------------------------*/
X/*	vdi_fix			*/
X/*------------------------------*/
XVOID
Xvdi_fix(pfd, theaddr, wb, h)		/* This routine loads the MFDB */
X	MFDB		*pfd;		/* Input values are the MFDB's */
X	LONG		theaddr;	/* address, the form's address,*/
X	WORD		wb, h;		/* the form's width in bytes,  */
X	{				/* and the height in pixels    */
X	pfd->fww = wb >> 1;
X	pfd->fwp = wb << 3;
X	pfd->fh = h;
X	pfd->np = 1;			/* Monochrome assumed	       */
X	pfd->mp = theaddr;
X	}
X
X/*------------------------------*/
X/*	vdi_trans		*/
X/*------------------------------*/
XWORD
Xvdi_trans(saddr, swb, daddr, dwb, h) 	/* Transform the standard form */
X	LONG		saddr;		/* pointed at by saddr and     */
X	UWORD		swb;		/* store in the form at daddr  */
X	LONG		daddr;		/* Byte widths and pixel height*/
X	UWORD		dwb;		/* are given		       */
X	UWORD		h;
X	{
X	MFDB		src, dst;	/* These are on-the-fly MFDBs  */
X
X	vdi_fix(&src, saddr, swb, h);	/* Load the source MFDB	       */
X	src.ff = TRUE;			/* Set it's std form flag      */
X
X	vdi_fix(&dst, daddr, dwb, h);	/* Load the destination MFDB   */
X	dst.ff = FALSE;			/* Clear the std flag	       */
X	vr_trnfm(vdi_handle, &src, &dst );	/* Call the VDI	       */
X	}
X
X/*------------------------------*/
X/*	trans_bitblk		*/
X/*------------------------------*/
XVOID
Xtrans_bitblk(obspec)			/* Transform the image belonging */
X	LONG	obspec;			/* to the bitblk pointed to by   */
X	{				/* obspec.  This routine may also*/
X	LONG	taddr;			/* be used with free images	 */
X	WORD	wb, hl;
X
X	if ( (taddr = LLGET(BI_PDATA(obspec))) == -1L)
X		return;			/* Get and validate image address */
X	wb = LWGET(BI_WB(obspec));	/* Extract image dimensions	  */
X	hl = LWGET(BI_HL(obspec));
X	vdi_trans(taddr, wb, taddr, wb, hl);	/* Perform a transform	  */
X	}					/* in place		  */
X
X/*------------------------------*/
X/*	trans_obj		*/
X/*------------------------------*/
XVOID
Xtrans_obj(tree, obj)			/* Examine the input object.  If  */
X	LONG	tree;			/* it is an icon or image, trans- */
X	WORD	obj;			/* form the associated raster	  */
X	{				/* forms in place.		  */
X	WORD	type, wb, hl;		/* This routine may be used with  */
X	LONG	taddr, obspec;		/* map_tree() to transform an     */
X					/* entire resource tree		  */
X
X	type = LLOBT(LWGET(OB_TYPE(obj)));		/* Load object type */
X	if ( (obspec = LLGET(OB_SPEC(obj))) == -1L)	/* Load and check   */
X		return (TRUE);				/* ob_spec pointer  */
X	switch (type) {
X		case G_IMAGE:
X			trans_bitblk(obspec);		/* Transform image  */
X			return (TRUE);
X		case G_ICON:				/* Load icon size   */
X			hl = LWGET(IB_HICON(obspec));
X			wb = (LWGET(IB_WICON(obspec)) + 7) >> 3;
X							/* Transform data   */
X			if ( (taddr = LLGET(IB_PDATA(obspec))) != -1L)
X				vdi_trans(taddr, wb, taddr, wb, hl);
X							/* Transform mask   */
X			if ( (taddr = LLGET(IB_PMASK(obspec))) != -1L)
X				vdi_trans(taddr, wb, taddr, wb, hl);
X			return (TRUE);
X		default:
X			return (TRUE);
X		}
X	}
X.bp
X/* >>>>>>>>>>>>>>>>  Macro definitions for the code above <<<<<<<<<<<<<<< */
X
X#define BI_PDATA(x)	(x)
X#define BI_WB(x)	(x + 4)
X#define BI_HL(x)	(x + 6)
X#define OB_TYPE(x) 	(tree + (x) * sizeof(OBJECT) + 6)
X#define OB_SPEC(x) 	(tree + (x) * sizeof(OBJECT) + 12)
X#define IB_PMASK(x)	(x)
X#define IB_PDATA(x)	(x + 4)
X#define IB_WICON(x)	(x + 22)
X#define IB_HICON(x)	(x + 24)
X.bp
X/* >>>>>>>>>>>>>>>>>>>>>>>> VDI Copy Mode Table <<<<<<<<<<<<<<<<<<<<<<<<< */
X
XSymbols: N = new destination pixel value (0 or 1)
X	 D = old destination pixel value (0 or 1)
X	 S = source pixel value (0 or 1)
X	 ~ = Boolean not (inversion)
X	 & = Boolean and
X	 | = Boolean or
X	 ^ = Boolean xor (exclusive-or)
X
XMode Number	Action
X----------	------
X    0		N = 0		(USE V_BAR INSTEAD)
X    1		N = S & D
X    2		N = S & ~D
X    3		N = S		(REPLACE)
X    4		N = ~S & D	(ERASE)
X    5		N = D		(USELESS)
X    6		N = S ^ D	(XOR)
X    7		N = S | D	(TRANSPARENT)
X    8		N = ~ (S | D)
X    9		N = ~ (S ^ D)
X   10		N = ~D		(USE V_BAR INSTEAD)
X   11		N = S | ~D
X   12		N = ~S
X   13		N = ~S | D	(REVERSE TRANSPARENT)
X   14		N = ~ (S & D)
X   15		N = 1		(USE V_BAR INSTEAD)
X
X/* >>>>>>>>>>>>>>>>>>>>>>>> END OF DOWNLOAD <<<<<<<<<<<<<<<<<<<<<<<<<< */
X.!
X.!****************************************************************************
X.!
X.!			End Appendix 5
X.!
X.!****************************************************************************
SHAR_EOF
if test 5475 -ne "`wc -c 'apndx5.prf'`"
then
	echo shar: error transmitting "'apndx5.prf'" '(should have been 5475 characters)'
fi
echo shar: extracting "'apndx6.prf'" '(5246 characters)'
if test -f 'apndx6.prf'
then
	echo shar: over-writing existing file "'apndx6.prf'"
fi
sed 's/^X//' << \SHAR_EOF > 'apndx6.prf'
X.!****************************************************************************
X.! 
X.! ANTIC PUBLISHING INC., COPYRIGHT 1985.  REPRINTED BY PERMISSION.
X.!
X.! ** Professional GEM ** by Tim Oren
X.!
X.! Proff File by ST enthusiasts at
X.! Case Western Reserve University
X.! Cleveland, Ohio
X.! uucp : decvax!cwruecmp!bammi
X.! csnet: bammi@case
X.! arpa : bammi%case@csnet-relay
X.! compuserve: 71515,155
X.!
X.!****************************************************************************
X.!
X.!			Begin Appendix 6
X.!
X.!***************************************************************************
X.!
X.!
X.AP VI Sample Code for Part VII 
X/*
X>>>>>>>>>>>>>>>>>>>>>> Download file for GEM column #7 <<<<<<<<<<<<<<<<<<<<<
X>>>>>>>>>>>>>>>>>>>>>>>>>>>> Sample Menu Tree <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X*/
X
X-1, 1, 6, G_IBOX, NONE, NORMAL, 0x0L, 0,0, 80,25,	/* ROOT */
X6, 2, 2, G_BOX, NONE, NORMAL, 0x1100L, 0,0, 80,513,	/* THE BAR */
X1, 3, 5, G_IBOX, NONE, NORMAL, 0x0L, 2,0, 20,769,	/* THE ACTIVE */
X4, -1, -1, G_TITLE, NONE, NORMAL, 0x0L, 0,0, 6,769,	/* Title #1 */
X5, -1, -1, G_TITLE, NONE, NORMAL, 0x1L, 6,0, 6,769,	/* Title #2 */
X2, -1, -1, G_TITLE, NONE, NORMAL, 0x2L, 12,0, 8,769,	/* Title #3 */
X0, 7, 22, G_IBOX, NONE, NORMAL, 0x0L, 0,769, 80,19,	/* THE SCREEN */
X16, 8, 15, G_BOX, NONE, NORMAL, 0xFF1100L, 2,0, 20,8,	/* Drop-down #1 */
X9, -1, -1, G_STRING, NONE, NORMAL, 0x3L, 0,0, 19,1,	/* About... entry */
X10, -1, -1, G_STRING, NONE, DISABLED, 0x4L, 0,1, 20,1,
X11, -1, -1, G_STRING, NONE, NORMAL, 0x5L, 0,2, 20,1,	/* Desk acc entries */
X12, -1, -1, G_STRING, NONE, NORMAL, 0x6L, 0,3, 20,1,
X13, -1, -1, G_STRING, NONE, NORMAL, 0x7L, 0,4, 20,1,
X14, -1, -1, G_STRING, NONE, NORMAL, 0x8L, 0,5, 20,1,
X15, -1, -1, G_STRING, NONE, NORMAL, 0x9L, 0,6, 20,1,
X7, -1, -1, G_STRING, NONE, NORMAL, 0xAL, 0,7, 20,1,
X22, 17, 21, G_BOX, NONE, NORMAL, 0xFF1100L, 8,0, 13,5,	/* Drop-down #2 */
X18, -1, -1, G_STRING, NONE, NORMAL, 0xBL, 0,0, 13,1,
X19, -1, -1, G_STRING, NONE, DISABLED, 0xCL, 0,1, 13,1,
X20, -1, -1, G_STRING, NONE, NORMAL, 0xDL, 0,4, 13,1,
X21, -1, -1, G_STRING, NONE, NORMAL, 0xEL, 0,2, 13,1,
X16, -1, -1, G_STRING, NONE, DISABLED, 0xFL, 0,3, 13,1,
X6, 23, 25, G_BOX, NONE, NORMAL, 0xFF1100L, 14,0, 26,3,	/* Drop down #3 */
X24, -1, -1, G_STRING, NONE, NORMAL, 0x10L, 0,2, 26,1,
X25, -1, -1, G_STRING, NONE, NORMAL, 0x11L, 0,0, 26,1,
X22, -1, -1, G_STRING, LASTOB, DISABLED, 0x12L, 0,1, 26,1
X.bp
X/*
X>>>>>>>>>>>>>>>>>>>>>>>> Menu enable/disable utility <<<<<<<<<<<<<<<<<<<<<<
X*/
X
X/*------------------------------*/
X/*	undo_obj		*/
X/*------------------------------*/
X	VOID
Xundo_obj(tree, which, bit)
X	LONG	tree;
X	WORD	which;
X	UWORD	bit;
X	{
X	WORD	state;
X
X	state = LWGET(OB_STATE(which));
X	LWSET(OB_STATE(which), state & ~bit);
X	}
X
X/*------------------------------*/
X/*	enab_obj		*/
X/*------------------------------*/
X	WORD
Xenab_obj(tree, which)
X	LONG	tree;
X	WORD	which;
X	{
X	undo_obj(tree, which, (UWORD) DISABLED);
X	return (TRUE);
X	}
X
X/*------------------------------*/
X/*	do_obj  		*/
X/*------------------------------*/
X	VOID
Xdo_obj(tree, which, bit)
X	LONG	tree;
X	WORD	which;
X	UWORD	bit;
X	{
X	WORD	state;
X
X	state = LWGET(OB_STATE(which));
X	LWSET(OB_STATE(which), state | bit);
X	}
X
X/*------------------------------*/
X/*	disab_obj		*/
X/*------------------------------*/
X	WORD
Xdisab_obj(tree, which)
X	LONG	tree;
X	WORD	which;
X	{
X	do_obj(tree, which, (UWORD) DISABLED);
X	return (TRUE);
X	}
X
X/*------------------------------*/
X/*	set_menu		*/
X/*------------------------------*/
X	VOID
Xset_menu(tree, change)			/* change[0] TRUE selects all entries*/
X	LONG	tree;			/* FALSE deselects all.  Change list */
X	WORD	*change;		/* of items is then toggled.	     */
X	{
X	WORD	dflt, screen, drop, obj;
X
X	dflt = *change++;			/* What is default?   */
X	screen = LWGET(OB_TAIL(ROOT));		/* Get SCREEN 	      */
X	drop = LWGET(OB_HEAD(screen));		/* Get DESK drop-down */
X						/* and skip it        */
X	for (; (drop = LWGET(OB_NEXT(drop))) != screen; )
X		{
X		obj = LWGET(OB_HEAD(drop));
X		if (obj != NIL)
X		if (dflt)
X			map_tree(tree, obj, drop, enab_obj);
X		else
X			map_tree(tree, obj, drop, disab_obj);
X		}
X
X	for (; *change; change++)
X		if (dflt)
X			disab_obj(tree, *change);
X		else
X			enab_obj(tree, *change);
X	}
X.bp
X/*
X>>>>>>>>>>>>>>>>>>>>> Definitions used in this article <<<<<<<<<<<<<<<<<<<<<<
X*/
X
X#define ROOT 0
X
X#define G_IBOX    25
X#define G_STRING  28
X#define G_TITLE   32
X
X#define R_TREE     0
X
X#define MN_SELECTED 10
X
X#define CHECKED   0x4
X#define DISABLED  0x8
X
X#define OB_NEXT(x) (tree + (x) * sizeof(OBJECT) + 0)
X#define OB_HEAD(x) (tree + (x) * sizeof(OBJECT) + 2)
X#define OB_TAIL(x) (tree + (x) * sizeof(OBJECT) + 4)
X#define OB_TYPE(x) (tree + (x) * sizeof(OBJECT) + 6)
X#define OB_FLAGS(x) (tree + (x) * sizeof(OBJECT) + 8)
X#define OB_STATE(x) (tree + (x) * sizeof(OBJECT) + 10)
X#define OB_SPEC(x) (tree + (x) * sizeof(OBJECT) + 12)
X#define OB_X(x) (tree + (x) * sizeof(OBJECT) + 16)
X#define OB_Y(x) (tree + (x) * sizeof(OBJECT) + 18)
X#define OB_WIDTH(x) (tree + (x) * sizeof(OBJECT) + 20)
X#define OB_HEIGHT(x) (tree + (x) * sizeof(OBJECT) + 22)
X
X#define M_OFF     256
X#define M_ON      257
X.!
X.!****************************************************************************
X.!
X.!			End Appendix 6
X.!
X.!****************************************************************************
SHAR_EOF
if test 5246 -ne "`wc -c 'apndx6.prf'`"
then
	echo shar: error transmitting "'apndx6.prf'" '(should have been 5246 characters)'
fi
echo shar: extracting "'apndx7.prf'" '(3278 characters)'
if test -f 'apndx7.prf'
then
	echo shar: over-writing existing file "'apndx7.prf'"
fi
sed 's/^X//' << \SHAR_EOF > 'apndx7.prf'
X.!****************************************************************************
X.! 
X.! ANTIC PUBLISHING INC., COPYRIGHT 1985.  REPRINTED BY PERMISSION.
X.!
X.! ** Professional GEM ** by Tim Oren
X.!
X.! Proff File by ST enthusiasts at
X.! Case Western Reserve University
X.! Cleveland, Ohio
X.! uucp : decvax!cwruecmp!bammi
X.! csnet: bammi@case
X.! arpa : bammi%case@csnet-relay
X.! compuserve: 71515,155
X.!
X.!****************************************************************************
X.!
X.!			Begin Appendix 7
X.!
X.!***************************************************************************
X.!
X.!
X.AP VII Sample Code for Part IX
X/*
X>>>>>>>>>>>>>>>> Routines to set clip to a GRECT <<<<<<<<<<<<<<<<
X*/
X
X        VOID
Xgrect_to_array(area, array)     /* convert x,y,w,h to upr lt x,y and    */
X        GRECT   *area;          /*                    lwr rt x,y        */
X        WORD    *array;
X        {
X        *array++ = area->g_x;
X        *array++ = area->g_y;
X        *array++ = area->g_x + area->g_w - 1;
X        *array = area->g_y + area->g_h - 1;
X        }
X
X        VOID
Xset_clip(clip_flag, s_area)     /* set clip to specified area           */
X        WORD    clip_flag;
X        GRECT   *s_area;
X        {
X        WORD    pxy[4];
X
X        grect_to_array(s_area, pxy);
X        vs_clip(vdi_handle, clip_flag, pxy);
X        }
X.bp
X/*
X>>>>>>>>>> Routines to set attributes before output <<<<<<<<<<<<
X*/
X        VOID
Xrr_perim(mode, color, type, width, pxy)      /* Draw a rounded    */
X        WORD    mode, color, width, *pxy;    /* rectangle outline */
X        {
X        vswr_mode(vdi_handle, mode);
X        vsl_color(vdi_handle, color);
X        vsl_type(vdi_handle, type);
X        vsl_width(vdi_handle, width);
X        v_rbox(vdi_handle, pxy);
X        vswr_mode(vdi_handle, MD_REPLACE);
X        }
X
X        VOID
Xpl_perim(mode, type, color, width, npts, pxy)     /* Draw a polygonal */
X                                                  /* figure           */
X        WORD    mode, type, color, width, npts, *pxy;
X        {
X        vswr_mode(vdi_handle, mode);
X        vsl_type(vdi_handle, type);
X        vsl_color(vdi_handle, color);
X        vsl_width(vdi_handle, width);
X        v_pline(vdi_handle, npts, pxy);
X        }
X
X        VOID                  /* Draw a filled polygonal area */
Xpl_fill(mode, perim, color, interior, style, npts, pxy)
X        WORD    mode, perim, color, interior, style, npts, *pxy;
X        {
X        vswr_mode(vdi_handle, mode);
X        vsf_color(vdi_handle, color);
X        vsf_style(vdi_handle, style);
X        vsf_interior(vdi_handle, interior);
X        vsf_perimeter(vdi_handle, perim);
X        v_fillarea(vdi_handle, npts, pxy);
X        }
X
X        VOID                  /* Draw a filled rectangle    */
Xrect_fill(mode, perim, color, interior, style, pxy)
X        WORD    mode, perim, color, style, interior, *pxy;
X        {
X        vswr_mode(vdi_handle, mode);
X        vsf_color(vdi_handle, color);
X        vsf_style(vdi_handle, style);
X        vsf_interior(vdi_handle, interior);
X        vsf_perimeter(vdi_handle, perim);
X        vr_recfl(vdi_handle, pxy);
X        }
X.!
X.!****************************************************************************
X.!
X.!			End Appendix 7
X.!
X.!****************************************************************************
SHAR_EOF
if test 3278 -ne "`wc -c 'apndx7.prf'`"
then
	echo shar: error transmitting "'apndx7.prf'" '(should have been 3278 characters)'
fi
echo shar: extracting "'apndx8.prf'" '(2151 characters)'
if test -f 'apndx8.prf'
then
	echo shar: over-writing existing file "'apndx8.prf'"
fi
sed 's/^X//' << \SHAR_EOF > 'apndx8.prf'
X.!****************************************************************************
X.! 
X.! ANTIC PUBLISHING INC., COPYRIGHT 1985.  REPRINTED BY PERMISSION.
X.!
X.! ** Professional GEM ** by Tim Oren
X.!
X.! Proff File by ST enthusiasts at
X.! Case Western Reserve University
X.! Cleveland, Ohio
X.! uucp : decvax!cwruecmp!bammi
X.! csnet: bammi@case
X.! arpa : bammi%case@csnet-relay
X.! compuserve: 71515,155
X.!
X.!****************************************************************************
X.!
X.!			Begin Appendix 8
X.!
X.!***************************************************************************
X.!
X.!
X.AP VIII Sample Code for Part X 
X/*
X>>>>>>>>>>> Demonstration of byte alignment of window interior <<<<<<<<<<<
X*/
X
X#define FEATURES    0x0fef	/* what border features are used   */
XWORD	msg[8];			/* message from evnt_multi	   */
XGRECT	work_area;		/* defines working area 	   */
XWORD	w_hndl;			/* handle for window being changed */
X
X	wind_calc(1, FEATURES, msg[4], msg[5], msg[6], msg[7], 
X		&work_area.g_x, &work_area.g_y, &work_area.g_w, 
X		&work_area.g_h);
X	work_area.g_x = align_x(work_area.g_x);
X	work_area.g_w = align_x(work_area.g_w);
X	wind_calc(0, FEATURES, work_area.g_x, work_area.g_y, 
X		work_area.g_w, work_area.g_h, &msg[4], &msg[5], 
X		&msg[6], &msg[7]); 
X	wind_set(w_hndl, WF_CXYWH, msg[4], msg[5], msg[6], msg[7]);
X.bp
X/*
X>>>>>>>>>>>>>>>>>>>>> Subroutine for above <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
X*/
X	WORD
Xalign_x(x)		/* forces word alignment for column position	*/
X	WORD	x;		/*   rounding to nearest word		*/
X	{
X	return((x & 0xfff0) + ((x & 0x0008) ? 0x0010 : 0));
X	}	
X.bp
X/*
X>>>>>>>>>>>>>>>>>>>>> Standard v_gtext binding <<<<<<<<<<<<<<<<<<<<<<<<<
X*/
X	WORD
Xv_gtext( handle, x, y, string)
X	WORD handle, x, y;
X	BYTE *string;
X	{
X	WORD i;
X	ptsin[0] = x;
X	ptsin[1] = y;
X	i = 0;
X	while (intin[i++] = *string++)	/* Copy characters to intin    */
X		;			/* There is NO error checking! */
X	contrl[0] = 8;
X	contrl[1] = 1;
X	contrl[3] = --i;
X	contrl[6] = handle;
X	vdi();
X	}
X.!
X.!****************************************************************************
X.!
X.!			End Appendix 8
X.!
X.!****************************************************************************
SHAR_EOF
if test 2151 -ne "`wc -c 'apndx8.prf'`"
then
	echo shar: error transmitting "'apndx8.prf'" '(should have been 2151 characters)'
fi
#	End of shell archive
exit 0

-- 
					Jwahar R. Bammi
			       Usenet:  .....!decvax!cwruecmp!bammi
			        CSnet:  bammi@case
				 Arpa:  bammi%case@csnet-relay
			   CompuServe:  71515,155