home *** CD-ROM | disk | FTP | other *** search
/ Fractal Frenzy 1 / WalnutCreekFractalFrenzy-1.iso / pc / viewers / x11 / xloadimg.tz / xloadimg / cmuwmraster.c < prev    next >
C/C++ Source or Header  |  1991-05-20  |  3KB  |  156 lines

  1. /*
  2.  *
  3.  * handle CMU Window Manager (ITC) raster image type
  4.  *
  5.  * dan lovinger (dl2n+@andrew.cmu.edu) 07.11.90
  6.  *
  7.  * the format is essentially a byte-reversed sun raster w/o encoding
  8.  *
  9.  * Copyright 1989 Jim Frost.  See included file "copyright.h" for complete
  10.  * copyright information.
  11.  */
  12.  
  13. #include "copyright.h"
  14. #include "image.h"
  15. #include "cmuwmraster.h"
  16.  
  17. /* SUPPRESS 558 */
  18.  
  19. int babble(name, headerp)
  20. char *name;
  21. struct cmuwm_header *headerp;
  22. {
  23.     printf("%s is a %dx%d %d plane CMU WM raster\n",
  24.        name,
  25.        memToVal(headerp->width, sizeof(long)),
  26.        memToVal(headerp->height, sizeof(long)),
  27.        memToVal(headerp->depth, sizeof(short)));
  28. }
  29.  
  30. int cmuwmIdent(fullname, name)
  31. char *fullname, *name;
  32. {
  33.     ZFILE *zf;
  34.     struct cmuwm_header header;
  35.     int r;
  36.  
  37.     if (!(zf = zopen(fullname)))
  38.       {
  39.       perror("cmuwmIdent");
  40.       return(0);
  41.       }
  42.  
  43.     switch (zread(zf, (byte *)&header, sizeof(struct cmuwm_header)))
  44.       {
  45.       case -1:
  46.       perror("cmuwmIdent");
  47.       r =0;
  48.       break;
  49.  
  50.       case sizeof(struct cmuwm_header):
  51.     if (memToVal(header.magic, sizeof(long)) != CMUWM_MAGIC)
  52.       {
  53.           r = 0;
  54.           break;
  55.       }
  56.       babble(name, &header);
  57.       r = 1;
  58.       break;
  59.  
  60.       default:
  61.       r = 0;
  62.       break;
  63.       }
  64.  
  65.     zclose(zf);
  66.  
  67.     return r;
  68. }
  69.  
  70. Image* cmuwmLoad(fullname, name, verbose)
  71. char *fullname, *name;
  72. unsigned int verbose;
  73. {
  74.     ZFILE *zf;
  75.     struct cmuwm_header header;
  76.     Image *image;
  77.     int height, width, row, linelen, r;
  78.     byte *lineptr;
  79.  
  80.     if (!(zf= zopen(fullname))) 
  81.       {
  82.       perror("cmuwmLoad");
  83.       return(NULL);
  84.       }
  85.  
  86.     switch (zread(zf, (byte *)&header, sizeof(struct cmuwm_header))) 
  87.       {
  88.       case -1:
  89.       perror("cmuwmLoad");
  90.       zclose(zf);
  91.       exit(1);
  92.  
  93.       case sizeof(struct cmuwm_header):
  94.       if (memToVal(header.magic, sizeof(long)) != CMUWM_MAGIC)
  95.         {
  96.         zclose(zf);
  97.         return(NULL);
  98.         }
  99.       if (verbose) babble(name, &header);
  100.       break;
  101.  
  102.       default:
  103.       zclose(zf);
  104.       return(NULL);
  105.       }
  106.  
  107.     if (memToVal(header.depth, sizeof(short)) != 1)
  108.       {
  109.       fprintf(stderr,"CMU WM raster %s is of depth %d, must be 1",
  110.           name,
  111.           header.depth);
  112.       return(NULL);
  113.       }
  114.  
  115.     image = newBitImage(width = memToVal(header.width, sizeof(long)),
  116.             height = memToVal(header.height, sizeof(long)));
  117.  
  118.     linelen = (width / 8) + (width % 8 ? 1 : 0);
  119.     lineptr = image->data;
  120.  
  121.     for (row = 0; row < height; row++)
  122.       {
  123.       r = zread(zf, lineptr, linelen);
  124.  
  125.       if (r == -1)
  126.         {
  127.         perror("cmuwmLoad");
  128.         exit(1);
  129.         }
  130.       
  131.       if (r != linelen)
  132.         {
  133.         printf("cmuwmLoad: short raster\n");
  134.         exit(1);
  135.         }
  136.  
  137.       for (r = 0; r < linelen; r++)
  138.         {
  139.         lineptr[r] ^= 0xff;
  140.         }
  141.  
  142.       lineptr += linelen;
  143.       }
  144.  
  145.     zclose(zf);
  146.  
  147.     image->title = dupString(name);
  148.  
  149.     return image;
  150. }
  151.  
  152.       
  153.  
  154.  
  155.  
  156.