home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 564a.lha / wasp_v1.21 / Src.LZH / Src / ppm.c < prev    next >
C/C++ Source or Header  |  1991-07-24  |  2KB  |  103 lines

  1. /* wasp - copyright 1991 by Steven Reiz
  2.  * see wasp.c for further info,
  3.  * ppm.c, 24/7/91
  4.  */
  5.  
  6. #include "wasp.h"
  7. /* #include "ppm.sh" */
  8.  
  9. static char typ[3];
  10. static long depth;
  11.  
  12. #ifdef __STDC__
  13. read_ppm(void)
  14. #else
  15. read_ppm()
  16. #endif
  17. {
  18.     char c;
  19.     int y;
  20.  
  21.     cread(typ, 3);
  22.     if (typ[0]!='P' || typ[1]<'0' || typ[1]>'9' || typ[2]!='\n') {
  23.         lseek(infd, 0L, 0);
  24.         return 0;
  25.     }
  26.     typ[2]='\0';
  27.     xsz=getn(' ');
  28.     ysz=getn('\n');
  29.     depth=getn('\n')+1;
  30.     printf("PPM/%s input; %ld x %ld, depth: %ld\n", typ, xsz, ysz, depth);
  31.     fflush(stdout);
  32.     if (!outfilename)
  33.         exit(0);
  34.     if (typ[1]!='6') {
  35.         printe("types other than P6 are not supported\n");
  36.         exit(1);
  37.     }
  38.     if (depth!=256) {
  39.         printe("depths other than 256 are not supported\n");
  40.         exit(1);
  41.     }
  42.     rgb=Malloc(ysz*sizeof(u_short *));
  43.     for (y=0; y<ysz; ++y)
  44.             rgb[y]=Malloc(xsz*sizeof(u_short));
  45.     read_rgb24();
  46.     return 1;
  47. }
  48.  
  49.  
  50. #ifdef __STDC__
  51. PRIVATE int getn(char terminator)
  52. #else
  53. PRIVATE int getn(terminator)
  54. char terminator;
  55. #endif
  56. {
  57.     int n;
  58.     char c;
  59.  
  60.     n=0;
  61.     while (1) {
  62.         cread(&c, 1);
  63.         if (c<'0' || c>'9')
  64.             break;
  65.         n=10*n+c-'0';
  66.     }
  67.     assert(c==terminator);
  68.     return n;
  69. }
  70.  
  71.  
  72. #ifdef __STDC__
  73. read_rgb24(void)
  74. #else
  75. read_rgb24()
  76. #endif
  77. {
  78.     char *buf;
  79.     int width, color;
  80.     int y, x;
  81.     char *bufp;
  82.     u_short *p;
  83.     
  84.     width=xsz*3;
  85.     buf=Malloc(width);
  86.     init_counter(0, (int)ysz, 10, NULL);
  87.     for (y=0; y<ysz; ++y) {
  88.         counter();
  89.         cread(buf, width);
  90.         x=xsz-1;
  91.         bufp=buf;
  92.         p=rgb[y];
  93.         do {
  94.             color=(*bufp++ & 0xf0)<<4;
  95.             color|= *bufp++ & 0xf0;
  96.             color|=(*bufp++ >>4) & 0x0f;
  97.             *p++ =color;
  98.         } while (--x>=0);
  99.     }
  100.     erase_counter(NULL);
  101.     free(buf);
  102. }
  103.