home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / PCPMAP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-06  |  5.0 KB  |  187 lines

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