home *** CD-ROM | disk | FTP | other *** search
- /*
- pcpmap.c
-
- % Routines for PC pixel map interface
-
- 2/04/89 by Ted.
-
- OWL 1.1
- Copyright (c) 1988, 1989 by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 02/23/89 ted: Added copy case.
- 04/22/89 ted Added load and save cases.
- 07/05/89 ted Moved load/save out to pcpmapio.c.
- */
-
- #include "pcpriv.h"
- #include "pmlsreq.h"
-
- /* -------------------------------------------------------------------------- */
-
- int pc_pControl(msg, indata, outdata)
- dig_pcmsg msg;
- VOID *indata;
- VOID *outdata;
- {
- pmap_type pmap;
- byte *pixbuf;
- byte **planes;
- int iplane;
- size_t bsize;
-
- switch (msg) {
- case PC_OPENPMAP: /* allocate pixel image map */
- {
- pmapreq_struct *pmapreq = (pmapreq_struct *) indata;
-
- *((pmap_type *) outdata) = NULL;
-
- /* Don't support onscreen pmap allocation; simulate offscreen- */
- /* onboard pmap allocation offboard */
- if (pmapreq->onboard && pmapreq->onscreen) {
- return(FALSE);
- }
- /* Allocate a new pmap structure with space tacked on for extra info */
- pmap = (pmap_type) omalloc(OA_PMAP, pc_pmheadersize(pc_nplanes()));
- if (pmap == NULL) {
- return(FALSE);
- }
- /* Copy from the request structure right into the pmap */
- memmove((VOID *)pmap, (VOID *)pmapreq, sizeof(struct pmap_struct));
-
- /* Point xdata right after the pmap struct */
- pmap->xdata = (VOID *)pcpmap_pmapx(pmap);
-
- pmap->xpos = -1; /* This don't-care var. set <0 so pmap_Ok fails. */
-
- pcpmap_SetDispinfo(pmap, &pcdata->info);
-
- pcpmap_SetBytewidth(pmap, (pmap->width * pcpmap_pixbits(pmap) + 7) / 8);
- pcpmap_SetNshift(pmap, 0);
- pcpmap_SetComptype(pmap, 0);
-
- #ifndef OAK_DOS386
- /* Make sure plane size doesn't exceed 64K by chopping height */
- if (pcpmap_GetPlaneSize(pmap) > (unsigned long) UINT_MAX) {
- pmap->height = (odim)((unsigned long) UINT_MAX /
- pcpmap_bytewidth(pmap));
- }
- #endif
- bsize = (unsigned) pcpmap_GetPlaneSize(pmap);
-
- if (pcpmap_nplanes(pmap) <= 1) {
- if ((pixbuf = (byte *)omalloc(OA_PMAPBUF, bsize)) == NULL) {
- ofree(OA_PMAP, (VOID *) pmap);
- return(FALSE);
- }
- pcpmap_SetPixbuf(pmap, pixbuf);
- }
- else {
- planes = pcpmap_planes(pmap);
- pcpmap_SetPixbuf(pmap, (byte *)planes);
-
- for (iplane = 0; iplane < pcpmap_nplanes(pmap); iplane++) {
- planes[iplane] = (byte *)omalloc(OA_PMAPBUF, bsize);
- if (planes[iplane] == NULL) {
- for (iplane-- ; iplane >= 0; iplane--) {
- ofree(OA_PMAPBUF, (VOID *) planes[iplane]);
- }
- ofree(OA_PMAP, (VOID *) pmap);
- return(FALSE);
- }
- }
- }
- pmap->xpos = 1; /* This don't-care var. set >0 so pmap_Ok succeeds.*/
- *((pmap_type *) outdata) = pmap;
- break;
- }
- case PC_CLOSEPMAP:
- pmap = (pmap_type) indata;
-
- /* Note: pmap onboard and onscreen is the embedded dispmap: don't free.*/
- if (pmap != NULL && !(pmap->onboard && pmap->onscreen)) {
- pmap->xpos = -1;/* This don't-care var. set <0 so pmap_Ok fails. */
-
- if (pcpmap_nplanes(pmap) <= 1) {
- if (pcpmap_pixbuf(pmap) != NULL) {
- ofree(OA_PMAPBUF, (VOID *) pcpmap_pixbuf(pmap));
- }
- }
- else {
- /* If multiple plane buffers, free them all */
- planes = pcpmap_planes(pmap);
- for (iplane = pcpmap_nplanes(pmap) - 1; iplane >= 0; iplane--) {
- if (planes[iplane] != NULL) {
- ofree(OA_PMAPBUF, (VOID *) planes[iplane]);
- }
- }
- }
- ofree(OA_PMAP, (VOID *) pmap);
- }
- break;
- case PC_CLEARPMAP:
- {
- pmapclearreq_struct *pmcr = (pmapclearreq_struct *) indata;
-
- pmap = pmcr->pmap;
-
- if (pmap != NULL && pmap->xdata != NULL) {
- bsize = (unsigned) pcpmap_GetPlaneSize(pmap);
-
- if (pcpmap_nplanes(pmap) <= 1) {
- if (pcpmap_pixbuf(pmap) != NULL) {
- memset(pcpmap_pixbuf(pmap),
- (byte) pc_wordcolor(pmcr->color),
- bsize);
- }
- }
- else {
- planes = pcpmap_planes(pmap);
- for (iplane = pcpmap_nplanes(pmap) - 1; iplane >= 0; iplane--) {
- if (planes[iplane] != NULL) {
- memset(planes[iplane],
- ((((byte) pmcr->color >> iplane) & 1) ? 0xFF : 0x00),
- bsize);
- }
- }
- }
- }
- break;
- }
- case PC_COPYPMAP:
- {
- pmapcopyreq_struct *pmcpr = (pmapcopyreq_struct *)indata;
-
- if (pcpmap_nplanes(pmcpr->spmap) == pcpmap_nplanes(pmcpr->dpmap) &&
- pcpmap_GetPlaneSize(pmcpr->spmap) == pcpmap_GetPlaneSize(pmcpr->dpmap)
- ) {
-
- if (pcpmap_nplanes(pmcpr->spmap) <= 1) {
- memmove((VOID *) pcpmap_pixbuf(pmcpr->dpmap),
- (VOID *) pcpmap_pixbuf(pmcpr->spmap),
- (unsigned) pcpmap_GetPlaneSize(pmcpr->spmap));
- }
- else {
- for (iplane = 0; iplane < pcpmap_nplanes(pmcpr->spmap); iplane++) {
- memmove((VOID *) pcpmap_planes(pmcpr->dpmap)[iplane],
- (VOID *) pcpmap_planes(pmcpr->spmap)[iplane],
- (unsigned) pcpmap_GetPlaneSize(pmcpr->spmap));
- }
- }
- }
- break;
- }
- case PC_LOADPMAP:
- case PC_SAVEPMAP:
- case PC_PMAPTOBMAP:
- case PC_BMAPTOPMAP:
- return((*pmapioreq)(msg, indata, outdata));
- }
- return(TRUE);
- }
- /* -------------------------------------------------------------------------- */
-
-