summaryrefslogtreecommitdiff
path: root/libtiff/tif_pixarlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtiff/tif_pixarlog.c')
-rw-r--r--libtiff/tif_pixarlog.c37
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;