home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 580b.lha / Wasp_v1.23 / src.LZH / src / ppm.c < prev    next >
C/C++ Source or Header  |  1991-11-15  |  3KB  |  208 lines

  1. /* wasp - copyright 1991 by Steven Reiz
  2.  * see wasp.c for further info,
  3.  * ppm.c, 24/7/91, 22/10/91 - 25/10/91
  4.  */
  5.  
  6. #include "wasp.h"
  7. /* #include "ppm.sh" */
  8.  
  9. #ifdef __STDC__
  10. read_ppm(void)
  11. #else
  12. read_ppm()
  13. #endif
  14. {
  15.     char c;
  16.     int y;
  17.     long depth;
  18.     char typ[3];
  19.  
  20.     cread(typ, 3);
  21.     if (typ[0]!='P' || typ[1]<'0' || typ[1]>'9' || typ[2]!='\n') {
  22.         lseek(infd, 0L, 0);
  23.         return 0;
  24.     }
  25.     typ[2]='\0';
  26.     xsz=getn(' ');
  27.     ysz=getn('\n');
  28.     depth=getn('\n')+1;
  29.     printf("PPM/%s input; %ld x %ld, depth: %ld\n", typ, xsz, ysz, depth);
  30.     fflush(stdout);
  31.     if (!outfilename)
  32.         exit(0);
  33.     if (depth!=256) {
  34.         printe("depths other than 256 are not supported\n");
  35.         exit(1);
  36.     }
  37.     rgb=Malloc(ysz*sizeof(u_short *));
  38.     for (y=0; y<ysz; ++y)
  39.             rgb[y]=Malloc(xsz*sizeof(u_short));
  40.     switch (typ[1]) {
  41.     case '5':
  42.         read_grey8();
  43.     break;
  44.     case '6':
  45.         read_rgb24();
  46.     break;
  47.     default:
  48.         printe("types other than P5 or P6 are not supported\n");
  49.         exit(1);
  50.     break;
  51.     }
  52.     return 1;
  53. }
  54.  
  55.  
  56. #ifdef __STDC__
  57. write_ppm(void)
  58. #else
  59. write_ppm()
  60. #endif
  61. {
  62.     printf("PPM/P6 output; %ld x %ld, depth: 256\n", xsz, ysz);
  63.     cwrite("P6\n", 3);
  64.     putn((int)xsz);
  65.     cwrite(" ", 1);
  66.     putn((int)ysz);
  67.     cwrite("\n255\n", 5);
  68.     write_rgb24();
  69.     erase_counter("PPM file written, %ld bytes", lseek(outfd, 0L, 1));
  70. }
  71.  
  72.  
  73. #ifdef __STDC__
  74. PRIVATE int getn(char terminator)
  75. #else
  76. PRIVATE int getn(terminator)
  77. char terminator;
  78. #endif
  79. {
  80.     int n;
  81.     char c;
  82.  
  83.     n=0;
  84.     while (1) {
  85.         cread(&c, 1);
  86.         if (c<'0' || c>'9')
  87.             break;
  88.         n=10*n+c-'0';
  89.     }
  90.     assert(c==terminator);
  91.     return n;
  92. }
  93.  
  94.  
  95. #ifdef __STDC__
  96. PRIVATE int putn(int n)
  97. #else
  98. PRIVATE int getn(n)
  99. int n;
  100. #endif
  101. {
  102.     int i;
  103.     char line[20];
  104.  
  105.     i=19;
  106.     do {
  107.         line[i--]=n%10+'0';
  108.         n/=10;
  109.     } while (n>0);
  110.     cwrite(line+i+1, 19-i);
  111. }
  112.  
  113.  
  114. #ifdef __STDC__
  115. read_rgb24(void)
  116. #else
  117. read_rgb24()
  118. #endif
  119. {
  120.     char *buf;
  121.     int width, color;
  122.     int y, x;
  123.     char *bufp;
  124.     u_short *p;
  125.     
  126.     width=xsz*3;
  127.     buf=Malloc(width);
  128.     init_counter(0, (int)ysz, 10, NULL);
  129.     for (y=0; y<ysz; ++y) {
  130.         counter();
  131.         cread(buf, width);
  132.         x=xsz-1;
  133.         bufp=buf;
  134.         p=rgb[y];
  135.         do {
  136.             color=(*bufp++ & 0xf0)<<4;
  137.             color|= *bufp++ & 0xf0;
  138.             color|=(*bufp++ >>4) & 0x0f;
  139.             *p++ =color;
  140.         } while (--x>=0);
  141.     }
  142.     erase_counter(NULL);
  143.     free(buf);
  144. }
  145.  
  146.  
  147. #ifdef __STDC__
  148. read_grey8(void)
  149. #else
  150. read_grey8()
  151. #endif
  152. {
  153.     char *buf;
  154.     int color;
  155.     int y, x;
  156.     char *bufp;
  157.     u_short *p;
  158.     
  159.     buf=Malloc((int)xsz);
  160.     init_counter(0, (int)ysz, 10, NULL);
  161.     for (y=0; y<ysz; ++y) {
  162.         counter();
  163.         cread(buf, (int)xsz);
  164.         x=xsz-1;
  165.         bufp=buf;
  166.         p=rgb[y];
  167.         do {
  168.             color= *bufp++ & 0xf0;
  169.             color|=(color<<4)|(color>>4);
  170.             *p++ =color;
  171.         } while (--x>=0);
  172.     }
  173.     erase_counter(NULL);
  174.     free(buf);
  175. }
  176.  
  177.  
  178. #ifdef __STDC__
  179. write_rgb24(void)
  180. #else
  181. write_rgb24()
  182. #endif
  183. {
  184.     char *buf;
  185.     int width, color;
  186.     int y, x;
  187.     char *bufp;
  188.     u_short *p;
  189.     
  190.     width=xsz*3;
  191.     buf=Malloc(width);
  192.     init_counter(0, (int)ysz, 10, NULL);
  193.     for (y=0; y<ysz; ++y) {
  194.         counter();
  195.         x=xsz-1;
  196.         bufp=buf;
  197.         p=rgb[y];
  198.         do {
  199.             color= *p++;
  200.             *bufp++ =(color>>4)&0xf0;
  201.             *bufp++ =color&0xf0;
  202.             *bufp++ =color<<4;
  203.         } while (--x>=0);
  204.         cwrite(buf, width);
  205.     }
  206.     free(buf);
  207. }
  208.