[comp.sys.sgi] A big cursor?

gleicher@CS.CMU.EDU (Michael Gleicher) (12/25/90)

I will be videotaping my program, so I'd like to make things bigger so they
can be seen on the (poor quality) VHS tapesthat they ultimately will be dubbed
to. 
I can scale eveything in my program up a bit without much problem. I also
would like to make the cursor big too.

Defining a 32x32 bitmap cursor that looks like the standard arrow (except
bigger) shouldn't be that hard, just a hassle to draw all the little dots and
encode them. I was wondering though, if anyone done it already? Could you
please send me the code? Does anyone have a cursor editing tool?

Thanks,

	Mike

tomm@voodoo.UUCP (Tom Mackey) (01/04/91)

>
>I will be videotaping my program, so I'd like to make things bigger so they
>can be seen on the (poor quality) VHS tapesthat they ultimately will be dubbed
>to. 
>I can scale eveything in my program up a bit without much problem. I also
>would like to make the cursor big too.
>
>Defining a 32x32 bitmap cursor that looks like the standard arrow (except
>bigger) shouldn't be that hard, just a hassle to draw all the little dots and
>encode them. I was wondering though, if anyone done it already? Could you
>please send me the code? Does anyone have a cursor editing tool?
>
>Thanks,
>
>	Mike

----------------------------------------------------------------------------

    Wotdahell......  I got the basic idea from the net, so now its
    payback time.               -TomM-

----------------------------------------------------------------------------

/**********************************************************************\
*                                                                      *
*  FILE:  bit_defs.h                                                   *
*                                                                      *
*  DESCRIPTION:  include file containing defines for binary constants  *
*                                                                      *
\**********************************************************************/
#ifndef BIT_DEFS_H
#define BIT_DEFS_H

#ifndef lint
#ifdef RCS_INFO
static char RCS_bit_defs_h[] = "\
$Source: RCS/bit_defs.h,v $\
$Revision: 5.1 $\
$Date: 90/08/28 09:54:38 $\
$State: Exp $";
#endif RCS_INFO
#endif lint

#define	___	((((((((((((((((((((((((((((((((0
#define	__	((((((((((((((((0
#define _	<<1|0)
#define X	<<1|1)

/*
** These clever defines were found somewhere on UseNet sometime
** in 1987.  They provide an easy way to "see" what your patterns
** look like by making them human visible ascii patterns.  The
** usual approach is to use hex definitions which are hard to
** visualize.  The defines make the c-preprocessor do the hard work
** for you.  For each line you define a zero prefaced with a bunch
** of open-parens; then you give a series of left-shift-and-OR-with
** -zero-or-one-close-parens which define a hex value.  For example,
** here is how you would build a sailboat pattern.
**
**	static
**	Cursor	sailboat =
**		{
**		    __		_ _ _ _ _ _ X _ _ _ _ _ _ _ _ _		,
**		    __		_ _ _ _ _ _ X X _ _ _ _ _ _ _ _		,
**		    __		_ _ _ _ _ _ X _ X _ _ _ _ _ _ _		,
**		    __		_ _ _ _ _ _ X _ X _ _ _ _ _ _ _		,
**		    __		_ _ _ _ _ X X _ _ X _ _ _ _ _ _		,
**		    __		_ _ _ _ X _ X _ _ X _ _ _ _ _ _		,
**		    __		_ _ _ _ X _ X _ _ _ X _ _ _ _ _		,
**		    __		_ _ _ X _ _ X _ _ _ X _ _ _ _ _		,
**		    __		_ _ _ X _ _ X _ _ _ _ X _ _ _ _		,
**		    __		_ _ X _ _ _ X _ _ _ _ X _ _ _ _		,
**		    __		_ _ X _ _ _ X _ _ _ _ _ X _ _ _		,
**		    __		X X X X X X X X X X X X X X _ _		,
**		    __		_ _ X _ _ _ X _ _ _ _ _ _ X X _		,
**		    __		_ _ X X _ _ _ _ _ _ _ _ _ _ X _		,
**		    __		_ _ _ X X _ _ _ _ _ _ _ _ _ X _		,
**		    __		_ _ _ _ X X X X X X X X X X _ _
**		};
**
** The second line would really look like this:
**	((((((((((((((((0<<1|0)<<1|0)<<1|0)<<1|0)<<1|0)<<1|0)<<1|1) \
**           <<1|1)<<1|0)<<1|0)<<1|0)<<1|0)<<1|0)<<1|0)<<1|0)<<1|0) ,
**
** which is the hex value 0x0300
**
** Usually, working directly in an editor is good enough, but for
** tricky glyphs, you might want to work on graph paper first.
**
** One more thing:  These define the rows of the pattern in reverse
** order, and so will appear upside-down.  You can either build your
** patterns upside down, or use the flip_C16X1() and flip_C16X2()
** functions to flip your creations automagically.  These two functions
** are defined in the file cursors.c
**					-TomM- (tomm@voodoo.boeing.com)
*/

#endif BIT_DEFS_H

/**********************************************************************\
*                                                                      *
*  FILE:  cursors.c                                                    *
*                                                                      *
*  DESCRIPTION: Implementation file for cursor creation routines       *
*                                                                      *
\**********************************************************************/
#ifndef lint
#ifdef RCS_INFO
static char RCSinfo[] = "\
$Source: RCS/cursors.c,v $\
$Revision: 5.2 $\
$Date: 90/08/28 11:27:00 $\
$State: Exp $";
#endif RCS_INFO

#endif lint

#include <device.h>
#include <gl.h>

void flip_C16X1(c_array)
unsigned short	 c_array[][16];
{
    register
    int		 i, j;

    unsigned short tmp_array[1][16];

    for (i=0; i<16; i++)
	tmp_array[0][i] = c_array[0][i];

    j = 15;
    for (i=0; i<16; i++)
    {
	c_array[0][i] = tmp_array[0][j];
	j--;
    }
}

void flip_C16X2(c_array)
unsigned short	 c_array[][16];
{
    register
    int		 h, i, j;

    unsigned short tmp_array[2][16];

    for (h=0; h<2; h++)
    {
	for (i=0; i<16; i++)
	{
	    tmp_array[h][i] = c_array[h][i];
	}
    }

    for (h=0; h<2; h++)
    {
	j = 15;
	for (i=0; i<16; i++)
	{
	    c_array[h][i] = tmp_array[h][j];
	    j--;
	}
    }
}

/*
** flip_C32X[12] left as an excercise for the reader!
*/

/*************************************************************************\
*                                                                         *
*  FILE:  cursors.h                                                       *
*                                                                         *
*  DESCRIPTION:  include file containing cursor pattern definitions       *
*                This should give a good start to your own creative       *
*                flights of fantasy.  Note that the multi-color           *
*                cursors are useless on the 4D-2x series :-(              *
*                                                                         *
*  I'll take the credit, you take the blame! tomm@voodoo.boeing.com  ;^)  *
*                                                                         *
\*************************************************************************/
#ifndef CURSORS_H
#define CURSORS_H

#ifndef lint
#ifdef RCS_INFO
static char RCS_cursors_h[] = "\
$Source: RCS/cursors.h,v $\
$Revision: 5.2 $\
$Date: 90/11/27 11:56:10 $\
$State: Exp $";
#endif RCS_INFO
#endif lint

#include <device.h>
#include <gl.h>
#include "bit_defs.h"

extern	void		 flip_C16X1();
extern	void		 flip_C16X2();

/*
** The following pattern definitions must be flipped 180 degrees to
** provide proper input to defcursor().  Use either flip_C16X1() or
** filp_C16X2() to flip the cursor array from its visual orientation
** to the proper input orientation.
*/

static
unsigned short	cir_target[2][16] =	/* RED border, YELLOW target */
	{						/* 1's bits RED */
	    __		_ _ _ _ _ X X X X X _ _ _ _ _ _		,
	    __		_ _ _ X X X X X X X X X _ _ _ _		,
	    __		_ _ X X X _ _ _ _ _ X X X _ _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		_ _ X X X _ _ _ _ _ X X X _ _ _		,
	    __		_ _ _ X X X X X X X X X _ _ _ _		,
	    __		_ _ _ _ _ X X X X X _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,

							/* 2's bits YELLOW */
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ X X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
	};

static
unsigned short	x_target_1[1][16] =
	{
	    __		_ _ _ X X X X X X X X X _ _ _ _		,
	    __		_ _ _ _ X X X X X X X _ _ _ _ _		,
	    __		_ _ _ _ _ X X X X X _ _ _ _ _ _		,
	    __		X _ _ _ _ _ X X X _ _ _ _ _ X _		,
	    __		X X _ _ _ _ _ X _ _ _ _ _ X X _		,
	    __		X X X _ _ _ _ _ _ _ _ _ X X X _		,
	    __		X X X X _ _ _ _ _ _ _ X X X X _		,
	    __		X X X X X _ _ _ _ _ X X X X X _		,
	    __		X X X X _ _ _ _ _ _ _ X X X X _		,
	    __		X X X _ _ _ _ _ _ _ _ _ X X X _		,
	    __		X X _ _ _ _ _ X _ _ _ _ _ X X _		,
	    __		X _ _ _ _ _ X X X _ _ _ _ _ X _		,
	    __		_ _ _ _ _ X X X X X _ _ _ _ _ _		,
	    __		_ _ _ _ X X X X X X X _ _ _ _ _		,
	    __		_ _ _ X X X X X X X X X _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
	};


static
unsigned short	clock[1][16] =
	{
	    __		_ _ _ _ _ X X X X X X _ _ _ _ _		,
	    __		_ _ _ X X _ _ _ _ _ _ X X _ _ _		,
	    __		_ _ X X _ _ _ X X _ _ _ X X _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		_ X _ _ _ _ _ _ _ _ _ _ _ _ X _		,
	    __		X _ _ _ _ X _ _ _ _ _ _ _ _ _ X		,
	    __		X _ _ _ _ _ X _ _ _ _ _ _ _ _ X		,
	    __		X _ X _ _ _ _ X X _ _ _ _ X _ X		,
	    __		X _ X _ _ _ _ X X _ _ _ _ X _ X		,
	    __		X _ _ _ _ _ _ _ X _ _ _ _ _ _ X		,
	    __		X _ _ _ _ _ _ _ _ X _ _ _ _ _ X		,
	    __		_ X _ _ _ _ _ _ _ X _ _ _ _ X _		,
	    __		_ X X _ _ _ _ _ _ _ X _ _ X X _		,
	    __		_ _ X X _ _ _ X X _ X _ X X _ _		,
	    __		_ _ _ X X _ _ _ _ _ _ X X _ _ _		,
	    __		_ _ _ _ _ X X X X X X _ _ _ _ _
	};

static
unsigned short	hourglass[2][16] =	  /* RED hourglass, YELLOW sand */
	{						/* 1's bits RED */
	    __		_ X X X X X X X X X X X X X _ _		,
	    __		_ X X X X X X X X X X X X X _ _		,
	    __		_ _ _ X X _ _ _ _ _ X X _ _ _ _		,
	    __		_ _ _ X X _ _ _ _ _ X X _ _ _ _		,
	    __		_ _ _ X X _ _ _ _ _ X X _ _ _ _		,
	    __		_ _ _ X X X _ _ _ X X X _ _ _ _		,
	    __		_ _ _ _ _ X X _ X X _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ X X _ X X _ _ _ _ _ _		,
	    __		_ _ _ X X X _ _ _ X X X _ _ _ _		,
	    __		_ _ _ X X _ _ _ _ _ X X _ _ _ _		,
	    __		_ _ _ X X _ _ _ _ _ X X _ _ _ _		,
	    __		_ _ _ X X _ _ _ _ _ X X _ _ _ _		,
	    __		_ X X X X X X X X X X X X X _ _		,
	    __		_ X X X X X X X X X X X X X _ _		,
							/* 2's bits YELLOW */
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ X X _ X X _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ X X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
	};

static
unsigned short	martini[2][16] =	   /* RED swizzle, YELLOW glass */
	{						/* 1's bits RED */
	    __		X _ _ _ _ _ _ _ _ _ _ _ _ _ _ X		,
	    __		_ X _ _ _ _ _ _ _ _ _ _ _ _ X _		,
	    __		_ _ X X X X X X X _ _ X X X _ _		,
	    __		_ _ _ X _ _ _ _ _ _ _ _ X _ _ _		,
	    __		_ _ _ _ X _ _ _ _ _ _ X _ _ _ _		,
	    __		_ _ _ _ _ X _ _ _ _ X _ _ _ _ _		,
	    __		_ _ _ _ _ _ X _ _ X _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ X X _ _ _ _ _ _ _		,
	    __		_ _ _ X X X X X X X X X X _ _ _		,
							/* 2's bits YELLOW */
	    __		_ _ _ _ _ _ _ _ _ _ _ X _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ X _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ X _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ X X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ X X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
	};

static
unsigned short	coffee_cup[1][16] =
	{
	    __		_ _ _ _ X _ _ X _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ X _ _ X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ X _ _ X _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ X _ _ X _ _ _ _ _ _		,
	    __		_ _ _ _ X X X X X X _ _ _ _ _ _		,
	    __		_ _ X X _ X _ _ X _ X X _ _ _ _		,
	    __		_ X _ _ _ X _ _ X _ _ _ X _ X _		,
	    __		_ X _ _ _ _ _ _ _ _ _ _ X X _ X		,
	    __		_ X X X _ _ _ _ _ _ X X X _ _ X		,
	    __		_ X _ _ X X X X X X _ _ X _ _ X		,
	    __		_ _ X _ _ _ _ _ _ _ _ X _ _ _ X		,
	    __		_ _ X _ _ _ _ _ _ _ _ X _ _ X _		,
	    __		_ _ X _ _ _ _ _ _ _ _ X _ X _ _		,
	    __		_ _ X _ _ _ _ _ _ _ _ X X _ _ _		,
	    __		_ _ X X _ _ _ _ _ _ X X _ _ _ _		,
	    __		_ _ _ _ X X X X X X _ _ _ _ _ _
	};


static
unsigned short	circle_dot[1][16] =
	{
	    __		_ _ _ _ _ X X X X X _ _ _ _ _ _		,
	    __		_ _ _ X X X X X X X X X _ _ _ _		,
	    __		_ _ X X X _ _ _ _ _ X X X _ _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ X _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		X X _ _ _ _ _ _ _ _ _ _ _ X X _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		_ X X _ _ _ _ _ _ _ _ _ X X _ _		,
	    __		_ _ X X X _ _ _ _ _ X X X _ _ _		,
	    __		_ _ _ X X X X X X X X X _ _ _ _		,
	    __		_ _ _ _ _ X X X X X _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
	};


static
unsigned short	blank[1][16] =
	{
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _		,
	    __		_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
	};


#endif CURSORS_H

    --------- Then you do something like this somewhere --------
    _________ in your initialization routines.          --------

#include "cursors.h"

void map_cursor_colors()
{
    mapcolor(1, 255,   0,   0);	/* RED */
    mapcolor(2, 255, 255,   0);	/* YELLOW */
    mapcolor(3,   0,   0, 255);	/* BLUE */
}

void
init_cursors()
{
    long	saved_mode;

    saved_mode = getdrawmode();
    drawmode(CURSORDRAW);

    map_cursor_colors();

    curstype(C16X2);

    flip_C16X2(cir_target);
    defcursor(1, cir_target);
    curorigin(1, 7, 8);

    flip_C16X2(hourglass);
    defcursor(2, hourglass);
    curorigin(2, 7, 7);

    flip_C16X2(martini);
    defcursor(3, martini);
    curorigin(3, 7, 8);

    curstype(C16X1);

    flip_C16X1(x_target_1);
    defcursor(4, x_target_1);
    curorigin(4, 7, 8);

    flip_C16X1(clock);
    defcursor(5, clock);
    curorigin(5, 7, 8);

    flip_C16X1(coffee_cup);
    defcursor(6, coffee_cup);
    curorigin(6, 7, 7);

    flip_C16X1(circle_dot);
    defcursor(7, circle_dot);
    curorigin(7, 7, 8);

    defcursor(8, blank);
    curorigin(8, 7, 8);

    drawmode(saved_mode);
}
-- 
Tom Mackey       (206) 865-6575        tomm@voodoo.boeing.com
Boeing Computer Services         ....uunet!bcstec!voodoo!tomm
M/S 7K-20,     P.O. Box 24346,     Seattle, WA     98124-0346