home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCPMAP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-14  |  5.4 KB  |  195 lines

  1. /*
  2.     pcpmap.c
  3.  
  4.     % Routines for PC pixel map interface
  5.  
  6.     2/04/89  by Ted.
  7.  
  8.     OWL-PC 1.2
  9.     Copyright (c) 1988, 1989 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.     02/23/89 ted:    Added copy case.
  15.     04/22/89 ted    Added load and save cases.
  16.     07/05/89 ted    Moved load/save out to pcpmapio.c.
  17.  
  18.      9/20/89 ted    Chopped width as well as height in case of pmap too big.
  19.      3/28/90 jmd    ansi-fied
  20.      4/14/90 ted    included olimits.h for UINT_MAX.
  21. */
  22.  
  23. #include "pcpriv.h"
  24. #include "pmlsreq.h"
  25. #include "olimits.h"
  26.  
  27. /* -------------------------------------------------------------------------- */
  28.  
  29. int pc_pControl(dig_pcmsg msg, VOID *indata, VOID *outdata)
  30. {
  31.     pmap_type pmap;
  32.     byte *pixbuf;
  33.     byte **planes;
  34.     int iplane;
  35.     size_t bsize;
  36.  
  37.     switch (msg) {
  38.     case PC_OPENPMAP:    /* allocate pixel image map */
  39.     {
  40.         pmapreq_struct *pmapreq = (pmapreq_struct *) indata;
  41.  
  42.         *((pmap_type *) outdata) = NULL;
  43.  
  44.         /* Don't support onscreen pmap allocation; simulate offscreen- */
  45.         /* onboard pmap allocation offboard */
  46.         if (pmapreq->onboard && pmapreq->onscreen) {
  47.             return(FALSE);
  48.         }
  49.         /* Allocate a new pmap structure with space tacked on for extra info */
  50.         pmap = (pmap_type) omalloc(OA_PMAP, pc_pmheadersize(pc_nplanes()));
  51.         if (pmap == NULL) {
  52.             return(FALSE);
  53.         }
  54.         /* Copy from the request structure right into the pmap */
  55.         memmove((VOID *)pmap, (VOID *)pmapreq, sizeof(struct pmap_struct));
  56.  
  57.         /* Point xdata right after the pmap struct */
  58.         pmap->xdata = (VOID *)pcpmap_pmapx(pmap);
  59.  
  60.         pmap->xpos = -1;    /* This don't-care var. set <0 so pmap_Ok fails. */
  61.  
  62.         pcpmap_SetDispinfo(pmap, &pcdata->info);
  63.  
  64.         pcpmap_SetBytewidth(pmap, (pmap->width * pcpmap_pixbits(pmap) + 7) / 8);
  65.         pcpmap_SetNshift(pmap, 0);
  66.         pcpmap_SetComptype(pmap, 0);
  67.  
  68. #ifndef OAK_DOS386
  69.         /* Make sure plane size doesn't exceed 64K by chopping width & height */
  70.         if (pcpmap_GetPlaneSize(pmap) > (unsigned long) UINT_MAX) {
  71.             if (pmap->width > disp_GetPixWidth()) {
  72.                 pmap->width = disp_GetPixWidth();
  73.                 pcpmap_SetBytewidth(pmap, (pmap->width * pcpmap_pixbits(pmap) + 7) / 8);
  74.             }
  75.             if (pcpmap_GetPlaneSize(pmap) > (unsigned long) UINT_MAX) {
  76.                 pmap->height = (odim)((unsigned long) UINT_MAX /
  77.                                         pcpmap_bytewidth(pmap));
  78.             }
  79.         }
  80. #endif
  81.         bsize = (unsigned) pcpmap_GetPlaneSize(pmap);
  82.  
  83.         if (pcpmap_nplanes(pmap) <= 1) {
  84.             if ((pixbuf = (byte *)omalloc(OA_PMAPBUF, bsize)) == NULL) {
  85.                 ofree(OA_PMAP, (VOID *) pmap);
  86.                 return(FALSE);
  87.             }
  88.             pcpmap_SetPixbuf(pmap, pixbuf);
  89.         }
  90.         else {
  91.             planes = pcpmap_planes(pmap);
  92.             pcpmap_SetPixbuf(pmap, (byte *)planes);
  93.  
  94.             for (iplane = 0; iplane < pcpmap_nplanes(pmap); iplane++) {
  95.                 planes[iplane] = (byte *)omalloc(OA_PMAPBUF, bsize);
  96.                 if (planes[iplane] == NULL) {
  97.                     for (iplane-- ; iplane >= 0; iplane--) {
  98.                         ofree(OA_PMAPBUF, (VOID *) planes[iplane]);
  99.                     }
  100.                     ofree(OA_PMAP, (VOID *) pmap);
  101.                     return(FALSE);
  102.                 }
  103.             }
  104.         }
  105.         pmap->xpos = 1;    /* This don't-care var. set >0 so pmap_Ok succeeds.*/
  106.         *((pmap_type *) outdata) = pmap;
  107.         break;
  108.     }
  109.     case PC_CLOSEPMAP:
  110.         pmap = (pmap_type) indata;
  111.  
  112.     /* Note: pmap onboard and onscreen is the embedded dispmap: don't free.*/
  113.         if (pmap != NULL && !(pmap->onboard && pmap->onscreen)) {
  114.             pmap->xpos = -1;/* This don't-care var. set <0 so pmap_Ok fails. */
  115.  
  116.             if (pcpmap_nplanes(pmap) <= 1) {
  117.                 if (pcpmap_pixbuf(pmap) != NULL) {
  118.                     ofree(OA_PMAPBUF, (VOID *) pcpmap_pixbuf(pmap));
  119.                 }
  120.             }
  121.             else {
  122.             /* If multiple plane buffers, free them all */
  123.                 planes = pcpmap_planes(pmap);
  124.                 for (iplane = pcpmap_nplanes(pmap) - 1; iplane >= 0; iplane--) {
  125.                     if (planes[iplane] != NULL) {
  126.                         ofree(OA_PMAPBUF, (VOID *) planes[iplane]);
  127.                     }
  128.                 }
  129.             }
  130.             ofree(OA_PMAP, (VOID *) pmap);
  131.         }
  132.         break;
  133.     case PC_CLEARPMAP:
  134.     {
  135.         pmapclearreq_struct *pmcr = (pmapclearreq_struct *) indata;
  136.  
  137.         pmap = pmcr->pmap;
  138.  
  139.         if (pmap != NULL && pmap->xdata != NULL) {
  140.             bsize = (unsigned) pcpmap_GetPlaneSize(pmap);
  141.  
  142.             if (pcpmap_nplanes(pmap) <= 1) {
  143.                 if (pcpmap_pixbuf(pmap) != NULL) {
  144.                     memset(pcpmap_pixbuf(pmap),
  145.                       (byte) pc_wordcolor(pmcr->color),
  146.                       bsize);
  147.                 }
  148.             }
  149.             else {
  150.                 planes = pcpmap_planes(pmap);
  151.                 for (iplane = pcpmap_nplanes(pmap) - 1; iplane >= 0; iplane--) {
  152.                     if (planes[iplane] != NULL) {
  153.                         memset(planes[iplane],
  154.                                 ((((byte) pmcr->color >> iplane) & 1) ? 0xFF : 0x00),
  155.                                 bsize);
  156.                     }
  157.                 }
  158.             }
  159.         }
  160.         break;
  161.     }
  162.     case PC_COPYPMAP:
  163.     {
  164.         pmapcopyreq_struct *pmcpr = (pmapcopyreq_struct *)indata;
  165.  
  166.         if (pcpmap_nplanes(pmcpr->spmap) == pcpmap_nplanes(pmcpr->dpmap) &&
  167.             pcpmap_GetPlaneSize(pmcpr->spmap) == pcpmap_GetPlaneSize(pmcpr->dpmap)
  168.             ) {
  169.  
  170.             if (pcpmap_nplanes(pmcpr->spmap) <= 1) {
  171.                 memmove((VOID *) pcpmap_pixbuf(pmcpr->dpmap),
  172.                         (VOID *) pcpmap_pixbuf(pmcpr->spmap),
  173.                         (unsigned) pcpmap_GetPlaneSize(pmcpr->spmap));
  174.             }
  175.             else {
  176.                 for (iplane = 0; iplane < pcpmap_nplanes(pmcpr->spmap); iplane++) {
  177.                     memmove((VOID *) pcpmap_planes(pmcpr->dpmap)[iplane],
  178.                             (VOID *) pcpmap_planes(pmcpr->spmap)[iplane],
  179.                             (unsigned) pcpmap_GetPlaneSize(pmcpr->spmap));
  180.                 }
  181.             }
  182.         }
  183.         break;
  184.     }
  185.     case PC_LOADPMAP:
  186.     case PC_SAVEPMAP:
  187.     case PC_PMAPTOBMAP:
  188.     case PC_BMAPTOPMAP:
  189.         return((*pmapioreq)(msg, indata, outdata));
  190.     }
  191.     return(TRUE);
  192. }
  193. /* -------------------------------------------------------------------------- */
  194.  
  195.