💾 Archived View for spam.works › mirrors › textfiles › computers › weiskamp.lst captured on 2023-12-28 at 17:24:40.

View Raw

More Information

⬅️ Previous capture (2023-06-14)

-=-=-=-=-=-=-

_AN ICON EDITOR_
by Keith Weiskamp and Loren Heiny


[LISTING ONE]

/*   iconed.c -- a special purpose icon editor.
 *
 *   This program allows you to interactively edit icons that
 *   can be used in a graphics program. You can create an icon,
 *   edit an existing one, or save an icon pattern to a file. The
 *   program requires a mouse. The icon files produced are of the
 *   form:
 *			ICONWIDTH ICONHEIGHT
 *			one row of icon pattern
 *			next row of icon pattern
 *			      .  .  .
 *			last row of icon pattern
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>
#include <stdarg.h>
#include <alloc.h>
#include "mouse.h"        /* mouse and keyboard routines */

#define BIGICONLEFT 20    /* left side of the big icon pattern */
#define BIGICONTOP  50    /* top side of the big icon pattern */
#define BIGBITSIZE  8     /* big bits are 8 pixels in size */
#define ICONWIDTH   16    /* an icon is a 16x16 pattern */
#define ICONHEIGHT  16
#define ICONLEFT    400   /* small icon pattern located here */
#define ESC         27    /* the value of the ESC key */

/*   Here are the functions used in iconed.c:  */

void draw_enlarged_icon(void);
void toggle_bigbit(int x, int y);
void toggle_icons_bit(int x, int y);
void init_bigbit(void);
void toggle_cursor(int x, int y);
void save_icon(void);
int read_icon(void);
void init_graphics(void);
void show_icon(void);

/*  The global variables */

void *bigbit;      /* points to image of a big bit */
                   /* holds icon pattern */
unsigned char icon[ICONHEIGHT][ICONWIDTH];

void main()
{
    int x, y;
    int c;

    read_icon();           /* read in an icon file */
    init_graphics();
                           /* initialize mouse */
    if (!initmouse()) {    /* must have mouse */
      restorecrtmode();
      printf("\nMouse not installed");
      printf("\nQuitting the Icon Editor");
      exit(1);
    }
    draw_enlarged_icon();  /* an empty big icon pattern */
    show_icon();           /* Draw the icon */

    hidemouse();      /* mouse cursor must be turned off */
		      /* before writing to screen */
    outtextxy(BIGICONLEFT, 10, "Press ESC when finished ...");
    outtextxy(BIGICONLEFT, BIGICONTOP-20, "Enlarged Icon");
    outtextxy(ICONLEFT, BIGICONTOP-20, "Actual Icon");
    showmouse();       /* redisplay mouse cursor */

      /* get input from mouse/keyboard */
    while ((c=waitforinput(LEFT_BUTTON)) != ESC) {
	if (c < 0) {     /* if true mouse button pressed */
            getmousecoords(&x, &y);  /* get current position */
	    toggle_bigbit(x, y);     /* toggle big bit */
	}
    }

    hidemouse();       /* turn mouse off and then get out */
    closegraph();      /* of graphics mode */
    printf("Do you want to save this icon to a file? (y) ");
    if (getch() != 'n')
	save_icon();
}


void draw_enlarged_icon(void)
{
/*
 *  This function draws an enlarged view of the icon pattern.
 *  You can click a big bit in this pattern to toggle the
 *  corresponding icons on and off in the actual icon. The
 *  icon is drawn at BIGICONLEFT, BIGICONTOP, to right, bottom.
 */
    int i;
    int right,bottom;

    setlinestyle(DOTTED_LINE, 0, NORM_WIDTH);
    right = 2 * (BIGICONLEFT + (ICONWIDTH-1) *
		(BIGBITSIZE + NORM_WIDTH));
    bottom = BIGICONTOP + ICONHEIGHT * (BIGBITSIZE + NORM_WIDTH);

    hidemouse();    /* draw vertical and horizonatal dashed */
    for (i=0; i<=ICONHEIGHT; i++)
        line(BIGICONLEFT, BIGICONTOP+i*(BIGBITSIZE+NORM_WIDTH),
	     right, BIGICONTOP+i*(BIGBITSIZE+NORM_WIDTH));
    for (i=0; i<=ICONWIDTH; i++)
      line(BIGICONLEFT+2*(i*(BIGBITSIZE+NORM_WIDTH)), BIGICONTOP,
	   BIGICONLEFT+2*(i*(BIGBITSIZE+NORM_WIDTH)), bottom);
    showmouse();
    init_bigbit();	/* create the big bit image */
}


void init_bigbit(void)
{
/*  This function creates the image of a single big bit. This
 *  image is used to toggle the big bits whenever the user
 *  clicks on the big icon pattern.
 */
    int bbx, bby;
    int i,j;

    bbx = BIGICONLEFT;
    bby = BIGICONTOP;     /* corner of the big icon */

    hidemouse();       /* hide the mouse before drawing */
    for (j=bby+1; j<=bby+BIGBITSIZE; j++) {
        for (i=bbx+1; i<=bbx+2*BIGBITSIZE; i++) {
	    putpixel(i,j,getmaxcolor());
	}
    }

  /* Set aside memory for the big bit image and then use
     getimage() to capture its image. */

    bigbit = malloc(imagesize(bbx,bby,bbx+2*BIGBITSIZE,
		    bby+BIGBITSIZE));
    getimage(bbx+1,bby+1,bbx+2*BIGBITSIZE,bby+BIGBITSIZE,
	     bigbit);

  /* Erase the big bit by exclusive ORing it with itself */

    putimage(bbx+1, bby+1, bigbit, XOR_PUT);
    showmouse();      /* turn the mouse back on */
}


void toggle_bigbit(int x, int y)
{
/*
 *  This function toggles a big bit and the corresponding pixel
 *  in the icon pattern. The x and y coordinates specify the
 *  mouse position.
 */
    int i, j;
    int line1, line2, col1, col2;

    for (j=0; j<ICONHEIGHT; j++) {
        line1 = BIGICONTOP+j*(BIGBITSIZE+NORM_WIDTH);
        line2 = BIGICONTOP+(j+1)*(BIGBITSIZE+NORM_WIDTH);
	if (line1 <= y && y < line2) {
            for (i=0; i<ICONWIDTH; i++) {
	       col1 = BIGICONLEFT+2*(i*(BIGBITSIZE+NORM_WIDTH));
	       col2 = BIGICONLEFT+2*((i+1)*
			 (BIGBITSIZE+NORM_WIDTH));
               if (col1 <= x && x < col2) {
                   hidemouse();
                   putimage(col1+1,line1+1,bigbit,XOR_PUT);
                   showmouse();
                   toggle_icons_bit(i, j);
		   return;
              }
	    }
	}
    }
}


void toggle_icons_bit(int x, int y)
{
/*
 *  This function toggles a single pixel in the icon pattern.
 *  The pixel's color and value is changed in the icon array.
 *  Arguments x and y are between 0 and ICONWIDTH or ICONHEIGHT.
 *  The array icon saves the icon pattern. If a location is set
 *  to 1, the corresponding pixel in the icon is displayed.
 */
    hidemouse();
       /* if pixel is not black, make it black */
    if (getpixel(2*x+ICONLEFT,BIGICONTOP+y) != BLACK) {
	putpixel(2*x+ICONLEFT,BIGICONTOP+y,BLACK);
	putpixel(2*x+1+ICONLEFT,BIGICONTOP+y,BLACK);
        icon[y][x] = 0;
    }
    else {        /* draw all pixels on with the max color */
	putpixel(2*x+ICONLEFT,BIGICONTOP+y,getmaxcolor());
	putpixel(2*x+1+ICONLEFT,BIGICONTOP+y,getmaxcolor());
	icon[y][x] = 1;
    }
    showmouse();
}


void save_icon(void)
{
/*  This function writes the icon pattern to a file. The user
 *  is prompted for the filename. The format of the file is
 *  presented at the top of the iconed.c file.
 */
    char filename[80];
    FILE *iconfile;
    int i, j;

    printf("\nEnter the file name to store the icon in: ");
    scanf("%s",filename);
    if ((iconfile = fopen(filename,"w")) == NULL) {
	printf("Could not open file.\n");
	return;
    }
      /*  Write the header to the file */
    fprintf(iconfile, "%d %d\n", ICONWIDTH, ICONHEIGHT);

    for (j=0; j<ICONHEIGHT; j++) {      /* Write the icon */
        for (i=0; i<ICONWIDTH; i++)     /* pattern to a file */
	    fprintf(iconfile, "%x ", icon[j][i]);
	fprintf(iconfile, "\n");
    }
    fclose(iconfile);
}


int read_icon(void)
{
/* This function reads an icon file into the icon array and
 * calls show_icon() to turn the appropriate pixels on. If the
 * file header doesn't match ICONWIDTH and ICONHEIGHT, the
 * the file is invalid and the icon is not read. The function
 * returns a 0 if a file is not read; otherwise 1 is returned.
 */
    char filename[80];
    FILE *iconfile;
    int i, j;
    int width, height;

    for (j=0; j<ICONHEIGHT; j++) {   /* Initialize icon array */
        for (i=0; i<ICONWIDTH; i++)  /* to all blanks */
	    icon[j][i] = 0;
    }

    printf("\n\n-----------  ICON EDITOR -------------\n\n");
    printf("Do you want to edit an existing icon? (y) ");

    if (getch() == 'n')
	return(0);

    printf("\nEnter name of the file to read the icon from: ");
    scanf("%s",filename);
    if ((iconfile = fopen(filename,"r")) == NULL) {
	printf("Cannot open file.\n");
	return(0);		 /* return a failure flag */
    }
/*  Read first line of the icon file. It should contain two
    numbers that are equal to ICONWIDTH and ICONHEIGHT.
 */
    fscanf(iconfile,"%d %d", &width, &height);
    if (width != ICONWIDTH || height != ICONHEIGHT) {
	printf("Incompatible icon file.\n");
	return(0);          /* return a failure flag */
    }

    for (j=0; j<ICONHEIGHT; j++) {
        for (i=0; i<ICONWIDTH; i++)
	    fscanf(iconfile, "%x", &icon[j][i]);
    }
    fclose(iconfile);
    return(1);             /* return a success flag */
}


void init_graphics(void)
{
/* This function initializes the graphics hardware.

    int gdriver = CGA;
    int gmode, gerror;

    gmode =4;
    initgraph(&gdriver,&gmode,"");
    if ((gerror = graphresult()) < 0) {
	printf("Failed graphics initialization: gerror=%d\n",
		gerror);
	exit(1);
    }
}

void show_icon(void)
{
/*  This function displays the icon pattern stored in the
 *  icon array.
 */

    int x, y;

    for (y=0; y<ICONHEIGHT; y++)
      for (x=0; x<ICONWIDTH; x++) {
        if (icon[y][x] == 1) {
	  putimage(BIGICONLEFT+2*(x*(BIGBITSIZE+NORM_WIDTH))+1,
	  BIGICONTOP+y*(BIGBITSIZE+NORM_WIDTH)+1, bigbit,
	  XOR_PUT);
	  toggle_icons_bit(x, y);
	}
     }
}





[LISTING TWO]

/*  mouse.c  -- routines to support a Microsoft compatible mouse.
 *              This package assumes that you are running under
 *              graphics mode.
 */

#include <dos.h>
#include <conio.h>
#include "mouse.h"
#include "graphics.h"

#define TRUE  	1
#define FALSE 	0
int mouseexists;      /* internal variable set true if a */
		      /* mouse driver is detected  */


void mouse(int *m1, int *m2, int *m3, int *m4)
{
/*
 *   This function provides the interface between the mouse
 *   driver and an application program. Several predefined mouse
 *   functions supported by the Microsoft mouse are available.
 *   Parameters are passed and returned with the ax, bx, cx and
 *   dx registers.
 */
    union REGS inregs, outregs;

    inregs.x.ax = *m1;
    inregs.x.bx = *m2;
    inregs.x.cx = *m3;
    inregs.x.dx = *m4;
    int86(0x33, &inregs, &outregs);
    *m1 = outregs.x.ax;      /* return parameters */
    *m2 = outregs.x.bx;
    *m3 = outregs.x.cx;
    *m4 = outregs.x.dx;
}


int initmouse(void)
{
/*
 *  This function initializes the mouse and displays
 *  the mouse cursor at the top, left of the screen, if one
 *  is present.
 */
    int m1, m2, m3, m4, gmode;
    char far *memory = (char far *)0x004000049L;

    mouseexists = TRUE;
    m1 = RESET_MOUSE;
    mouse(&m1, &m2, &m3, &m4);
    if (m1) {               /* if mouse reset okay, assume */
	gmode = getgraphmode();            /* mouse exists */
	if (gmode == HERCMONOHI) {   /* Test for Hercules */
	    *memory = 0x06;
        }
	m1 = SET_MOUSE_COORD;
	mouse(&m1, &m2, &m3, &m4);  /* mouse exists and draw the */
	showmouse();            /* cursor on the screen at 0,0 */
	return(1);             /* return a success flag */
    }
    else {                       /* no mouse installed */
	mouseexists = FALSE;
	return(0);            /* return a no-mouse found flag */
    }
}


void hidemouse(void)
{
/*  This function removes the mouse cursor from the screen. It
 *  should be called before displaying data on the screen.
 *  Use showmouse() to redisplay the mouse cursor. The mouse
 *  cursor still moves even though it is not visible. Don't
 *  call hidemouse() if the mouse is not already visible.
 */
    int m1, m2, m3, m4;

    if (mouseexists) {            /* check for mouse */
       m1 = HIDE_MOUSE;	         /* hide the mouse cursor */
       mouse(&m1, &m2, &m3, &m4);
    }
}


void showmouse(void)
{
/*  This function displays the mouse cursor. You should not call
 *  this function if the mouse is already visible.

    int m1, m2, m3, m4;

    if (mouseexists) {		/* make sure mouse exists */
       m1 = SHOW_MOUSE;
       mouse(&m1, &m2, &m3, &m4);  /* display mouse cursor */
    }
}


void getmousecoords(int *x, int *y)
{
/*
 *  This function returns the position of the mouse cursor.
 */
    int m1, m2;

    if (mouseexists) {
       m1 = GET_MOUSE_STATUS;
       mouse(&m1, &m2, x, y);
       /* adjust for virtual coordinates */
       if (getmaxx() == 319) (*x) /= 2;
    }
}


int testbutton(int testtype, int whichbutton)
{
/*
 *  This function tests a mouse button state. It returns TRUE
 *  if the specified mouse button (whichbutton) meets the
 *  specified action (as indicated by testtype); otherwise the
 *  function returns FALSE.
 */
    int m1, m2, m3, m4;

    m1 = testtype;
    if (whichbutton == LEFT_BUTTON || whichbutton ==
		  EITHER_BUTTON) {
        m2 = LEFT_BUTTON;
        mouse(&m1, &m2, &m3, &m4);
	if (m2) return(TRUE);     /* return TRUE if action ok*/
    }
    if (whichbutton == RIGHT_BUTTON || whichbutton ==
		 EITHER_BUTTON) {
        m1 = testtype;
	m2 = RIGHT_BUTTON;
        mouse(&m1, &m2, &m3, &m4);
	if (m2) return(TRUE);     /* return TRUE if action ok */
    }
    return(FALSE);           /* return FALSE as a catch all */
}


int waitforinput(int whichbutton)
{
/*  This function returns a character if a key has been pressed,
 *  -1 if a mouse button has been pressed; otherwise a zero. If
    a mouse exists, this routine favors any keyboard action.
 */
    int c = 0;

      while (!c)   {
	if (kbhit())    /* check if a key has been pressed */
	    c =getch();  /* return the character     */
        else {
         if (testbutton(CHECK_BUTTON_PRESS, whichbutton)) {
	    while (!testbutton(CHECK_BUTTON_RELEASE,
		      whichbutton));
	    c = -1;
	 }
	else if (testbutton(CHECK_BUTTON_RELEASE,
		      whichbutton)) {
	    c = -1;
	    }
       }
      }
      return(c);
}


[LISTING THREE]


/*   mouse.h  -- this file includes function prototypes and macro
 *               constants for the functions in mouse.c.
 */

/*  The following is a list of constants that correspond to the
 *  mouse functions supported in mouse.c.
 */

#define RESET_MOUSE          	0
#define SHOW_MOUSE           	1
#define HIDE_MOUSE           	2
#define GET_MOUSE_STATUS     	3
#define SET_MOUSE_COORD      	4
#define CHECK_BUTTON_PRESS   	5
#define CHECK_BUTTON_RELEASE 	6
#define SET_MOUSE_HORIZ_RANGE   7 	/* not used */
#define SET_MOUSE_VERT_RANGE    8	/* not used */
#define SET_GRAPHICS_CURSOR 	9	/* not used */
#define GET_MOUSE_MOVEMENT   	11
#define SET_MICKEY_RATIO     	15 	/* not used */

#define LEFT_BUTTON          	0	/* use left button */
#define RIGHT_BUTTON         	1       /* use right button */
#define EITHER_BUTTON        	2      /* use either button */


/*  The function prototypes for the functions in mouse.c
 */

void mouse(int *m1, int *m2, int *m3, int *m4);
int  initmouse(void);
void getmousecoords(int *x, int *y);
void hidemouse(void);
void showmouse(void);
int  testbutton(int testtype, int whichbutton);
int  waitforinput(int whichbutton);