diff options
Diffstat (limited to 'libtiff/tif_pixarlog.c')
-rw-r--r-- | libtiff/tif_pixarlog.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/libtiff/tif_pixarlog.c b/libtiff/tif_pixarlog.c index f7a0eea4..27f2a9d7 100644 --- a/libtiff/tif_pixarlog.c +++ b/libtiff/tif_pixarlog.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996-1996 Sam Leffler + * Copyright (c) 1996-1997 Sam Leffler * Copyright (c) 1996 Pixar * * Permission to use, copy, modify, distribute, and sell this software and @@ -178,7 +178,7 @@ horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, register float t0, t1, t2, t3; #define SCALE12 2048.0 -#define CLAMP12(t) (((t) > 3071) ? 3071 : (uint16) (t)) +#define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071) if (n >= stride) { mask = CODE_MASK; @@ -230,7 +230,7 @@ horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, n -= stride; while (n > 0) { REPEAT(stride, - wp[stride] += *wp; t0 = ToLinearF[*wp&mask] * SCALE12; + wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12; *op = CLAMP12(t0); wp++; op++) n -= stride; } @@ -456,8 +456,8 @@ typedef struct { z_stream stream; uint16 *tbuf; uint16 stride; - short user_datafmt; - short state; + int state; + int user_datafmt; int quality; #define PLSTATE_INIT 1 @@ -1147,11 +1147,14 @@ PixarLogCleanup(TIFF* tif) if (sp->ToLinearF) _TIFFfree(sp->ToLinearF); if (sp->ToLinear16) _TIFFfree(sp->ToLinear16); if (sp->ToLinear8) _TIFFfree(sp->ToLinear8); - if (tif->tif_mode == O_RDONLY) - inflateEnd(&sp->stream); - else - deflateEnd(&sp->stream); - _TIFFfree(sp->tbuf); + if (sp->state&PLSTATE_INIT) { + if (tif->tif_mode == O_RDONLY) + inflateEnd(&sp->stream); + else + deflateEnd(&sp->stream); + } + if (sp->tbuf) + _TIFFfree(sp->tbuf); _TIFFfree(sp); tif->tif_data = NULL; } @@ -1206,6 +1209,11 @@ PixarLogVSetField(TIFF* tif, ttag_t tag, va_list ap) TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); break; } + /* + * Must recalculate sizes should bits/sample change. + */ + tif->tif_tilesize = TIFFTileSize(tif); + tif->tif_scanlinesize = TIFFScanlineSize(tif); result = 1; /* NB: pseudo tag */ break; default: @@ -1220,6 +1228,9 @@ PixarLogVGetField(TIFF* tif, ttag_t tag, va_list ap) PixarLogState *sp = (PixarLogState *)tif->tif_data; switch (tag) { + case TIFFTAG_PIXARLOGQUALITY: + *va_arg(ap, int*) = sp->quality; + break; case TIFFTAG_PIXARLOGDATAFMT: *va_arg(ap, int*) = sp->user_datafmt; break; @@ -1230,7 +1241,7 @@ PixarLogVGetField(TIFF* tif, ttag_t tag, va_list ap) } static const TIFFFieldInfo pixarlogFieldInfo[] = { - {TIFFTAG_PIXARLOGDATAFMT,0,0,TIFF_SHORT,FIELD_PSEUDO,FALSE,FALSE,""}, + {TIFFTAG_PIXARLOGDATAFMT,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""}, {TIFFTAG_PIXARLOGQUALITY,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""} }; @@ -1248,9 +1259,7 @@ TIFFInitPixarLog(TIFF* tif, int scheme) if (tif->tif_data == NULL) goto bad; sp = (PixarLogState*) tif->tif_data; - sp->stream.zalloc = NULL; - sp->stream.zfree = NULL; - sp->stream.opaque = NULL; + memset(sp, 0, sizeof (*sp)); sp->stream.data_type = Z_BINARY; sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN; |