home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / scripts / image / octtopnm.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  7KB  |  305 lines

  1. # /*
  2. cc -s -o octtopnm octtopnm.c
  3. exit
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9.  
  10. /* usage: octtopnm [-a] octfile */
  11.  
  12. static void usage(message)
  13. char *message;
  14. {
  15.   if(message != NULL) {
  16.     fprintf(stderr,"octtopnm: %s\n",message);
  17.   }
  18.   fprintf(stderr,"usage: octtopnm [-a] octavefile\n");
  19.   exit(1);
  20. }
  21.  
  22. static void fatal(message)
  23. char *message;
  24. {
  25.   if(message != NULL) {
  26.     fprintf(stderr,"octtopnm: %s\n",message);
  27.   }
  28.   exit(1);
  29. }
  30.  
  31. int main(argc, argv)
  32. int argc;
  33. char **argv;
  34. {
  35.   int rawbits = 1, row, col, index;
  36.   int cmap_rows, cmap_cols, img_rows, img_cols;
  37.   int gray, pbm, pgm, ppm;
  38.   unsigned char **rgb, byte;
  39.   unsigned short **img;
  40.   char *oct_file_name;
  41.   FILE *oct_file;
  42.   char cmap_name[4], cmap_type[7], img_name[2], img_type[7];
  43.   double mat_val;
  44.   int option;
  45.   extern char *optarg;
  46.   extern int optind;
  47.  
  48.   if(argc == 1) {
  49.     usage(NULL);
  50.   }
  51.  
  52.   while((option = getopt(argc,argv,"ha")) != EOF) {
  53.     switch(option) {
  54.     case 'h':
  55.       /* help */
  56.       usage(NULL);
  57.       break;
  58.     case 'a':
  59.       rawbits = 0;
  60.       break;
  61.     case '?':
  62.     default:
  63.       usage("unrecognized option");
  64.     }
  65.   }
  66.  
  67.   if(optind+1 != argc) {
  68.     usage("input file name missing");
  69.   }
  70.  
  71.   oct_file_name = argv[optind];
  72.   if((oct_file = fopen(oct_file_name,"r")) == NULL) {
  73.     fatal("unable to open input file");
  74.   }
  75.  
  76.   if(fscanf(oct_file,"# name: %s\n",cmap_name) != 1 || 
  77.      strcmp(cmap_name,"map") != 0) {
  78.     fatal("not a valid octave image file");
  79.   }
  80.  
  81.   if(fscanf(oct_file,"# type: %s\n",cmap_type) != 1 || 
  82.      strcmp(cmap_type,"matrix") != 0) {
  83.     fatal("not a valid octave image file");
  84.   }
  85.  
  86.   if(fscanf(oct_file,"# rows: %d\n",&cmap_rows) != 1) {
  87.     fatal("error reading octave image file");
  88.   }
  89.  
  90.   if(fscanf(oct_file,"# columns: %d\n",&cmap_cols) != 1) {
  91.     fatal("error reading octave image file");
  92.   }
  93.  
  94.   if(cmap_cols != 3) {
  95.     fatal("invalid color map in octave image file");
  96.   }
  97.  
  98.   if((rgb = (unsigned char **)
  99.       malloc(cmap_rows*sizeof(unsigned char *))) == NULL) {
  100.     fatal("out of memory");
  101.   }
  102.  
  103.   if((rgb[0] = (unsigned char *)
  104.       malloc(cmap_rows*cmap_cols*sizeof(unsigned char))) == NULL) {
  105.     fatal("out of memory");
  106.   }
  107.  
  108.   for(row=1; row<cmap_rows; row++) {
  109.     rgb[row] = rgb[row-1]+3;
  110.   }
  111.  
  112.   gray = 1;
  113.   for(row=0; row<cmap_rows; row++) {
  114.     for(col=0; col<cmap_cols; col++) {
  115.       if(fscanf(oct_file,"%lf",&mat_val) != 1) {
  116.         fatal("error reading color map entries");
  117.       }
  118.       if(mat_val < 0) mat_val = 0.;
  119.       if(mat_val > 1) mat_val = 1.;
  120.       rgb[row][col] = mat_val*255;
  121.     }
  122.     if(gray) {
  123.       if(rgb[row][0] != rgb[row][1] || rgb[row][0] != rgb[row][2]) {
  124.         /* It's a color image. */
  125.         gray = 0;
  126.       }
  127.     }
  128.   }
  129.  
  130.   if(fscanf(oct_file,"\n# name: %s\n",img_name) != 1 || 
  131.      strcmp(img_name,"X") != 0) {
  132.     fatal("not a valid octave image file");
  133.   }
  134.  
  135.   if(fscanf(oct_file,"# type: %s\n",img_type) != 1 || 
  136.      strcmp(img_type,"matrix") != 0) {
  137.     fatal("not a valid octave image file");
  138.   }
  139.  
  140.   if(fscanf(oct_file,"# rows: %d\n",&img_rows) != 1) {
  141.     fatal("error reading octave image file");
  142.   }
  143.  
  144.   if(fscanf(oct_file,"# columns: %d\n",&img_cols) != 1) {
  145.     fatal("error reading octave image file");
  146.   }
  147.  
  148.   if((img = (unsigned short **)
  149.       malloc(img_rows*sizeof(unsigned short *))) == NULL) {
  150.     fatal("out of memory");
  151.   }
  152.  
  153.   if((img[0] = (unsigned short *)
  154.       malloc(img_rows*img_cols*sizeof(unsigned short))) == NULL) {
  155.     fatal("out of memory");
  156.   }
  157.  
  158.   for(row=1; row<img_rows; row++) {
  159.     img[row] = img[row-1]+img_cols;
  160.   }
  161.  
  162.   for(row=0; row<img_rows; row++) {
  163.     for(col=0; col<img_cols; col++) {
  164.       if(fscanf(oct_file,"%lf",&mat_val) != 1) {
  165.         fatal("error reading color map entries");
  166.       }
  167.       if(mat_val < 1) mat_val = 1.;
  168.       if(mat_val > cmap_rows) mat_val = cmap_rows;
  169.       img[row][col] = mat_val;
  170.     }
  171.   }
  172.  
  173.   pbm = pgm = ppm = 0;
  174.  
  175.   if(cmap_rows == 2 && gray && 
  176.      ((rgb[0][0] == 0 && rgb[1][0] == 255) ||
  177.       (rgb[0][0] == 255 && rgb[1][0] == 0))) {
  178.     /* Create a bitmap only if there are two colormap entries and they are
  179.        black and white. */
  180.     pbm = 1;
  181.   }
  182.   else if(gray) {
  183.     /* If not a bitmap, create a gray scale image if the entries within
  184.        each row of the color map are equal. */
  185.     pgm = 1;
  186.   }
  187.   else {
  188.     /* Otherwise create a full color image. */
  189.     ppm = 1;
  190.   }
  191.  
  192.   if(rawbits) {
  193.     if(pbm) {
  194.       printf("P4\n");
  195.       printf("%d %d\n",img_cols,img_rows);
  196.       index = 0;
  197.       for(row=0; row<img_rows; row++) {
  198.         for(col=0; col<img_cols; col++) {
  199.           if(index == 7) {
  200.             byte = (byte << 1) + !rgb[img[row][col]-1][0];
  201.             fwrite(&byte,sizeof(unsigned char),1,stdout);
  202.             byte = 0;
  203.             index = 0;
  204.           }
  205.           else {
  206.             byte = (byte << 1) + !rgb[img[row][col]-1][0];
  207.             index++;
  208.           }
  209.         }
  210.       }
  211.       if(index != 0) {
  212.         printf("\n");
  213.       }
  214.     }
  215.     else if(pgm) {
  216.       printf("P5\n");
  217.       printf("%d %d\n",img_cols,img_rows);
  218.       printf("255\n");
  219.       for(row=0; row<img_rows; row++) {
  220.         for(col=0; col<img_cols; col++) {
  221.           fwrite(rgb[img[row][col]-1],sizeof(unsigned char),1,stdout);
  222.         }
  223.       }
  224.     }
  225.     else {
  226.       printf("P6\n");
  227.       printf("%d %d\n",img_cols,img_rows);
  228.       printf("255\n");
  229.       for(row=0; row<img_rows; row++) {
  230.         for(col=0; col<img_cols; col++) {
  231.           fwrite(rgb[img[row][col]-1],sizeof(unsigned char),3,stdout);
  232.         }
  233.       }
  234.     }
  235.   }
  236.   else {
  237.     if(pbm) {
  238.       printf("P1\n");
  239.       printf("%d %d\n",img_cols,img_rows);
  240.       index = 0;
  241.       for(row=0; row<img_rows; row++) {
  242.         for(col=0; col<img_cols; col++) {
  243.           if(index == 30) {
  244.             printf("%d\n",!rgb[img[row][col]-1][0]);
  245.             index = 0;
  246.           }
  247.           else {
  248.             printf("%d ",!rgb[img[row][col]-1][0]);
  249.             index++;
  250.           }
  251.         }
  252.       }
  253.       if(index != 0) {
  254.         printf("\n");
  255.       }
  256.     }
  257.     else if(pgm) {
  258.       printf("P2\n");
  259.       printf("%d %d\n",img_cols,img_rows);
  260.       printf("255\n");
  261.       index = 0;
  262.       for(row=0; row<img_rows; row++) {
  263.         for(col=0; col<img_cols; col++) {
  264.           if(index == 12) {
  265.             printf("%d\n",rgb[img[row][col]-1][0]);
  266.             index = 0;
  267.           }
  268.           else {
  269.             printf("%d ",rgb[img[row][col]-1][0]);
  270.             index++;
  271.           }
  272.         }
  273.       }
  274.       if(index != 0) {
  275.         printf("\n");
  276.       }
  277.     }
  278.     else {
  279.       printf("P3\n");
  280.       printf("%d %d\n",img_cols,img_rows);
  281.       printf("255\n");
  282.       index = 0;
  283.       for(row=0; row<img_rows; row++) {
  284.         for(col=0; col<img_cols; col++) {
  285.           if(index == 4) {
  286.             printf("%d %d %d\n",rgb[img[row][col]-1][0],
  287.                    rgb[img[row][col]-1][1],rgb[img[row][col]-1][2]);
  288.             index = 0;
  289.           }
  290.           else {
  291.             printf("%d %d %d ",rgb[img[row][col]-1][0],
  292.                    rgb[img[row][col]-1][1],rgb[img[row][col]-1][2]);
  293.             index++;
  294.           }
  295.         }
  296.       }
  297.       if(index != 0) {
  298.         printf("\n");
  299.       }
  300.     }
  301.   }
  302.  
  303.   return 0;
  304. }
  305.