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

  1. /*
  2.     pmsplash.c
  3.  
  4.     % Load a splash image file into a pixel map structure.
  5.     NOTE !! : MUST BE COMPILED IN A LARGE DATA MODEL.
  6.  
  7.     3/11/88 By Ted.
  8.  
  9.     OWL 1.1
  10.     Copyright (c) 1988, 1989 by Oakland Group, Inc.
  11.     ALL RIGHTS RESERVED.
  12.  
  13.     Revision History:
  14.     -----------------
  15. */
  16.  
  17. #include "pcpriv.h"
  18. #include "splash.h"
  19.  
  20. /* bunrun.asm */
  21. extern unsigned DIGPRIV bunrun(_arg3(byte *pixbuf, unsigned size, long runcode));
  22.  
  23. OSTATIC S_LoadMask DIGPRIV oloadfile(_arg4(FILE *fd, S_LoadMask loadwhat, pmap_type *pmapp, ocolmap_type *cmapp));
  24. OSTATIC ocolmap_type DIGPRIV loadcolmap(_arg1(FILE *fd));
  25. OSTATIC pmap_type DIGPRIV loadpmap(_arg1(FILE *fd));
  26. OSTATIC boolean DIGPRIV pmap_unsqueeze(_arg1(pmap_type pm));
  27. /* -------------------------------------------------------------------------- */
  28.  
  29. pmap_type pmap_LoadSplash(fd, crange)
  30.     FILE *fd;                /* file descriptor of the splash image file */
  31.     ocolmap_type crange;    /* color range to use for the loaded image */
  32. /*
  33.     Allocates a pixel image map and fills it with the named splash image;
  34.  
  35.     The image map is an array of pixels organized
  36.     in the same fashion as the current display.
  37.  
  38.     Returns NULL if out of memory.
  39. */
  40. {
  41.     pmap_type pmap;
  42.     ocolmap_type cmap;
  43.  
  44.     pmap = NULL;
  45.     cmap = NULL;
  46.     oloadfile(fd, B_PIXMAP | B_COLMAP, &pmap, &cmap);
  47.  
  48.     /* Compress colors of pmap into given color range */
  49.     pc_squeezecmap(pmap, cmap, crange);
  50.     ocolmap_Close(cmap);
  51.  
  52.     return(pmap);
  53. /* -------------------------------------------------------------------------- */
  54. #define S_MAXTAGS 20
  55. /* -------------------------------------------------------------------------- */
  56.  
  57. static S_LoadMask DIGPRIV oloadfile(fd, loadwhat, pmapp, cmapp)
  58.     FILE *fd;
  59.     S_LoadMask loadwhat;
  60.     pmap_type *pmapp;
  61.     ocolmap_type *cmapp;
  62. {
  63.     int n;
  64.     S_FileHdr(S_MAXTAGS) hbuf;
  65.     S_FileHdr(S_MAXTAGS) *hdr;
  66.     S_TifPtr *iptr;
  67.     S_LoadMask loaded;
  68.  
  69.     if (fd == NULL) {
  70.         return(FALSE);
  71.     }
  72.     n = fread((VOID *)&hbuf, 1, sizeof(S_FileHdr(S_MAXTAGS)), fd);
  73.     if (n < sizeof(S_FileHdr(1))) {
  74.         return(FALSE);
  75.     }
  76.     hdr = (VOID *)&hbuf;
  77.  
  78.     if (hdr->ident != ID_SPLASH)
  79.  
  80.     if (hdr->nentries > S_MAXTAGS) hdr->nentries = S_MAXTAGS;
  81.  
  82.     loaded = 0;
  83.     for (iptr = &hdr->tags[0]; iptr < &hdr->tags [hdr->nentries]; iptr++) {
  84.         switch (iptr->tag) {
  85.          case T_PIXMAP:
  86.             if (!(loadwhat & B_PIXMAP)) break;
  87.             if (pmapp == NULL) break;
  88.             fseek(fd, iptr->foffset, SEEK_SET);
  89.             if ((*pmapp = loadpmap(fd)) != NULL) loaded |= B_PIXMAP;
  90.             else return(loaded);
  91.             break;
  92.          case T_COLMAP:
  93.             if (!(loadwhat & B_COLMAP)) break;
  94.             if (cmapp == NULL) break;
  95.             fseek(fd, iptr->foffset, SEEK_SET);
  96.             if ((*cmapp = loadcolmap(fd)) != NULL) loaded |= B_COLMAP;
  97.             else return(loaded);
  98.             break;
  99.         }
  100.         if (loaded == loadwhat) break;
  101.     }
  102.     return(loaded);
  103. }
  104. /* -------------------------------------------------------------------------- */
  105.  
  106. static ocolmap_type DIGPRIV loadcolmap(fd)
  107.     FILE *fd;
  108. {
  109.     S_Colmap(S_MaxColors) fcm;
  110.     S_Colmap(S_MaxColors) *cm;
  111.     ocolmap_type cmap;
  112.     int i;
  113.  
  114.     cm = (VOID *) &fcm;
  115.  
  116.     if (fread((VOID *)cm, 1, sizeof(S_Colmap(S_MaxColors)), fd) < 0)
  117.         return(FALSE);
  118.  
  119.     cmap = ocolmap_Open((opixval)cm->firstpix, (unsigned)cm->nentries);
  120.     if (cmap == NULL) {
  121.         return(NULL);
  122.     }
  123. /* copy colors into cmap */
  124.     for (i = 0; i < cm->nentries; i++) {
  125.         memmove(ocolmap_entry(cmap, cmap->firstpix + i),
  126.                 cm->rgblevs[cm->firstpix + i],
  127.                 sizeof(orgb_struct));
  128.     }
  129.     dig_shiftcmap(cmap, -2);
  130.     return(cmap);
  131. }
  132. /* -------------------------------------------------------------------------- */
  133.  
  134. static pmap_type DIGPRIV loadpmap(fd)
  135.     FILE *fd;
  136. {
  137.     S_Pixmap pmbuf;
  138.     S_Pixmap *pm;
  139.     pmap_type pmap;
  140.     unsigned n, rsize;
  141.  
  142. /* Read S_Pixmap structure */
  143.     pm = &pmbuf;
  144.     if (fread((VOID *)pm, 1, sizeof(S_Pixmap), fd) < 0) {
  145.         return(NULL);
  146.     }
  147. /* Allocate blank pmap */
  148.     pmap = pmap_Open(S_pmwidth(pm), S_pmheight(pm));
  149.     if (pmap == NULL) {
  150.         return(NULL);
  151.     }
  152. /* Fill the pmap */
  153.     switch (S_pmcomptype(pm)) {
  154.     case PMC_None:        /* Uncompressed pixmap */
  155.         if (fread((VOID *)pcpmap_pixbuf(pmap), 1,
  156.                         (unsigned)pcpmap_GetPlaneSize(pmap), fd) < 0) {
  157.             goto PMABORT;
  158.         }
  159.         break;
  160.     case PMC_Brun:        /* Compressed pixmap */
  161.         if ((n = fread((VOID *)pcpmap_pixbuf(pmap), 1,
  162.                             (unsigned)pcpmap_GetPlaneSize(pmap), fd)) < 0) {
  163.             goto PMABORT;
  164.         }
  165.         rsize = *((unsigned *) pcpmap_pixbuf(pmap));
  166.         if (n < rsize) {
  167.             goto PMABORT1;
  168.             }
  169.         if (!pmap_unsqueeze(pmap)) {
  170.             goto PMABORT1;
  171.             }
  172.         break;
  173.     default:
  174.         goto PMABORT1;
  175.     }
  176.     return(pmap);
  177.  
  178. PMABORT1:
  179. PMABORT:
  180.     pmap_Close(pmap);
  181.     return(NULL);
  182. }
  183. /* -------------------------------------------------------------------------- */
  184.  
  185. static boolean DIGPRIV pmap_unsqueeze(pmap)
  186.     pmap_type pmap;
  187. {
  188.     union {
  189.         struct runhdr {
  190.             unsigned rsize;
  191.             unsigned rcode;
  192.         } hs;
  193.         long runcode;
  194.     } rh;
  195.     unsigned bsize;
  196.     byte *pixbuf;
  197.  
  198.     pixbuf = pcpmap_pixbuf(pmap);
  199.  
  200.     memmove(&rh, pixbuf, 4);    /* extract header */
  201.  
  202.     memmove(pixbuf, pixbuf + 4, rh.hs.rsize);    /* slide down by 4 */
  203.  
  204.     bsize = bunrun(pixbuf, (unsigned)pcpmap_GetPlaneSize(pmap), rh.runcode);
  205.     if (bsize != (unsigned) pcpmap_GetPlaneSize(pmap)) ;    /* what can you do? */
  206.     
  207.     return(TRUE);
  208. }
  209. /* -------------------------------------------------------------------------- */
  210.  
  211.