ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/protate.c
(Generate patch)

Comparing ray/src/px/protate.c (file contents):
Revision 1.2 by greg, Tue Sep 12 13:04:27 1989 UTC vs.
Revision 2.6 by gwlarson, Tue Oct 27 16:32:33 1998 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1988 Regents of the University of California */
1 > /* Copyright (c) 1991 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ 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 <stdio.h>
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 + int     ccw = 0;                        /* rotate CCW? */
24 +
25 + #ifdef BIGMEM
26 + char    buf[1<<22];                     /* output buffer */
27 + #else
28   char    buf[1<<20];                     /* output buffer */
29 + #endif
30  
31   int     nrows;                          /* number of rows output at once */
32  
# Line 23 | Line 34 | int    nrows;                          /* number of rows output at once */
34  
35   char    *progname;
36  
37 + short   ordertab[4][2] = {
38 +        {0,XDECR}, {XDECR,XDECR|YDECR}, {XDECR|YDECR,YDECR}, {YDECR,0}
39 + };
40  
41 +
42 + int
43 + neworder()              /* return corrected order */
44 + {
45 +        register int    i;
46 +
47 +        if (correctorder)
48 +                return(order);
49 +        for (i = 4; i--; )
50 +                if ((order&~YMAJOR) == ordertab[i][ccw])
51 +                        return(ordertab[i][1-ccw] | ((order&YMAJOR)^YMAJOR));
52 +        fputs("Order botch!\n", stderr);
53 +        exit(2);
54 + }
55 +
56 +
57   main(argc, argv)
58   int     argc;
59   char    *argv[];
60   {
61 +        static char     picfmt[LPICFMT+1] = PICFMT;
62 +        int     rval;
63          FILE    *fin;
64  
65          progname = argv[0];
66  
67 <        if (argc != 2 && argc != 3) {
68 <                fprintf(stderr, "Usage: %s infile [outfile]\n", progname);
69 <                exit(1);
67 >        while (argc > 2 && argv[1][0] == '-') {
68 >                switch (argv[1][1]) {
69 >                case 'c':
70 >                        correctorder = 1;
71 >                        break;
72 >                case 'r':
73 >                        ccw = 1;
74 >                        break;
75 >                default:
76 >                        goto userr;
77 >                }
78 >                argc--; argv++;
79          }
80 +        if (argc != 2 && argc != 3)
81 +                goto userr;
82          if ((fin = fopen(argv[1], "r")) == NULL) {
83                  fprintf(stderr, "%s: cannot open\n", argv[1]);
84                  exit(1);
# Line 44 | Line 87 | char   *argv[];
87                  fprintf(stderr, "%s: cannot open\n", argv[2]);
88                  exit(1);
89          }
90 <                                        /* copy header */
91 <        while (fgets(buf, sizeof(buf), fin) != NULL && buf[0] != '\n')
92 <                fputs(buf, stdout);
90 >                                        /* transfer header */
91 >        if ((rval = checkheader(fin, picfmt, stdout)) < 0) {
92 >                fprintf(stderr, "%s: not a Radiance picture\n", progname);
93 >                exit(1);
94 >        }
95 >        if (rval)
96 >                fputformat(picfmt, stdout);
97                                          /* add new header info. */
98 <        printf("%s\n\n", progname);
98 >        fputs(progname, stdout);
99 >        if (ccw) fputs(" -r", stdout);
100 >        if (correctorder) fputs(" -c", stdout);
101 >        fputs("\n\n", stdout);
102                                          /* get picture size */
103 <        if (fgetresolu(&xres, &yres, fin) != (YMAJOR|YDECR)) {
103 >        if ((order = fgetresolu(&xres, &yres, fin)) < 0) {
104                  fprintf(stderr, "%s: bad picture size\n", progname);
105                  exit(1);
106          }
107                                          /* write new picture size */
108 <        fputresolu(YMAJOR|YDECR, yres, xres, stdout);
108 >        fputresolu(neworder(), yres, xres, stdout);
109                                          /* compute buffer capacity */
110          nrows = sizeof(buf)/sizeof(COLR)/yres;
111 <        rotate(fin);                    /* rotate the image */
111 >        if (ccw)                        /* rotate the image */
112 >                rotateccw(fin);
113 >        else
114 >                rotatecw(fin);
115          exit(0);
116 + userr:
117 +        fprintf(stderr, "Usage: %s [-r][-c] infile [outfile]\n", progname);
118 +        exit(1);
119   }
120  
121  
122 < rotate(fp)                      /* rotate picture */
122 > rotatecw(fp)                    /* rotate picture clockwise */
123   FILE    *fp;
124   {
125 <        register COLR   *inline;
125 >        register COLR   *inln;
126          register int    xoff, inx, iny;
127          long    start, ftell();
128  
129 <        if ((inline = (COLR *)malloc(xres*sizeof(COLR))) == NULL) {
129 >        if ((inln = (COLR *)malloc(xres*sizeof(COLR))) == NULL) {
130                  fprintf(stderr, "%s: out of memory\n", progname);
131                  exit(1);
132          }
# Line 81 | Line 137 | FILE   *fp;
137                          exit(1);
138                  }
139                  for (iny = yres-1; iny >= 0; iny--) {
140 <                        if (freadcolrs(inline, xres, fp) < 0) {
140 >                        if (freadcolrs(inln, xres, fp) < 0) {
141                                  fprintf(stderr, "%s: read error\n", progname);
142                                  exit(1);
143                          }
144                          for (inx = 0; inx < nrows && xoff+inx < xres; inx++)
145 <                                bcopy(inline[xoff+inx], scanbar[inx*yres+iny],
146 <                                                sizeof(COLR));
145 >                                copycolr(scanbar[inx*yres+iny],
146 >                                                inln[xoff+inx]);
147                  }
148                  for (inx = 0; inx < nrows && xoff+inx < xres; inx++)
149                          if (fwritecolrs(scanbar+inx*yres, yres, stdout) < 0) {
# Line 95 | Line 151 | FILE   *fp;
151                                  exit(1);
152                          }
153          }
154 <        free((char *)inline);
154 >        free((char *)inln);
155 > }
156 >
157 >
158 > rotateccw(fp)                   /* rotate picture counter-clockwise */
159 > FILE    *fp;
160 > {
161 >        register COLR   *inln;
162 >        register int    xoff, inx, iny;
163 >        long    start, ftell();
164 >
165 >        if ((inln = (COLR *)malloc(xres*sizeof(COLR))) == NULL) {
166 >                fprintf(stderr, "%s: out of memory\n", progname);
167 >                exit(1);
168 >        }
169 >        start = ftell(fp);
170 >        for (xoff = xres-1; xoff >= 0; xoff -= nrows) {
171 >                if (fseek(fp, start, 0) < 0) {
172 >                        fprintf(stderr, "%s: seek error\n", progname);
173 >                        exit(1);
174 >                }
175 >                for (iny = 0; iny < yres; iny++) {
176 >                        if (freadcolrs(inln, xres, fp) < 0) {
177 >                                fprintf(stderr, "%s: read error\n", progname);
178 >                                exit(1);
179 >                        }
180 >                        for (inx = 0; inx < nrows && xoff-inx >= 0; inx++)
181 >                                copycolr(scanbar[inx*yres+iny],
182 >                                                inln[xoff-inx]);
183 >                }
184 >                for (inx = 0; inx < nrows && xoff-inx >= 0; inx++)
185 >                        if (fwritecolrs(scanbar+inx*yres, yres, stdout) < 0) {
186 >                                fprintf(stderr, "%s: write error\n", progname);
187 >                                exit(1);
188 >                        }
189 >        }
190 >        free((char *)inln);
191   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines