/***************************************************** CLKFAC.C
 * NAME:	CLKFAC
 *
 * FUNCTION:	Paint clock's face on screen.
 *
 * EXAMPLE:	CLKFAC();
 *
 * INPUTS:	determined from global definitions
 *
 * OUTPUT:	placed into global definitions
 *
 **************************************************************
 * 11/22/86 -RBM- original implementation
 **************************************************************/
#define XTRNALGLOBALS 1		/* globals externally defined	*/
#include "E:CLKGBL.H"		/* setup global storage */

/**************************************************************
 * BEGIN ROUTINE
 **************************************************************/

CLKFAC()
{
int	i;			/* temporary counter		*/
int	hour;			/* hour under consideration	*/
int	hourhand;		/* hour hand to draw		*/
struct	ACTIMAGE acnumbrs[100];	/* draw image structure		*/

/**** loop thru all 12 hours ******/
for (hour=1; hour<=12; hour++)
	{ /*--- build "hand" --- */
	  if (hour == 12) hourhand=0; else hourhand=hour;
	  clkimgh (&acnumbrs[0], hourhand*5);

	  /*--- draw "hand" -----*/
	  drawit (&acnumbrs[0], fccol);

	  /*--- locate, position and draw hour # ---*/
	  for (i=0; acnumbrs[i].row != 0; i++);
	  i--;  /* point to the last position in draw image	*/
	  drawnum (acnumbrs[i].row, acnumbrs[i].col, hour, fccol);

	};

}				/***** end of routine ******/

/************************************************************************
* drawnum - draws number on screen in graphics mode.			*
*************************************************************************/
drawnum (row, col, numbr, color)
int 	row;			/* row position of center of number 	*/
int	col;			/* column position of center of number	*/
int	numbr;			/* number to draw			*/
int	color;			/* color to draw it			*/
{
#define DRWWTH 15 		/* images are 15 lines wide		*/
#define DRWDPH 15 		/* images are 15 lines deep		*/ 
#define NIMGS   4		/* number of images			*/
static struct IMG { int image;	/* bit = 1 means draw dot		*/
		    int blank;	/* bit = 1 means blank background	*/
		    int num;	/* the number that this image draws	*/
		  }
		  imgary[NIMGS*DRWDPH]
		= {	/**** # 3 ***/
			0x0000,	0x0FF8,	3,  /* ............... */
			0x05C0,	0x0FF8,	3,  /* ....X.XXX...... */
			0x07E0,	0x0FF8,	3,  /* ....XXXXXX..... */
			0x0430,	0x0FF8,	3,  /* ....X....XX.... */
			0x0030,	0x0FF8,	3,  /* .........XX.... */
			0x0030,	0x0FF8,	3,  /* .........XX.... */
			0x01E0,	0x0FF8,	3,  /* ......XXXX..... */
			0x01C0,	0x0FF8,	3,  /* ......XXX...... */
			0x0060,	0x0FF8,	3,  /* ........XX..... */
			0x0030,	0x0FF8,	3,  /* .........XX.... */
			0x0430,	0x0FF8,	3,  /* ....X....XX.... */
			0x0670,	0x0FF8,	3,  /* ....XX..XXX.... */
			0x07E0,	0x0FF8,	3,  /* ....XXXXXX..... */
			0x05C0,	0x0FF8,	3,  /* ....X.XXX...... */
			0x0000,	0x0FF8,	3,  /* ............... */
			/**** # 6 ***/
			0x0000,	0x1FF0,	6,  /* ............... */
			0x03C0,	0x1FF0,	6,  /* .....XXXX...... */
			0x0660,	0x1FF0,	6,  /* ....XX..XX..... */
			0x0C00,	0x1FF0,	6,  /* ...XX.......... */
			0x0C00,	0x1FF0,	6,  /* ...XX.......... */
			0x0C00,	0x1FF0,	6,  /* ...XX.......... */
			0x0FC0,	0x1FF0,	6,  /* ...XXXXXX...... */
			0x0FE0,	0x1FF0,	6,  /* ...XXXXXXX..... */
			0x0E60,	0x1FF0,	6,  /* ...XXX..XX..... */
			0x0C20,	0x1FF0,	6,  /* ...XX....X..... */
			0x0C20,	0x1FF0,	6,  /* ...XX....X..... */
			0x0E60,	0x1FF0,	6,  /* ...XXX..XX..... */
			0x07C0,	0x1FF0,	6,  /* ....XXXXX...... */
			0x0380,	0x1FF0,	6,  /* .....XXX....... */
			0x0000,	0x1FF0,	6,  /* ............... */
			/**** # 9 ***/
			0x0000,	0x1FF0,	9,  /* ............... */
			0x0380,	0x1FF0,	9,  /* .....XXX....... */
			0x07C0,	0x1FF0,	9,  /* ....XXXXX...... */
			0x0CE0,	0x1FF0,	9,  /* ...XX..XXX..... */
			0x0860,	0x1FF0,	9,  /* ...X....XX..... */
			0x0860,	0x1FF0,	9,  /* ...X....XX..... */
			0x0CE0,	0x1FF0,	9,  /* ...XX..XXX..... */
			0x0FE0,	0x1FF0,	9,  /* ...XXXXXXX..... */
			0x07E0,	0x1FF0,	9,  /* ....XXXXXX..... */
			0x0060,	0x1FF0,	9,  /* ........XX..... */
			0x0060,	0x1FF0,	9,  /* ........XX..... */
			0x0060,	0x1FF0,	9,  /* ........XX..... */
			0x0CC0,	0x1FF0,	9,  /* ...XX..XX...... */
			0x0780,	0x1FF0,	9,  /* ....XXXX....... */
			0x0000,	0x1FF0,	9,  /* ............... */
			/**** # 12 ***/
			0x0000,	0x3FFE,	12,  /* ............... */
			0x0C38,	0x3FFE,	12,  /* ...XX....XXX... */
			0x1C7C,	0x3FFE,	12,  /* ..XXX...XXXXX.. */
			0x1CCC,	0x3FFE,	12,  /* ..XXX..XX..XX.. */
			0x0484,	0x3FFE,	12,  /* ....X..X....X.. */
			0x040C,	0x3FFE,	12,  /* ....X......XX.. */
			0x0418,	0x3FFE,	12,  /* ....X.....XX... */
			0x0430,	0x3FFE,	12,  /* ....X....XX.... */
			0x0460,	0x3FFE,	12,  /* ....X...XX..... */
			0x04C0,	0x3FFE,	12,  /* ....X..XX...... */
			0x04C0,	0x3FFE,	12,  /* ....X..XX...... */
			0x04C4,	0x3FFE,	12,  /* ....X..XX...X.. */
			0x1EFC,	0x3FFE,	12,  /* ..XXXX.XXXXXX.. */
			0x1EFC,	0x3FFE,	12,  /* ..XXXX.XXXXXX.. */
			0x0000,	0x3FFE,	12   /* ............... */
		  };
int	ntry;		/* table entry					*/
int	bitx;		/* bit being accessed (1=lsbit)			*/
int	mask;		/* bit mask					*/

/******* BEGIN PROCESSING ***********************************************/
/*DEBUG printf("<drawnum>%5d%5d%5d%5d\n",row,col,numbr,color);
*/
/*----- adjust row & col to point to upper right corner of char --------*/
row -= DRWDPH/2;
col += DRWWTH/2;
switch (numbr)		/* adjust for hand width */
	{
	case  3 : row += mnwth/2; break;
	case  6 : col += mnwth/2; break;
	case  9 : row += mnwth/2; break;
	case 12 : col += mnwth/2; break;
	};

/*----- find entry in table, exit if not found -------------------------*/
for (ntry=0; ntry<(NIMGS*DRWDPH); ntry++)
    {
/*DEBUG printf("found.. %5x%5x%5x%5d%5d%5d\n",imgary[ntry].image,
 imgary[ntry].blank, imgary[ntry].num, ntry, row, col);
*/
    if (imgary[ntry].num == numbr) 
	{
	sreg.bx = 0;			/* unused			*/
	sreg.cx = col;			/* setup column			*/
	sreg.dx = row;			/* setup row			*/

	/*--- get line entry, scan thru dots ---------------------------*/
	for (bitx=1; bitx<=DRWWTH; bitx++,sreg.cx--)
		{mask = 1;		/* build dot mask		*/
 		mask <<= bitx;
/*DEBUG printf("       bitx=3d%5d  mask=%4x\n",bitx,mask);
*/
		/*--- check blank, draw dot if so ----------------------*/
		if ((imgary[ntry].blank & mask) != 0)
			{
			/*--- if dot off (=0) color = bkgnd ------------*/
			/*    if dot on  (=1) color = color             */
			if ((imgary[ntry].image & mask) == 0)
				sreg.ax = 3072 + bkcol; /* =0, bkgnd	*/
			else	sreg.ax = 3072 + color; /* =1, dot colr */

			/*--- draw dot ---------------------------------*/
			csysint (VIDEO, &sreg, &rreg);
			};
		};
	row++;
	};
    };
}
