home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Viewers / aa_m68k_Intel_Only / ToyViewer1.2 / Source / ppmwrite.c < prev    next >
Encoding:
Text File  |  1995-11-12  |  1.3 KB  |  64 lines

  1. #import <stdio.h>
  2. #import "ppm.h"
  3. #import "save.h"
  4.  
  5. int ppmwrite(FILE *fp, commonInfo *cinf, unsigned char **planes)
  6. {
  7.     int max = 255, sft = 0, n;
  8.     int r, g, b;
  9.  
  10.     switch (cinf->bits) {
  11.     case 1: max = 1;  sft = 7;  break;
  12.     case 2: max = 3;  sft = 6;  break;
  13.     case 4: max = 15;  sft = 4;  break;
  14.     case 8: max = 255;  sft = 0;  break;
  15.     }
  16.  
  17.     if (cinf->numcolors > 1) { /* color */
  18.         /* PPM Binary */
  19.         fprintf(fp, "P6\n%d %d %d\n", cinf->width, cinf->height, max);
  20.         n = cinf->width * cinf->height;
  21.         if (sft)
  22.             while (n-- > 0) {
  23.                 (void) getPixel(&r, &g, &b);
  24.                 putc(r >> sft, fp);
  25.                 putc(g >> sft, fp);
  26.                 putc(b >> sft, fp);
  27.             }
  28.         else
  29.             while (n-- > 0) {
  30.                 (void) getPixel(&r, &g, &b);
  31.                 putc(r, fp);
  32.                 putc(g, fp);
  33.                 putc(b, fp);
  34.             }
  35.     }else if (max == 1) { /* Bi-Level */
  36.         /* PBM Binary */
  37.         int x = (cinf->width + 7) >> 3;
  38.         int y = cinf->height;
  39.         unsigned char *p = planes[0];
  40.         fprintf(fp, "P4\n%d %d\n", cinf->width, cinf->height);
  41.         while (y-- > 0) {
  42.             for (n = 0; n < x; n++)
  43.                 putc(p[n], fp);
  44.             p += cinf->xbytes;
  45.         }
  46.     }else { /* Gray */
  47.         /* PGM Binary */
  48.         fprintf(fp, "P5\n%d %d %d\n", cinf->width, cinf->height, max);
  49.         n = cinf->width * cinf->height;
  50.         if (sft)
  51.             while (n-- > 0) {
  52.                 (void) getPixel(&r, &g, &b);
  53.                 putc(r >> sft, fp);
  54.             }
  55.         else
  56.             while (n-- > 0) {
  57.                 (void) getPixel(&r, &g, &b);
  58.                 putc(r, fp);
  59.             }
  60.     }
  61.     return 0;
  62. }
  63.  
  64.