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

Comparing ray/src/px/ra_xyze.c (file contents):
Revision 2.13 by greg, Sat Dec 28 18:05:14 2019 UTC vs.
Revision 2.14 by greg, Tue Oct 1 01:16:26 2024 UTC

# Line 13 | Line 13 | static const char      RCSid[] = "$Id$";
13   #include  "resolu.h"
14   #include  "rtio.h"
15  
16 < int  rgbinp = -1;                       /* input is RGBE? */
16 > enum {InpUNK, InpRGB, InpXYZ, InpSPEC}; /* input format */
17 > int  infmt = InpUNK;
18   int  rgbout = 0;                        /* output should be RGBE? */
19   RGBPRIMS  inprims = STDPRIMS;           /* input primaries */
20   RGBPRIMS  outprims = STDPRIMS;          /* output primaries */
# Line 24 | Line 25 | char  *progname;
25  
26   static gethfunc headline;
27   static void quiterr(char *err);
28 + static void myreadscan(COLOR *scn, int len);
29   static void convert(void);
30  
31  
# Line 38 | Line 40 | headline(                              /* process header line */
40  
41          if (formatval(fmt, s)) {        /* check if format string */
42                  if (!strcmp(fmt,COLRFMT))
43 <                        rgbinp = 1;
43 >                        infmt = InpRGB;
44                  else if (!strcmp(fmt,CIEFMT))
45 <                        rgbinp = 0;
45 >                        infmt = InpXYZ;
46 >                else if (!strcmp(fmt,SPECFMT))
47 >                        infmt = InpSPEC;
48                  else
49 <                        rgbinp = -2;
49 >                        infmt = InpUNK;
50                  return(0);              /* don't echo */
51          }
52          if (origexp > 0.0 && isexpos(s)) {
# Line 53 | Line 57 | headline(                              /* process header line */
57                  primsval(inprims, s);
58                  return(0);              /* don't echo */
59          }
60 +        if (iswlsplit(s)) {             /* get wavelength limits */
61 +                wlsplitval(WLPART, s);
62 +                return(0);              /* don't echo */
63 +        }
64 +        if (isncomp(s)) {               /* number of color samples */
65 +                NCSAMP = ncompval(s);
66 +                return(0);              /* don't echo */
67 +        }
68                                          /* should I grok colcorr also? */
69          return(fputs(s, stdout));
70   }
# Line 120 | Line 132 | main(int  argc, char  *argv[])
132                  exit(1);
133          }
134          getheader(stdin, headline, NULL);
135 <        if (rgbinp == -2)
136 <                quiterr("unrecognized input file format");
125 <        if (rgbinp == -1)
126 <                rgbinp = !rgbout;
135 >        if (infmt == InpUNK)
136 >                quiterr("unrecognized/missing input file format");
137          printargs(argc, argv, stdout);          /* add to header */
138          convert();                              /* convert picture */
139          exit(0);
# Line 148 | Line 158 | quiterr(               /* print message and exit */
158  
159  
160   static void
161 + myreadscan(COLOR *scn, int len)
162 + {
163 +        if (infmt == InpSPEC) {         /* read & convert to XYZ */
164 +                SCOLR   sclr;
165 +                SCOLOR  scol;
166 +                while (len-- > 0) {
167 +                        if (getbinary(sclr, LSCOLR, 1, stdin) != 1)
168 +                                goto readerr;
169 +                        scolr_scolor(scol, sclr);
170 +                        scolor_cie(*scn++, scol);
171 +                }
172 +                return;
173 +        }                               /* else read as RGBE/XYZE */
174 +        if (freadscan(scn, len, stdin) >= 0)
175 +                return;
176 + readerr:
177 +        quiterr("error reading input picture");
178 + }
179 +
180 +
181 + static void
182   convert(void)                           /* convert to XYZE or RGBE picture */
183   {
184          int     order;
185          int     xmax, ymax;
186          COLORMAT        xfm;
187 <        register COLOR  *scanin;
188 <        register COLR   *scanout;
187 >        COLOR   *scanin;
188 >        COLR    *scanout;
189          double  exp2do = expcomp;
190          double  exp2report = expcomp;
191          int     y;
192 <        register int    x;
192 >        int     x;
193                                                  /* recover original? */
194          if (origexp > 0.0)
195                  exp2do /= origexp;
196                                                  /* compute transform */
197          if (rgbout) {
198 <                if (rgbinp) {                   /* RGBE -> RGBE */
198 >                if (infmt == InpRGB) {          /* RGBE -> RGBE */
199                          comprgb2rgbWBmat(xfm, inprims, outprims);
200 <                } else {                        /* XYZE -> RGBE */
200 >                } else {                        /* XYZE/Spectral -> RGBE */
201                          compxyz2rgbWBmat(xfm, outprims);
202 +                }
203 +                if (infmt == InpXYZ) {
204                          if (origexp > 0.0)
205                                  exp2do /= WHTEFFICACY;
206                          else
207                                  exp2report *= WHTEFFICACY;
208                  }
209          } else {
210 <                if (rgbinp) {                   /* RGBE -> XYZE */
210 >                if (infmt == InpRGB) {          /* RGBE -> XYZE */
211                          comprgb2xyzWBmat(xfm, inprims);
212 <                        if (origexp > 0.0)
212 >                } else {                        /* XYZE/Spectral -> XYZE */
213 >                        memset(xfm, 0, sizeof(xfm));
214 >                        for (x = 3; x--; )
215 >                                xfm[x][x] = 1.;
216 >                }
217 >                if (infmt != InpXYZ) {
218 >                        if (origexp > 0)
219                                  exp2do *= WHTEFFICACY;
220                          else
221                                  exp2report /= WHTEFFICACY;
183                } else {                        /* XYZE -> XYZE */
184                        for (y = 0; y < 3; y++)
185                                for (x = 0; x < 3; x++)
186                                        xfm[y][x] = x==y ? 1. : 0.;
222                  }
223          }
224          for (y = 0; y < 3; y++)
# Line 206 | Line 241 | convert(void)                          /* convert to XYZE or RGBE picture */
241          scanin = (COLOR *)malloc(xmax*sizeof(COLOR));
242          if (scanin == NULL)
243                  quiterr("out of memory in convert");
244 <        scanout = doflat ? (COLR *)malloc(xmax*sizeof(COLR)) : NULL;
244 >        scanout = doflat ? (COLR *)malloc(xmax*sizeof(COLR)) : (COLR *)NULL;
245                                                  /* convert image */
246          for (y = 0; y < ymax; y++) {
247 <                if (freadscan(scanin, xmax, stdin) < 0)
213 <                        quiterr("error reading input picture");
247 >                myreadscan(scanin, xmax);
248                  for (x = 0; x < xmax; x++) {
249                          colortrans(scanin[x], xfm, scanin[x]);
250                          if (rgbout)
# Line 222 | Line 256 | convert(void)                          /* convert to XYZE or RGBE picture */
256                                  setcolr(scanout[x], colval(scanin[x],RED),
257                                                  colval(scanin[x],GRN),
258                                                  colval(scanin[x],BLU));
259 <                        putbinary((char *)scanout, sizeof(COLR), xmax, stdout);
259 >                        putbinary(scanout, sizeof(COLR), xmax, stdout);
260                  } else
261                          fwritescan(scanin, xmax, stdout);
262                  if (ferror(stdout))
263                          quiterr("error writing output picture");
264          }
265                                                  /* free scanline */
266 <        free((void *)scanin);
266 >        free(scanin);
267          if (scanout != NULL)
268 <                free((void *)scanout);
268 >                free(scanout);
269   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines