home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / radsrc22 / src / px / ra_pr24.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-30  |  5.3 KB  |  227 lines

  1. /* Copyright (c) 1992 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)ra_pr24.c 2.6 10/30/92 LBL";
  5. #endif
  6.  
  7. /*
  8.  *  program to convert between RADIANCE and 24-bit rasterfiles.
  9.  */
  10.  
  11. #include  <stdio.h>
  12.  
  13. #ifdef MSDOS
  14. #include  <fcntl.h>
  15. #endif
  16.  
  17. #include  <math.h>
  18.  
  19. #include  "rasterfile.h"
  20.  
  21. #include  "color.h"
  22.  
  23. #include  "resolu.h"
  24.  
  25. extern char  *malloc();
  26.  
  27. double    gamcor = 2.2;            /* gamma correction */
  28.  
  29. int  bradj = 0;                /* brightness adjustment */
  30.  
  31. char  *progname;
  32.  
  33. int  xmax, ymax;
  34.  
  35.  
  36. main(argc, argv)
  37. int  argc;
  38. char  *argv[];
  39. {
  40.     struct rasterfile  head;
  41.     int  reverse = 0;
  42.     int  i;
  43. #ifdef MSDOS
  44.     extern int  _fmode;
  45.     _fmode = O_BINARY;
  46.     setmode(fileno(stdin), O_BINARY);
  47.     setmode(fileno(stdout), O_BINARY);
  48. #endif
  49.     progname = argv[0];
  50.  
  51.     head.ras_type = RT_STANDARD;
  52.     for (i = 1; i < argc; i++)
  53.         if (argv[i][0] == '-')
  54.             switch (argv[i][1]) {
  55.             case 'g':
  56.                 gamcor = atof(argv[++i]);
  57.                 break;
  58.             case 'e':
  59.                 if (argv[i+1][0] != '+' && argv[i+1][0] != '-')
  60.                     goto userr;
  61.                 bradj = atoi(argv[++i]);
  62.                 break;
  63.             case 'r':
  64.                 if (!strcmp(argv[i], "-rgb"))
  65.                     head.ras_type = RT_FORMAT_RGB;
  66.                 else
  67.                     reverse = 1;
  68.                 break;
  69.             default:
  70.                 goto userr;
  71.             }
  72.         else
  73.             break;
  74.  
  75.     if (i < argc-2)
  76.         goto userr;
  77.     if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) {
  78.         fprintf(stderr, "%s: can't open input \"%s\"\n",
  79.                 progname, argv[i]);
  80.         exit(1);
  81.     }
  82.     if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) {
  83.         fprintf(stderr, "can't open output \"%s\"\n",
  84.                 progname, argv[i+1]);
  85.         exit(1);
  86.     }
  87.     setcolrgam(gamcor);
  88.     if (reverse) {
  89.                     /* get header */
  90.         if (fread((char *)&head, sizeof(head), 1, stdin) != 1)
  91.             quiterr("missing header");
  92.         if (head.ras_magic != RAS_MAGIC)
  93.             quiterr("bad raster format");
  94.         xmax = head.ras_width;
  95.         ymax = head.ras_height;
  96.         if ((head.ras_type != RT_STANDARD
  97.                     && head.ras_type != RT_FORMAT_RGB)
  98.                 || head.ras_maptype != RMT_NONE
  99.                 || head.ras_depth != 24)
  100.             quiterr("incompatible format");
  101.                     /* put header */
  102.         printargs(i, argv, stdout);
  103.         fputformat(COLRFMT, stdout);
  104.         putchar('\n');
  105.         fprtresolu(xmax, ymax, stdout);
  106.                     /* convert file */
  107.         pr2ra(head.ras_type, head.ras_length/ymax - xmax*3);
  108.     } else {
  109.                     /* get header info. */
  110.         if (checkheader(stdin, COLRFMT, NULL) < 0 ||
  111.                 fgetresolu(&xmax, &ymax, stdin) < 0)
  112.             quiterr("bad picture format");
  113.                     /* write rasterfile header */
  114.         head.ras_magic = RAS_MAGIC;
  115.         head.ras_width = xmax + (xmax&1);
  116.         head.ras_height = ymax;
  117.         head.ras_depth = 24;
  118.         head.ras_length = head.ras_width*head.ras_height*3;
  119.         head.ras_maptype = RMT_NONE;
  120.         head.ras_maplength = 0;
  121.         fwrite((char *)&head, sizeof(head), 1, stdout);
  122.                     /* convert file */
  123.         ra2pr(head.ras_type, head.ras_length/ymax - xmax*3);
  124.     }
  125.     exit(0);
  126. userr:
  127.     fprintf(stderr, "Usage: %s [-r][-g gamma][-e +/-stops] [input [output]]\n",
  128.             progname);
  129.     exit(1);
  130. }
  131.  
  132.  
  133. quiterr(err)        /* print message and exit */
  134. char  *err;
  135. {
  136.     if (err != NULL) {
  137.         fprintf(stderr, "%s: %s\n", progname, err);
  138.         exit(1);
  139.     }
  140.     exit(0);
  141. }
  142.  
  143.  
  144. pr2ra(rf, pad)        /* convert 24-bit scanlines to Radiance picture */
  145. int    rf;
  146. int    pad;
  147. {
  148.     COLR    *scanout;
  149.     register int    x;
  150.     int    y;
  151.                         /* allocate scanline */
  152.     scanout = (COLR *)malloc(xmax*sizeof(COLR));
  153.     if (scanout == NULL)
  154.         quiterr("out of memory in pr2ra");
  155.                         /* convert image */
  156.     for (y = ymax-1; y >= 0; y--) {
  157.         if (rf == RT_FORMAT_RGB)
  158.             for (x = 0; x < xmax; x++) {
  159.                 scanout[x][RED] = getc(stdin);
  160.                 scanout[x][GRN] = getc(stdin);
  161.                 scanout[x][BLU] = getc(stdin);
  162.             }
  163.         else
  164.             for (x = 0; x < xmax; x++) {
  165.                 scanout[x][BLU] = getc(stdin);
  166.                 scanout[x][GRN] = getc(stdin);
  167.                 scanout[x][RED] = getc(stdin);
  168.             }
  169.         for (x = pad; x--; getc(stdin));
  170.         if (feof(stdin) || ferror(stdin))
  171.             quiterr("error reading rasterfile");
  172.         gambs_colrs(scanout, xmax);
  173.         if (bradj)
  174.             shiftcolrs(scanout, xmax, bradj);
  175.         if (fwritecolrs(scanout, xmax, stdout) < 0)
  176.             quiterr("error writing Radiance picture");
  177.     }
  178.                         /* free scanline */
  179.     free((char *)scanout);
  180. }
  181.  
  182.  
  183. ra2pr(rf, pad)        /* convert Radiance scanlines to 24-bit rasterfile */
  184. int    rf;
  185. int    pad;
  186. {
  187.     int    ord[3];
  188.     COLR    *scanin;
  189.     register int    x;
  190.     int    y;
  191.                         /* allocate scanline */
  192.     scanin = (COLR *)malloc(xmax*sizeof(COLR));
  193.     if (scanin == NULL)
  194.         quiterr("out of memory in ra2pr");
  195.     if (rf == RT_FORMAT_RGB) {
  196.         ord[0] = RED; ord[1] = GRN; ord[2] = BLU;
  197.     } else {
  198.         ord[0] = BLU; ord[1] = GRN; ord[2] = RED;
  199.     }
  200.                         /* convert image */
  201.     for (y = ymax-1; y >= 0; y--) {
  202.         if (freadcolrs(scanin, xmax, stdin) < 0)
  203.             quiterr("error reading Radiance picture");
  204.         if (bradj)
  205.             shiftcolrs(scanin, xmax, bradj);
  206.         colrs_gambs(scanin, xmax);
  207.         if (rf == RT_FORMAT_RGB)
  208.             for (x = 0; x < xmax; x++) {
  209.                 putc(scanin[x][RED], stdout);
  210.                 putc(scanin[x][GRN], stdout);
  211.                 putc(scanin[x][BLU], stdout);
  212.             }
  213.         else
  214.             for (x = 0; x < xmax; x++) {
  215.                 putc(scanin[x][BLU], stdout);
  216.                 putc(scanin[x][GRN], stdout);
  217.                 putc(scanin[x][RED], stdout);
  218.             }
  219.         for (x = 0; x < pad; x++)
  220.             putc(scanin[xmax-1][ord[x%3]], stdout);
  221.         if (ferror(stdout))
  222.             quiterr("error writing rasterfile");
  223.     }
  224.                         /* free scanline */
  225.     free((char *)scanin);
  226. }
  227.