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

  1. /* Copyright (c) 1992 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)pflip.c 2.3 10/28/92 LBL";
  5. #endif
  6.  
  7. /*
  8.  * flip picture file horizontally and/or vertically
  9.  */
  10.  
  11. #include <stdio.h>
  12.  
  13. #ifdef MSDOS
  14. #include  <fcntl.h>
  15. #endif
  16.  
  17. #include "color.h"
  18.  
  19. #include "resolu.h"
  20.  
  21. int    order;                /* input orientation */
  22. int    xres, yres;            /* resolution (scanlen, nscans) */
  23.  
  24. long    *scanpos;            /* scanline positions */
  25.  
  26. int    fhoriz=0, fvert=0;        /* flip flags */
  27.  
  28. int    correctorder = 0;        /* correcting orientation? */
  29.  
  30. FILE    *fin;                /* input file */
  31.  
  32. char    *progname;
  33.  
  34. extern char    *malloc();
  35.  
  36.  
  37. int
  38. neworder()            /* figure out new order from old */
  39. {
  40.     register int  no;
  41.  
  42.     if (correctorder)
  43.         return(order);        /* just leave it */
  44.     if ((no = order) & YMAJOR) {
  45.         if (fhoriz) no ^= XDECR;
  46.         if (fvert) no ^= YDECR;
  47.     } else {
  48.         if (fhoriz) no ^= YDECR;
  49.         if (fvert) no ^= XDECR;
  50.     }
  51.     return(no);
  52. }
  53.  
  54.  
  55. main(argc, argv)
  56. int    argc;
  57. char    *argv[];
  58. {
  59.     int    i;
  60. #ifdef MSDOS
  61.     extern int  _fmode;
  62.     _fmode = O_BINARY;
  63.     setmode(fileno(stdout), O_BINARY);
  64. #endif
  65.     progname = argv[0];
  66.  
  67.     for (i = 1; i < argc; i++)
  68.         if (!strcmp(argv[i], "-h"))
  69.             fhoriz++;
  70.         else if (!strcmp(argv[i], "-v"))
  71.             fvert++;
  72.         else if (!strcmp(argv[i], "-c"))
  73.             correctorder++;
  74.         else
  75.             break;
  76.     if (i >= argc || argv[i][0] == '-') {
  77.         fprintf(stderr, "Usage: %s [-h][-v][-c] infile [outfile]\n",
  78.                 progname);
  79.         exit(1);
  80.     }
  81.     if ((fin = fopen(argv[i], "r")) == NULL) {
  82.         fprintf(stderr, "%s: cannot open\n", argv[1]);
  83.         exit(1);
  84.     }
  85.     if (i < argc-1 && freopen(argv[i+1], "w", stdout) == NULL) {
  86.         fprintf(stderr, "%s: cannot open\n", argv[i+1]);
  87.         exit(1);
  88.     }
  89.                     /* transfer header */
  90.     if (checkheader(fin, COLRFMT, stdout) < 0) {
  91.         fprintf(stderr, "%s: input not a Radiance picture\n",
  92.                 progname);
  93.         exit(1);
  94.     }
  95.                     /* add new header info. */
  96.     printargs(i, argv, stdout);
  97.     fputformat(COLRFMT, stdout);
  98.     putchar('\n');
  99.                     /* get picture size */
  100.     if ((order = fgetresolu(&xres, &yres, fin)) < 0) {
  101.         fprintf(stderr, "%s: bad picture size\n", progname);
  102.         exit(1);
  103.     }
  104.                     /* write new picture size */
  105.     fputresolu(neworder(), xres, yres, stdout);
  106.                     /* goto end if vertical flip */
  107.     if (fvert)
  108.         scanfile();
  109.     flip();                /* flip the image */
  110.     exit(0);
  111. }
  112.  
  113.  
  114. memerr()
  115. {
  116.     fprintf(stderr, "%s: out of memory\n", progname);
  117.     exit(1);
  118. }
  119.  
  120.  
  121. scanfile()                /* scan to the end of file */
  122. {
  123.     extern long    ftell();
  124.     COLR    *scanin;
  125.     int    y;
  126.  
  127.     if ((scanpos = (long *)malloc(yres*sizeof(long))) == NULL)
  128.         memerr();
  129.     if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
  130.         memerr();
  131.     for (y = yres-1; y > 0; y--) {
  132.         scanpos[y] = ftell(fin);
  133.         if (freadcolrs(scanin, xres, fin) < 0) {
  134.             fprintf(stderr, "%s: read error\n", progname);
  135.             exit(1);
  136.         }
  137.     }
  138.     scanpos[0] = ftell(fin);
  139.     free((char *)scanin);
  140. }
  141.  
  142.  
  143. flip()                    /* flip the picture */
  144. {
  145.     COLR    *scanin, *scanout;
  146.     int    y;
  147.     register int    x;
  148.  
  149.     if ((scanin = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
  150.         memerr();
  151.     if (fhoriz) {
  152.         if ((scanout = (COLR *)malloc(xres*sizeof(COLR))) == NULL)
  153.             memerr();
  154.     } else
  155.         scanout = scanin;
  156.     for (y = yres-1; y >= 0; y--) {
  157.         if (fvert && fseek(fin, scanpos[yres-1-y], 0) == EOF) {
  158.             fprintf(stderr, "%s: seek error\n", progname);
  159.             exit(1);
  160.         }
  161.         if (freadcolrs(scanin, xres, fin) < 0) {
  162.             fprintf(stderr, "%s: read error\n", progname);
  163.             exit(1);
  164.         }
  165.         if (fhoriz)
  166.             for (x = 0; x < xres; x++)
  167.                 copycolr(scanout[x], scanin[xres-1-x]);
  168.         if (fwritecolrs(scanout, xres, stdout) < 0) {
  169.             fprintf(stderr, "%s: write error\n", progname);
  170.             exit(1);
  171.         }
  172.     }
  173.     free((char *)scanin);
  174.     if (fhoriz)
  175.         free((char *)scanout);
  176. }
  177.