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

Comparing ray/src/px/ra_tiff.c (file contents):
Revision 2.9 by gregl, Thu Jul 24 11:47:05 1997 UTC vs.
Revision 2.19 by gwlarson, Wed Jun 2 10:57:53 1999 UTC

# Line 28 | Line 28 | extern char  *malloc();
28   #define C_XYZE          0x10            /* Radiance is XYZE */
29   #define C_RFLT          0x20            /* Radiance data is float */
30   #define C_TFLT          0x40            /* TIFF data is float */
31 < #define C_PRIM          0x80            /* has assigned primaries */
31 > #define C_TWRD          0x80            /* TIFF data is 16-bit */
32 > #define C_PRIM          0x100           /* has assigned primaries */
33  
34   struct {
35          uint16  flags;          /* conversion flags (defined above) */
36          uint16  comp;           /* TIFF compression type */
37 +        uint16  phot;           /* TIFF photometric type */
38          uint16  pconf;          /* TIFF planar configuration */
39          float   gamcor;         /* gamma correction value */
40          short   bradj;          /* Radiance exposure adjustment (stops) */
41          uint16  orient;         /* visual orientation (TIFF spec.) */
42 <        float   stonits;        /* input conversion to nits */
42 >        double  stonits;        /* input conversion to nits */
43          float   pixrat;         /* pixel aspect ratio */
44          FILE    *rfp;           /* Radiance stream pointer */
45          TIFF    *tif;           /* TIFF pointer */
# Line 51 | Line 53 | struct {
53          } r;                    /* Radiance scanline */
54          union {
55                  uint8   *bp;            /* byte pointer */
56 +                uint16  *wp;            /* word pointer */
57                  float   *fp;            /* float pointer */
58                  char    *p;             /* generic pointer */
59          } t;                    /* TIFF scanline */
60          int     (*tf)();        /* translation procedure */
61   }       cvts = {        /* conversion structure */
62 <        0, COMPRESSION_NONE, PLANARCONFIG_CONTIG, GAMCOR, 0,
62 >        0, COMPRESSION_NONE, PHOTOMETRIC_RGB,
63 >        PLANARCONFIG_CONTIG, GAMCOR, 0, 1, 1., 1.,
64   };
65  
66   #define CHK(f)          (cvts.flags & (f))
# Line 66 | Line 70 | struct {
70  
71   int     Luv2Color(), L2Color(), RGB2Colr(), Gry2Colr();
72   int     Color2Luv(), Color2L(), Colr2RGB(), Colr2Gry();
73 + int     RRGGBB2Color(), GGry2Color();
74  
75   short   ortab[8] = {            /* orientation conversion table */
76          YMAJOR|YDECR,
# Line 105 | Line 110 | char  *argv[];
110                                  cvts.comp = COMPRESSION_LZW;
111                                  break;
112                          case 'L':               /* LogLuv 32-bit output */
113 <                                cvts.comp = COMPRESSION_LOGLUV32;
113 >                                cvts.comp = COMPRESSION_SGILOG;
114 >                                cvts.phot = PHOTOMETRIC_LOGLUV;
115                                  break;
116                          case 'l':               /* LogLuv 24-bit output */
117 <                                cvts.comp = COMPRESSION_LOGLUV24;
117 >                                cvts.comp = COMPRESSION_SGILOG24;
118 >                                cvts.phot = PHOTOMETRIC_LOGLUV;
119                                  break;
120                          case 'b':               /* greyscale output? */
121                                  TGL(C_GRY);
# Line 141 | Line 148 | doneopts:
148                  if (i != argc-2)
149                          goto userr;
150  
151 <                if (CHK(C_GRY) && (cvts.comp == COMPRESSION_LOGLUV24 ||
152 <                                        cvts.comp == COMPRESSION_LOGLUV32))
153 <                        cvts.comp = COMPRESSION_LOGL16;
151 >                if (CHK(C_GRY))         /* consistency corrections */
152 >                        if (cvts.phot == PHOTOMETRIC_RGB)
153 >                                cvts.phot = PHOTOMETRIC_MINISBLACK;
154 >                        else {
155 >                                cvts.phot = PHOTOMETRIC_LOGL;
156 >                                cvts.comp = COMPRESSION_SGILOG;
157 >                        }
158  
159                  ra2tiff(i, argv);
160          }
# Line 176 | Line 187 | allocbufs()                    /* allocate scanline buffers */
187          int     rsiz, tsiz;
188  
189          rsiz = CHK(C_RFLT) ? sizeof(COLOR) : sizeof(COLR);
190 <        tsiz = (CHK(C_TFLT) ? sizeof(float) : sizeof(uint8)) *
190 >        tsiz = (CHK(C_TFLT) ? sizeof(float) :
191 >                        CHK(C_TWRD) ? sizeof(uint16) : sizeof(uint8)) *
192                          (CHK(C_GRY) ? 1 : 3);
193          cvts.r.p = (char *)malloc(rsiz*cvts.xmax);
194          cvts.t.p = (char *)malloc(tsiz*cvts.xmax);
# Line 216 | Line 228 | initfromtif()          /* initialize conversion from TIFF inpu
228          if (TIFFGetField(cvts.tif, TIFFTAG_XRESOLUTION, &f1) &&
229                          TIFFGetField(cvts.tif, TIFFTAG_YRESOLUTION, &f2))
230                  cvts.pixrat = f1/f2;
219        else
220                cvts.pixrat = 1.;
231  
232 <        if (!TIFFGetFieldDefaulted(cvts.tif, TIFFTAG_ORIENTATION, &cvts.orient))
223 <                cvts.orient = 1;
232 >        TIFFGetFieldDefaulted(cvts.tif, TIFFTAG_ORIENTATION, &cvts.orient);
233  
234 <        switch (cvts.comp) {
235 <        case COMPRESSION_LOGL16:
236 <                SET(C_GRY|C_RFLT|C_TFLT|C_GAMUT);
237 <                cvts.pconf = PLANARCONFIG_CONTIG;
238 <                TIFFSetField(cvts.tif, TIFFTAG_LOGLUVDATAFMT,
230 <                                LOGLUVDATAFMT_FLTY);
231 <                TIFFSetField(cvts.tif, TIFFTAG_SAMPLEFORMAT,
232 <                                SAMPLEFORMAT_IEEEFP);
233 <                cvts.tf = L2Color;
234 <                break;
235 <        case COMPRESSION_LOGLUV24:
236 <        case COMPRESSION_LOGLUV32:
234 >        if (!TIFFGetFieldDefaulted(cvts.tif, TIFFTAG_PHOTOMETRIC, &cvts.phot))
235 >                quiterr("TIFF has unspecified photometric type");
236 >
237 >        switch (cvts.phot) {
238 >        case PHOTOMETRIC_LOGLUV:
239                  SET(C_RFLT|C_TFLT);
240                  if (!CHK(C_XYZE)) {
241                          cpcolormat(cvts.cmat, xyz2rgbmat);
242                          SET(C_CXFM|C_GAMUT);
243 <                } else if (cvts.comp == COMPRESSION_LOGLUV32)
243 >                } else if (cvts.comp == COMPRESSION_SGILOG)
244                          SET(C_GAMUT);
245                  if (cvts.pconf != PLANARCONFIG_CONTIG)
246                          quiterr("cannot handle separate Luv planes");
247 <                TIFFSetField(cvts.tif, TIFFTAG_LOGLUVDATAFMT,
248 <                                LOGLUVDATAFMT_FLTXYZ);
247 <                TIFFSetField(cvts.tif, TIFFTAG_SAMPLEFORMAT,
248 <                                SAMPLEFORMAT_IEEEFP);
247 >                TIFFSetField(cvts.tif, TIFFTAG_SGILOGDATAFMT,
248 >                                SGILOGDATAFMT_FLOAT);
249                  cvts.tf = Luv2Color;
250                  break;
251 <        default:
252 <                SET(C_GAMMA|C_GAMUT);
251 >        case PHOTOMETRIC_LOGL:
252 >                SET(C_GRY|C_RFLT|C_TFLT|C_GAMUT);
253 >                cvts.pconf = PLANARCONFIG_CONTIG;
254 >                TIFFSetField(cvts.tif, TIFFTAG_SGILOGDATAFMT,
255 >                                SGILOGDATAFMT_FLOAT);
256 >                cvts.tf = L2Color;
257 >                break;
258 >        case PHOTOMETRIC_YCBCR:
259 >                if (cvts.comp == COMPRESSION_JPEG &&
260 >                                cvts.pconf == PLANARCONFIG_CONTIG) {
261 >                        TIFFSetField(cvts.tif, TIFFTAG_JPEGCOLORMODE,
262 >                                        JPEGCOLORMODE_RGB);
263 >                        cvts.phot = PHOTOMETRIC_RGB;
264 >                } else
265 >                        quiterr("unsupported photometric type");
266 >                /* fall through */
267 >        case PHOTOMETRIC_RGB:
268 >                SET(C_GAMMA);
269                  setcolrgam(cvts.gamcor);
270                  if (CHK(C_XYZE)) {
271                          comprgb2xyzmat(cvts.cmat,
# Line 257 | Line 273 | initfromtif()          /* initialize conversion from TIFF inpu
273                          SET(C_CXFM);
274                  }
275                  if (!TIFFGetField(cvts.tif, TIFFTAG_SAMPLESPERPIXEL, &hi) ||
276 <                                (hi != 1 && hi != 3))
277 <                        quiterr("unsupported samples per pixel");
278 <                if (hi == 1) {
279 <                        SET(C_GRY);
280 <                        cvts.pconf = PLANARCONFIG_CONTIG;
281 <                        cvts.tf = Gry2Colr;
266 <                } else
276 >                                hi != 3)
277 >                        quiterr("unsupported samples per pixel for RGB");
278 >                if (!TIFFGetField(cvts.tif, TIFFTAG_BITSPERSAMPLE, &hi) ||
279 >                                hi != 8 & hi != 16)
280 >                        quiterr("unsupported bits per sample for RGB");
281 >                if (hi == 8)
282                          cvts.tf = RGB2Colr;
283 +                else {
284 +                        cvts.tf = RRGGBB2Color;
285 +                        SET(C_RFLT|C_TWRD);
286 +                }
287 +                break;
288 +        case PHOTOMETRIC_MINISBLACK:
289 +                SET(C_GRY|C_GAMMA);
290 +                setcolrgam(cvts.gamcor);
291 +                cvts.pconf = PLANARCONFIG_CONTIG;
292 +                if (!TIFFGetField(cvts.tif, TIFFTAG_SAMPLESPERPIXEL, &hi) ||
293 +                                hi != 1)
294 +                        quiterr("unsupported samples per pixel for greyscale");
295                  if (!TIFFGetField(cvts.tif, TIFFTAG_BITSPERSAMPLE, &hi) ||
296 <                                hi != 8)
297 <                        quiterr("unsupported bits per sample");
296 >                                hi != 8 & hi != 16)
297 >                        quiterr("unsupported bits per sample for greyscale");
298 >                if (hi == 8)
299 >                        cvts.tf = Gry2Colr;
300 >                else {
301 >                        cvts.tf = GGry2Color;
302 >                        SET(C_RFLT|C_TWRD);
303 >                }
304                  break;
305 +        default:
306 +                quiterr("unsupported photometric type");
307 +                break;
308          }
309  
274        if (TIFFGetField(cvts.tif, TIFFTAG_PHOTOMETRIC, &hi) &&
275                hi != (CHK(C_GRY) ? PHOTOMETRIC_MINISBLACK : PHOTOMETRIC_RGB))
276                quiterr("unsupported photometric interpretation");
277
310          if (!TIFFGetField(cvts.tif, TIFFTAG_IMAGEWIDTH, &cvts.xmax) ||
311                  !TIFFGetField(cvts.tif, TIFFTAG_IMAGELENGTH, &cvts.ymax))
312                  quiterr("unknown input image resolution");
# Line 342 | Line 374 | char   *s;
374                          SET(C_XYZE);
375                  else
376                          quiterr("unrecognized input picture format");
377 <                return;
377 >                return(1);
378          }
379          if (isexpos(s)) {
380                  cvts.stonits /= exposval(s);
381 <                return;
381 >                return(1);
382          }
383          if (isaspect(s)) {
384                  cvts.pixrat *= aspectval(s);
385 <                return;
385 >                return(1);
386          }
387          if (isprims(s)) {
388                  primsval(cvts.prims, s);
389                  SET(C_PRIM);
390 <                return;
390 >                return(1);
391          }
392 +        return(0);
393   }
394  
395  
# Line 385 | Line 418 | initfromrad()                  /* initialize input from a Radiance pi
418                  cvts.stonits *= WHTEFFICACY;
419                                                  /* set up conversion */
420          TIFFSetField(cvts.tif, TIFFTAG_COMPRESSION, cvts.comp);
421 +        TIFFSetField(cvts.tif, TIFFTAG_PHOTOMETRIC, cvts.phot);
422  
423 <        switch (cvts.comp) {
424 <        case COMPRESSION_LOGL16:
391 <                SET(C_GRY|C_RFLT|C_TFLT);
392 <                TIFFSetField(cvts.tif, TIFFTAG_LOGLUVDATAFMT,
393 <                                LOGLUVDATAFMT_FLTY);
394 <                TIFFSetField(cvts.tif, TIFFTAG_SAMPLEFORMAT,
395 <                                SAMPLEFORMAT_IEEEFP);
396 <                cvts.tf = Color2L;
397 <                break;
398 <        case COMPRESSION_LOGLUV24:
399 <        case COMPRESSION_LOGLUV32:
423 >        switch (cvts.phot) {
424 >        case PHOTOMETRIC_LOGLUV:
425                  SET(C_RFLT|C_TFLT);
426                  CLR(C_GRY);
427                  if (!CHK(C_XYZE)) {
428                          cpcolormat(cvts.cmat, rgb2xyzmat);
429                          SET(C_CXFM);
430                  }
431 <                TIFFSetField(cvts.tif, TIFFTAG_LOGLUVDATAFMT,
432 <                                LOGLUVDATAFMT_FLTXYZ);
433 <                TIFFSetField(cvts.tif, TIFFTAG_SAMPLEFORMAT,
434 <                                SAMPLEFORMAT_IEEEFP);
431 >                if (cvts.comp != COMPRESSION_SGILOG &&
432 >                                cvts.comp != COMPRESSION_SGILOG24)
433 >                        quiterr("internal error 2 in initfromrad");
434 >                TIFFSetField(cvts.tif, TIFFTAG_SGILOGDATAFMT,
435 >                                SGILOGDATAFMT_FLOAT);
436                  cvts.tf = Color2Luv;
437                  break;
438 <        default:
438 >        case PHOTOMETRIC_LOGL:
439 >                SET(C_GRY|C_RFLT|C_TFLT);
440 >                if (cvts.comp != COMPRESSION_SGILOG)    
441 >                        quiterr("internal error 3 in initfromrad");
442 >                TIFFSetField(cvts.tif, TIFFTAG_SGILOGDATAFMT,
443 >                                SGILOGDATAFMT_FLOAT);
444 >                cvts.tf = Color2L;
445 >                break;
446 >        case PHOTOMETRIC_RGB:
447                  SET(C_GAMMA|C_GAMUT);
448 +                CLR(C_GRY);
449                  setcolrgam(cvts.gamcor);
450                  if (CHK(C_XYZE)) {
451                          compxyz2rgbmat(cvts.cmat,
452                                          CHK(C_PRIM) ? cvts.prims : stdprims);
453                          SET(C_CXFM);
454                  }
420                if (CHK(C_GRY))
421                        cvts.tf = Colr2Gry;
422                else
423                        cvts.tf = Colr2RGB;
455                  if (CHK(C_PRIM)) {
456                          TIFFSetField(cvts.tif, TIFFTAG_PRIMARYCHROMATICITIES,
457                                          (float *)cvts.prims);
458                          TIFFSetField(cvts.tif, TIFFTAG_WHITEPOINT,
459                                          (float *)cvts.prims[WHT]);
460                  }
461 +                cvts.tf = Colr2RGB;
462                  break;
463 +        case PHOTOMETRIC_MINISBLACK:
464 +                SET(C_GRY|C_GAMMA|C_GAMUT);
465 +                setcolrgam(cvts.gamcor);
466 +                cvts.tf = Colr2Gry;
467 +                break;
468 +        default:
469 +                quiterr("internal error 4 in initfromrad");
470 +                break;
471          }
472                                                  /* set other TIFF fields */
473          TIFFSetField(cvts.tif, TIFFTAG_IMAGEWIDTH, cvts.xmax);
474          TIFFSetField(cvts.tif, TIFFTAG_IMAGELENGTH, cvts.ymax);
475          TIFFSetField(cvts.tif, TIFFTAG_SAMPLESPERPIXEL, CHK(C_GRY) ? 1 : 3);
476          TIFFSetField(cvts.tif, TIFFTAG_BITSPERSAMPLE, CHK(C_TFLT) ? 32 : 8);
437        TIFFSetField(cvts.tif, TIFFTAG_PHOTOMETRIC,
438                        CHK(C_GRY) ? PHOTOMETRIC_MINISBLACK : PHOTOMETRIC_RGB);
477          TIFFSetField(cvts.tif, TIFFTAG_XRESOLUTION, 72.);
478          TIFFSetField(cvts.tif, TIFFTAG_YRESOLUTION, 72./cvts.pixrat);
479          TIFFSetField(cvts.tif, TIFFTAG_ORIENTATION, cvts.orient);
# Line 443 | Line 481 | initfromrad()                  /* initialize input from a Radiance pi
481          TIFFSetField(cvts.tif, TIFFTAG_PLANARCONFIG, cvts.pconf);
482          TIFFSetField(cvts.tif, TIFFTAG_STONITS,
483                          cvts.stonits/pow(2.,(double)cvts.bradj));
484 <        i1 = TIFFScanlineSize(cvts.tif);
484 >        if (cvts.comp == COMPRESSION_NONE)
485 >                i1 = TIFFScanlineSize(cvts.tif);
486 >        else
487 >                i1 = 3*cvts.xmax;       /* conservative guess */
488          i2 = 8192/i1;                           /* compute good strip size */
489          if (i2 < 1) i2 = 1;
490          TIFFSetField(cvts.tif, TIFFTAG_ROWSPERSTRIP, (uint32)i2);
# Line 482 | Line 523 | uint32 y;
523   {
524          register int    x;
525  
526 <        if (CHK(C_RFLT|C_TFLT) != (C_RFLT|C_TFLT) | CHK(C_GRY))
526 >        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY) != (C_RFLT|C_TFLT))
527                  quiterr("internal error 1 in Luv2Color");
528  
529          if (TIFFReadScanline(cvts.tif, cvts.t.p, y, 0) < 0)
530                  quiterr("error reading TIFF input");
531          
532          for (x = cvts.xmax; x--; ) {
533 <                cvts.r.colors[x][RED] = cvts.t.fp[3*x];
534 <                cvts.r.colors[x][GRN] = cvts.t.fp[3*x + 1];
535 <                cvts.r.colors[x][BLU] = cvts.t.fp[3*x + 2];
533 >                colval(cvts.r.colors[x],CIEX) = cvts.t.fp[3*x];
534 >                colval(cvts.r.colors[x],CIEY) = cvts.t.fp[3*x + 1];
535 >                colval(cvts.r.colors[x],CIEZ) = cvts.t.fp[3*x + 2];
536                  if (CHK(C_CXFM))
537                          colortrans(cvts.r.colors[x], cvts.cmat,
538                                          cvts.r.colors[x]);
# Line 511 | Line 552 | uint32 y;
552  
553  
554   int
555 + RRGGBB2Color(y)                 /* read/convert/write RGB16->COLOR scanline */
556 + uint32  y;
557 + {
558 +        int     dogamma = cvts.gamcor < 0.99 | cvts.gamcor > 1.01;
559 +        register double d;
560 +        register int    x;
561 +
562 +        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY) != (C_TWRD|C_RFLT))
563 +                quiterr("internal error 1 in RRGGBB2Color");
564 +
565 +        if (TIFFReadScanline(cvts.tif, cvts.t.p, y, 0) < 0)
566 +                quiterr("error reading TIFF input");
567 +        
568 +        for (x = cvts.xmax; x--; ) {
569 +                d = (cvts.t.wp[3*x] + 0.5)*(1./(1L<<16));
570 +                if (dogamma) d = pow(d, cvts.gamcor);
571 +                colval(cvts.r.colors[x],RED) = d;
572 +                d = (cvts.t.wp[3*x + 1] + 0.5)*(1./(1L<<16));
573 +                if (dogamma) d = pow(d, cvts.gamcor);
574 +                colval(cvts.r.colors[x],GRN) = d;
575 +                d = (cvts.t.wp[3*x + 2] + 0.5)*(1./(1L<<16));
576 +                if (dogamma) d = pow(d, cvts.gamcor);
577 +                colval(cvts.r.colors[x],BLU) = d;
578 +                if (CHK(C_CXFM))
579 +                        colortrans(cvts.r.colors[x], cvts.cmat,
580 +                                        cvts.r.colors[x]);
581 +                if (CHK(C_GAMUT))
582 +                        clipgamut(cvts.r.colors[x], cvts.t.fp[3*x + 1],
583 +                                        CGAMUT_LOWER, cblack, cwhite);
584 +        }
585 +        if (cvts.bradj) {
586 +                d = pow(2.,(double)cvts.bradj);
587 +                for (x = cvts.xmax; x--; )
588 +                        scalecolor(cvts.r.colors[x], d);
589 +        }
590 +
591 +        if (fwritescan(cvts.r.colors, cvts.xmax, cvts.rfp) < 0)
592 +                quiterr("error writing Radiance picture");
593 + }
594 +
595 +
596 + int
597   L2Color(y)                      /* read/convert/write L16->COLOR scanline */
598   uint32  y;
599   {
600          register int    x;
601  
602 <        if (CHK(C_RFLT|C_TFLT|C_GRY) != (C_RFLT|C_TFLT|C_GRY))
602 >        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY) != (C_RFLT|C_TFLT|C_GRY))
603                  quiterr("internal error 1 in L2Color");
604  
605          if (TIFFReadScanline(cvts.tif, cvts.t.p, y, 0) < 0)
606                  quiterr("error reading TIFF input");
607          
608          for (x = cvts.xmax; x--; )
609 <                cvts.r.colors[x][RED] =
610 <                cvts.r.colors[x][GRN] =
611 <                cvts.r.colors[x][BLU] = cvts.t.fp[x] > 0. ? cvts.t.fp[x] : 0.;
609 >                colval(cvts.r.colors[x],RED) =
610 >                colval(cvts.r.colors[x],GRN) =
611 >                colval(cvts.r.colors[x],BLU) =
612 >                                cvts.t.fp[x] > 0. ? cvts.t.fp[x] : 0.;
613  
614          if (fwritescan(cvts.r.colors, cvts.xmax, cvts.rfp) < 0)
615                  quiterr("error writing Radiance picture");
# Line 539 | Line 623 | uint32 y;
623          COLOR   ctmp;
624          register int    x;
625  
626 <        if (CHK(C_RFLT|C_TFLT|C_GRY))
626 >        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY))
627                  quiterr("internal error 1 in RGB2Colr");
628  
629          if (cvts.pconf == PLANARCONFIG_CONTIG) {
# Line 554 | Line 638 | uint32 y;
638                  if (TIFFReadScanline(cvts.tif, cvts.t.p, y, 0) < 0)
639                          goto readerr;
640                  if (TIFFReadScanline(cvts.tif,
641 <                                (tidata_t)(cvts.t.bp + cvts.xmax), y, 1) < 0)
641 >                                (tdata_t)(cvts.t.bp + cvts.xmax), y, 1) < 0)
642                          goto readerr;
643                  if (TIFFReadScanline(cvts.tif,
644 <                                (tidata_t)(cvts.t.bp + 2*cvts.xmax), y, 2) < 0)
644 >                                (tdata_t)(cvts.t.bp + 2*cvts.xmax), y, 2) < 0)
645                          goto readerr;
646                  for (x = cvts.xmax; x--; ) {
647                          cvts.r.colrs[x][RED] = cvts.t.bp[x];
# Line 594 | Line 678 | uint32 y;
678   {
679          register int    x;
680  
681 <        if (CHK(C_RFLT|C_TFLT) | !CHK(C_GRY))
681 >        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY) != C_GRY)
682                  quiterr("internal error 1 in Gry2Colr");
683  
684          if (TIFFReadScanline(cvts.tif, cvts.t.p, y, 0) < 0)
# Line 615 | Line 699 | uint32 y;
699  
700  
701   int
702 + GGry2Color(y)                   /* read/convert/write G16->COLOR scanline */
703 + uint32  y;
704 + {
705 +        int     dogamma = cvts.gamcor < 0.99 | cvts.gamcor > 1.01;
706 +        double  m;
707 +        register double d;
708 +        register int    x;
709 +
710 +        if (CHK(C_TFLT|C_TWRD|C_GRY|C_RFLT) != (C_GRY|C_RFLT|C_TWRD))
711 +                quiterr("internal error 1 in GGry2Color");
712 +
713 +        if (TIFFReadScanline(cvts.tif, cvts.t.p, y, 0) < 0)
714 +                quiterr("error reading TIFF input");
715 +
716 +        if (cvts.bradj)
717 +                m = pow(2., (double)cvts.bradj);
718 +        for (x = cvts.xmax; x--; ) {
719 +                d = (cvts.t.wp[x] + 0.5)*(1./(1L<<16));
720 +                if (dogamma) d = pow(d, cvts.gamcor);
721 +                if (cvts.bradj) d *= m;
722 +                colval(cvts.r.colors[x],RED) =
723 +                colval(cvts.r.colors[x],GRN) =
724 +                colval(cvts.r.colors[x],BLU) = d;
725 +        }
726 +        if (fwritescan(cvts.r.colors, cvts.xmax, cvts.rfp) < 0)
727 +                quiterr("error writing Radiance picture");
728 + }
729 +
730 +
731 + int
732   Color2L(y)                      /* read/convert/write COLOR->L16 scanline */
733   uint32  y;
734   {
735          double  m = pow(2.,(double)cvts.bradj);
736          register int    x;
737  
738 <        if (CHK(C_RFLT|C_TFLT) != (C_RFLT|C_TFLT) | !CHK(C_GRY))
738 >        if (CHK(C_RFLT|C_TFLT|C_TWRD|C_GRY) != (C_RFLT|C_TFLT|C_GRY))
739                  quiterr("internal error 1 in Color2L");
740  
741          if (freadscan(cvts.r.colors, cvts.xmax, cvts.rfp) < 0)
# Line 642 | Line 756 | uint32 y;
756   {
757          register int    x;
758  
759 <        if (CHK(C_RFLT|C_TFLT) != (C_RFLT|C_TFLT) | CHK(C_GRY))
759 >        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY) != (C_RFLT|C_TFLT))
760                  quiterr("internal error 1 in Color2Luv");
761  
762          if (freadscan(cvts.r.colors, cvts.xmax, cvts.rfp) < 0)
# Line 659 | Line 773 | uint32 y;
773          }
774  
775          for (x = cvts.xmax; x--; ) {
776 <                cvts.t.fp[3*x] = colval(cvts.r.colors[x],RED);
777 <                cvts.t.fp[3*x+1] = colval(cvts.r.colors[x],GRN);
778 <                cvts.t.fp[3*x+2] = colval(cvts.r.colors[x],BLU);
776 >                cvts.t.fp[3*x] = colval(cvts.r.colors[x],CIEX);
777 >                cvts.t.fp[3*x+1] = colval(cvts.r.colors[x],CIEY);
778 >                cvts.t.fp[3*x+2] = colval(cvts.r.colors[x],CIEZ);
779          }
780  
781          if (TIFFWriteScanline(cvts.tif, cvts.t.p, y, 0) < 0)
# Line 675 | Line 789 | uint32 y;
789   {
790          register int    x;
791  
792 <        if (CHK(C_RFLT|C_TFLT) | !CHK(C_GRY))
792 >        if (CHK(C_RFLT|C_TWRD|C_TFLT|C_GRY) != C_GRY)
793                  quiterr("internal error 1 in Colr2Gry");
794  
795          if (freadcolrs(cvts.r.colrs, cvts.xmax, cvts.rfp) < 0)
# Line 702 | Line 816 | uint32 y;
816          COLOR   ctmp;
817          register int    x;
818  
819 <        if (CHK(C_RFLT|C_TFLT|C_GRY))
819 >        if (CHK(C_RFLT|C_TFLT|C_TWRD|C_GRY))
820                  quiterr("internal error 1 in Colr2RGB");
821  
822          if (freadcolrs(cvts.r.colrs, cvts.xmax, cvts.rfp) < 0)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines