home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 243.lha / QuickRayTrace_v1.5 / Sources / qrtpost.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-04-29  |  3.5 KB  |  146 lines

  1. /*********************************************************
  2.  
  3.   QrtPost is a post processor for QRT on the Commodode
  4.   Amiga.  It reads in the QRT file, and spits it out
  5.   as a 4096 color bitmap which can be converted to
  6.   IFF/HAM by another program.
  7.  
  8.  *********************************************************/
  9.  
  10. #include <stdio.h>
  11.  
  12. #define MAXXRES 640      /* max x resolution */
  13. #define HAM_X   320
  14. #define HAM_Y   400
  15. #define SHIFT 3          /* convert 0..127 to 0..15 */
  16.  
  17. main(argc,argv)
  18.   int argc;
  19.   char *argv[];
  20. {
  21.   int xres, yres, line;
  22.   register int x, value;
  23.   unsigned short r[MAXXRES], g[MAXXRES], b[MAXXRES];
  24.   FILE *in, *out;
  25.   unsigned char fgetc();
  26.  
  27.   if (argc != 3) {
  28.     printf("Usage: %s InFile OutFile\n",argv[0]);
  29.     exit(1);
  30.   }
  31.  
  32.   /** open files **/
  33.  
  34.   if ((in = fopen(argv[1],"r"))==NULL) {
  35.     printf("Couldn't open file %s\n",argv[1]);
  36.     exit(1);
  37.   }
  38.  
  39.   if ((out = fopen(argv[2],"w"))==NULL) {
  40.     printf("Couldn't open file %s\n",argv[2]);
  41.     exit(1);
  42.   }
  43.  
  44.   /** load x and y resolution **/
  45.  
  46.   xres = yres = 0;
  47.  
  48.   xres  = ((unsigned int)fgetc(in));
  49.   xres += ((unsigned int)(fgetc(in) << 8));
  50.  
  51.   yres  = ((unsigned int)fgetc(in));
  52.   yres += ((unsigned int)(fgetc(in) << 8));
  53.  
  54.   if (xres <= 0 || xres > HAM_X || yres <= 0 || yres > HAM_Y) {
  55.     printf("Illegal size for Amiga ham image.\n");
  56.     exit(1);
  57.   }
  58.  
  59.   /** print info **/
  60.  
  61.   printf("\nInput  file  = %s\n",   argv[1]);
  62.   printf("Output file  = %s\n\n",   argv[2]);
  63.   printf("X resolution = %d\n",     xres);
  64.   printf("Y resolution = %d\n\n",   yres);
  65.  
  66.   while (!feof(in)) {
  67.     line  = ((int)fgetc(in));                 /* read scan line number */
  68.     line |= ((int)(fgetc(in) << 8));
  69.  
  70.     if (feof(in)) {
  71.       fclose(in);
  72.       fclose(out);
  73.       exit(0);
  74.     }
  75.  
  76.     if (line >= yres) {
  77.       printf("Faulty data file: %d.\n",line);
  78.  
  79.       fclose(in);                             /* close files */
  80.       fclose(out);
  81.  
  82.       exit(1);
  83.     }
  84.  
  85.     for (x=0; x<MAXXRES; x++)                 /* clear buffers */
  86.       r[x] = g[x] = b[x] = 0;
  87.  
  88.     for (x=0; x<xres; x++)                    /* read color data */
  89.       r[x] = ((short)fgetc(in)) & 0xff;
  90.  
  91.     for (x=0; x<xres; x++)
  92.       g[x] = ((short)fgetc(in)) & 0xff;
  93.  
  94.     for (x=0; x<xres; x++)
  95.       b[x] = ((short)fgetc(in)) & 0xff;
  96.  
  97.     fputc((unsigned char)(line>>8),out);      /* write line number */
  98.     fputc((unsigned char)(line&0xff),out);
  99.  
  100.     for (x=0; x<(HAM_X/4); x++) {             /* write color data */
  101.        value  = (r[4*x+3] >> SHIFT);
  102.        value  = value << 4;
  103.        value += (r[4*x+2] >> SHIFT);
  104.        fputc((unsigned char)(value),out);
  105.  
  106.        value  = (r[4*x+1] >> SHIFT);
  107.        value  = value << 4;
  108.        value += (r[4*x+0] >> SHIFT);
  109.  
  110.        fputc((unsigned char)(value),out);
  111.     }
  112.  
  113.     for (x=0; x<(HAM_X/4); x++) {              /* write color data */
  114.        value  = (g[4*x+3] >> SHIFT);
  115.        value  = value << 4;
  116.        value += (g[4*x+2] >> SHIFT);
  117.        fputc((unsigned char)(value),out);
  118.  
  119.        value  = (g[4*x+1] >> SHIFT);
  120.        value  = value << 4;
  121.        value += (g[4*x+0] >> SHIFT);
  122.  
  123.        fputc((unsigned char)(value),out);
  124.     }
  125.  
  126.     for (x=0; x<(HAM_X/4); x++) {              /* write color data */
  127.        value  = (b[4*x+3] >> SHIFT);
  128.        value  = value << 4;
  129.        value += (b[4*x+2] >> SHIFT);
  130.        fputc((unsigned char)(value),out);
  131.  
  132.        value  = (b[4*x+1] >> SHIFT);
  133.        value  = value << 4;
  134.        value += (b[4*x+0] >> SHIFT);
  135.  
  136.        fputc((unsigned char)(value),out);
  137.     }
  138.  
  139.   }
  140.  
  141.   fclose(in);                                 /* close files */
  142.   fclose(out);
  143.  
  144. }
  145.  
  146.