home *** CD-ROM | disk | FTP | other *** search
- /*
- cmap.c 1/26/88
-
- % Character Map handling routines
- by Joe DeSantis.
- recreated by Ted Peck.
-
- OWL 1.1
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 3/08/88 jdc cmap clears to 0x07 space chars
- 3/18/88 ted made cmap a structure, not just a char **
- 8/17/88 jmd removed eNOMEM, added omalloc
- 5/09/89 ted Changed Alloc/Free terms to Open/Close.
- */
- /* -------------------------------------------------------------------------- */
- #include "oakhead.h"
- #include "disppriv.h"
- #include "cmapdecl.h"
- /* -------------------------------------------------------------------------- */
-
- cmap_type cmap_Open(nrows, ncols)
- int nrows, ncols;
- /*
- Allocates a character image map;
-
- The image map is an array of characters and attributes.
-
- Returns NULL if out of memory.
- */
- {
- cmap_type cmap;
-
- /* allocate character image map structure */
- if ((cmap = (cmap_type) omalloc(OA_CMAP, sizeof(struct cmap_struct))) == NULL) {
- return(NULL);
- }
-
- cmap->nrows = nrows;
- cmap->ncols = ncols;
- cmap->bufsize = ncols * nrows;
-
- /* allocate attrbuf in same block as charbuf */
- if ((cmap->charbuf =
- (char *) omalloc(OA_CMAPBUF, 2 * cmap->bufsize)) == NULL) {
- ofree(OA_CMAP, (VOID *) cmap);
- return(NULL);
- }
- cmap->attrbuf = (byte *)(cmap->charbuf + cmap->bufsize);
-
- /* initialize buffers to black on white spaces */
- memset(cmap->charbuf, ' ', cmap->bufsize);
- memset(cmap->attrbuf, 0x07, cmap->bufsize);
-
- return(cmap);
- }
- /* -------------------------------------------------------------------------- */
-
- void cmap_Close(cmap)
- cmap_type cmap;
- /*
- Free an image map;
- */
- {
- ofree(OA_CMAPBUF, (VOID *) cmap->charbuf); /* attrbuf is allocated in same block as charbuf */
- ofree(OA_CMAP, (VOID *) cmap);
- }
- /* -------------------------------------------------------------------------- */
-
- unsigned cmap_clipcbox(cmap, cboxp)
- cmap_type cmap;
- ocbox *cboxp;
- /*
- Return Sutherland clip code for box in cmap: 0 if box is completely
- out of cmap; otherwise bits saying which side(s) it was clipped on:
- 1, 2, 4, 8 for right, top, left, bottom; 16 for coming through at all.
- */
- {
- unsigned tlcode, brcode;
-
- tlcode = cmap_clippos(cmap, &cboxp->toprow, &cboxp->leftcol);
- brcode = cmap_clippos (cmap, &cboxp->botrow, &cboxp->rightcol);
-
- if ((tlcode & brcode) != 0) {
- return(0);
- }
- else return(tlcode | brcode | 16);
- }
- /* -------------------------------------------------------------------------- */
-
- unsigned cmap_clippos(cmap, rowp, colp)
- cmap_type cmap;
- int *rowp, *colp;
- /*
- Return Sutherland clip code for point in cmap: 0 if point is
- in cmap; otherwise bits saying which side it's out on.
- */
- {
- unsigned scode;
-
- scode = 0;
- if (*rowp < 0) { scode |= 4; *rowp = 0; }
- if (*colp < 0) { scode |= 2; *colp = 0; }
- if (*rowp >= cmap_GetHeight(cmap)) { scode |= 8; *rowp = cmap_GetHeight(cmap) - 1; }
- if (*colp >= cmap_GetWidth(cmap)) { scode |= 1; *colp = cmap_GetWidth(cmap) - 1; }
- return scode;
- }
- /* -------------------------------------------------------------------------- */
-
-