home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / ppmtovort.c < prev    next >
C/C++ Source or Header  |  1993-08-25  |  4KB  |  215 lines

  1. /*
  2.  * ppm2vort.c - read a portable pixmap and produce a VORT file
  3.  * 
  4.  * Compile with: (In the tools directory)
  5.  *
  6.  *        cc -o ppmtovort ppmtovort.c -I../lib ../lib/libvort.a
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include "vort.h"
  11.  
  12. #define ASCII    111
  13. #define RAW    222
  14.  
  15. main(argc, argv)
  16.     int             argc;
  17.     char           *argv[];
  18. {
  19.  
  20.     FILE        *fp;
  21.     unsigned char    *r;
  22.     unsigned char    *g;
  23.     unsigned char    *b;
  24.     image        *im;
  25.     int        i, type, w, h, maxval;
  26.  
  27.     /*
  28.      * Read from file or stdin...
  29.      */
  30.     if (argc == 1)
  31.         fp = stdin;
  32.     else if ((fp = fopen(argv[1], "r")) == NULL) {
  33.         fprintf(stderr, "Couldn't open %s for reading.\n", argv[1]);
  34.         exit(1);
  35.     }
  36.  
  37.     type = readppmheader(fp, &w, &h, &maxval);
  38.  
  39.  
  40.     if ((r = (unsigned char *)malloc((unsigned)w)) == NULL) {
  41.         fprintf(stderr, "Out of mem.\n");
  42.         exit(1);
  43.     }
  44.     if ((g = (unsigned char *)malloc((unsigned)w)) == NULL) {
  45.         fprintf(stderr, "Out of mem.\n");
  46.         exit(1);
  47.     }
  48.     if ((b = (unsigned char *)malloc((unsigned)w)) == NULL) {
  49.         fprintf(stderr, "Out of mem.\n");
  50.         exit(1);
  51.     }
  52.  
  53.     /*
  54.      * Write to stdout....
  55.      */
  56.     if ((im = openimage("-", "w")) == (image *)NULL) {
  57.         fprintf(stderr, "Can't open '-' for output!\n");
  58.         exit(1);
  59.     }
  60.  
  61.     imageheight(im) = h;
  62.     imagewidth(im) = w;
  63.  
  64.     imagetitle(im) = "";
  65.     titlelength(im) = 0;
  66.     imagedate(im) = time(0L);
  67.  
  68.     /*
  69.      * We are going to write a 24bit VORT file anyway....
  70.      */
  71.  
  72.     imagetype(im) = PIX_RLE;
  73.     imagedepth(im) = 24;
  74.     writeheader(im);
  75.  
  76.     fprintf(stderr, "Writing 24 bit PIX_RLE VORT file....\n");
  77.  
  78.     for (i = 0; i < h; i++) {
  79.         readppmline(fp, type, w, r, g, b);
  80.         writergbline(im, r, g, b);
  81.     }
  82.  
  83.     closeimage(im);
  84.     fclose(fp);
  85.  
  86.     exit(0);
  87. }
  88.  
  89. /*
  90.  * Skips blanks and comments etc etc
  91.  */
  92. skipblanks(fp)
  93.     FILE    *fp;
  94. {
  95.     int    c;
  96.  
  97.     while((c = fgetc(fp)) == ' ' || c == '\t' || c == '\n')
  98.                 /* NOTHING */;
  99.  
  100.     if (c == EOF) {
  101.         fprintf(stderr, "EOF found in ppmfile!\n");
  102.         exit(1);
  103.     }
  104.  
  105.     if (c == '#') {
  106.         while((c = fgetc(fp)) != '\n')
  107.             /* NOTHING */;
  108.     } else {
  109.         ungetc(c, fp);
  110.     }
  111. }
  112.  
  113. int
  114. readppmheader(fp, w, h, maxval)
  115.     FILE    *fp;
  116.     int    *w, *h, *maxval;
  117. {
  118.     int    type, c;
  119.  
  120.     skipblanks(fp);
  121.  
  122.     if ((c = fgetc(fp)) == 'P')
  123.         c = fgetc(fp);
  124.     else {
  125.         fprintf(stderr, "Bad header in ppm file.\n");
  126.         exit(1);
  127.     }
  128.  
  129.     if (c == '3')
  130.         type = ASCII;
  131.     else if (c == '6')
  132.         type = RAW;
  133.     else {
  134.         fprintf(stderr, "Unknown ppm type 'P%c'.\n", c);
  135.         exit(1);
  136.     }
  137.  
  138.     skipblanks(fp);
  139.  
  140.     if (fscanf(fp, "%d", w) != 1) {
  141.         fprintf(stderr, "Error reading width.\n");
  142.         exit(1);
  143.     }
  144.  
  145.     skipblanks(fp);
  146.  
  147.     if (fscanf(fp, "%d", h) != 1) {
  148.         fprintf(stderr, "Error reading height.\n");
  149.         exit(1);
  150.     }
  151.     
  152.     skipblanks(fp);
  153.  
  154.     if (fscanf(fp, "%d", maxval) != 1) {
  155.         fprintf(stderr, "Error reading maxval.\n");
  156.         exit(1);
  157.     }
  158.  
  159.     if (*maxval > 255) {
  160.         fprintf(stderr, "can't handle maxval > 255.\n");
  161.         exit(1);
  162.     }
  163.  
  164.     skipblanks(fp);
  165.  
  166.     return(type);
  167. }
  168.  
  169. /*
  170.  * Read the ppm data into r, g and b arrays for one line.
  171.  */
  172. readppmline(fp, type, w, r, g, b)
  173.     FILE    *fp;
  174.     int    type;
  175.     int    w;
  176.     unsigned char    *r, *g, *b;
  177. {
  178.     int    c, i, rdata, gdata, bdata;
  179.  
  180.     switch(type) {
  181.     case ASCII:
  182.         for (i = 0; i < w; i++) {
  183.             if (fscanf(fp, "%d %d %d", &rdata, &gdata, &bdata) != 3) {
  184.                 fprintf(stderr, "Error reading ASCII integer data from ppm file.\n");
  185.                 exit(1);
  186.             }
  187.  
  188.             r[i] = (unsigned char)rdata;
  189.             g[i] = (unsigned char)gdata;
  190.             b[i] = (unsigned char)bdata;
  191.         }
  192.         break;
  193.     case RAW:
  194.         for (i = 0; i < w; i++) {
  195.             if ((c = fgetc(fp)) == EOF) {
  196.                 fprintf(stderr, "EOF read in raw ppm file.\n");
  197.                 exit(1);
  198.             }
  199.             r[i] = (unsigned char)c;
  200.  
  201.             if ((c = fgetc(fp)) == EOF) {
  202.                 fprintf(stderr, "EOF read in raw ppm file.\n");
  203.                 exit(1);
  204.             }
  205.             g[i] = (unsigned char)c;
  206.  
  207.             if ((c = fgetc(fp)) == EOF) {
  208.                 fprintf(stderr, "EOF read in raw ppm file.\n");
  209.                 exit(1);
  210.             }
  211.             b[i] = (unsigned char)c;
  212.         }
  213.     }
  214.     }
  215.