home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / OWLSCR / PCSPLASH.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-01  |  5.3 KB  |  214 lines

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