home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / radsrc22 / src / px / protate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-12  |  2.7 KB  |  116 lines

  1. /* Copyright (c) 1991 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)protate.c 2.1 11/12/91 LBL";
  5. #endif
  6.  
  7. /*
  8.  * prot.c - program to rotate picture file 90 degrees clockwise.
  9.  *
  10.  *    2/26/88
  11.  */
  12.  
  13. #include "standard.h"
  14.  
  15. #include "color.h"
  16.  
  17. #include "resolu.h"
  18.  
  19. int    order;                /* input scanline order */
  20. int    xres, yres;            /* input resolution */
  21.  
  22. int    correctorder = 0;        /* order correction? */
  23.  
  24. char    buf[1<<20];            /* output buffer */
  25.  
  26. int    nrows;                /* number of rows output at once */
  27.  
  28. #define scanbar        ((COLR *)buf)
  29.  
  30. char    *progname;
  31.  
  32. #define neworder()    (correctorder ? order : \
  33.             (order^(order&YMAJOR?YDECR:XDECR)^YMAJOR))
  34.  
  35.  
  36. main(argc, argv)
  37. int    argc;
  38. char    *argv[];
  39. {
  40.     FILE    *fin;
  41.  
  42.     progname = argv[0];
  43.  
  44.     if (argc > 2 && !strcmp(argv[1], "-c")) {
  45.         correctorder++;
  46.         argc--; argv++;
  47.     }
  48.     if (argc != 2 && argc != 3) {
  49.         fprintf(stderr, "Usage: %s [-c] infile [outfile]\n", progname);
  50.         exit(1);
  51.     }
  52.     if ((fin = fopen(argv[1], "r")) == NULL) {
  53.         fprintf(stderr, "%s: cannot open\n", argv[1]);
  54.         exit(1);
  55.     }
  56.     if (argc == 3 && freopen(argv[2], "w", stdout) == NULL) {
  57.         fprintf(stderr, "%s: cannot open\n", argv[2]);
  58.         exit(1);
  59.     }
  60.                     /* transfer header */
  61.     if (checkheader(fin, COLRFMT, stdout) < 0) {
  62.         fprintf(stderr, "%s: not a Radiance picture\n", progname);
  63.         exit(1);
  64.     }
  65.                     /* add new header info. */
  66.     printf("%s\n\n", progname);
  67.                     /* get picture size */
  68.     if ((order = fgetresolu(&xres, &yres, fin)) < 0) {
  69.         fprintf(stderr, "%s: bad picture size\n", progname);
  70.         exit(1);
  71.     }
  72.                     /* write new picture size */
  73.     fputresolu(neworder(), yres, xres, stdout);
  74.                     /* compute buffer capacity */
  75.     nrows = sizeof(buf)/sizeof(COLR)/yres;
  76.     rotate(fin);            /* rotate the image */
  77.     exit(0);
  78. }
  79.  
  80.  
  81. rotate(fp)            /* rotate picture */
  82. FILE    *fp;
  83. {
  84.     register COLR    *inln;
  85.     register int    xoff, inx, iny;
  86.     long    start, ftell();
  87.  
  88.     if ((inln = (COLR *)malloc(xres*sizeof(COLR))) == NULL) {
  89.         fprintf(stderr, "%s: out of memory\n", progname);
  90.         exit(1);
  91.     }
  92.     start = ftell(fp);
  93.     for (xoff = 0; xoff < xres; xoff += nrows) {
  94.         if (fseek(fp, start, 0) < 0) {
  95.             fprintf(stderr, "%s: seek error\n", progname);
  96.             exit(1);
  97.         }
  98.         for (iny = yres-1; iny >= 0; iny--) {
  99.             if (freadcolrs(inln, xres, fp) < 0) {
  100.                 fprintf(stderr, "%s: read error\n", progname);
  101.                 exit(1);
  102.             }
  103.             for (inx = 0; inx < nrows && xoff+inx < xres; inx++)
  104.                 bcopy((char *)inln[xoff+inx],
  105.                         (char *)scanbar[inx*yres+iny],
  106.                         sizeof(COLR));
  107.         }
  108.         for (inx = 0; inx < nrows && xoff+inx < xres; inx++)
  109.             if (fwritecolrs(scanbar+inx*yres, yres, stdout) < 0) {
  110.                 fprintf(stderr, "%s: write error\n", progname);
  111.                 exit(1);
  112.             }
  113.     }
  114.     free((char *)inln);
  115. }
  116.