From 31c405b3b821bc7d05ca15f03dbfbdd1a5aeaf80 Mon Sep 17 00:00:00 2001 From: Andrey Kiselev Date: Fri, 3 Feb 2006 15:58:42 +0000 Subject: [PATCH] Special handling for PageNumber, HalftoneHints, YCbCrSubsampling and DotRange tags as per bugs http://bugzilla.remotesensing.org/show_bug.cgi?id=1029 http://bugzilla.remotesensing.org/show_bug.cgi?id=1034 --- libtiff/tif_dir.c | 146 ++++++++++++++++++++++++++-------------------- 1 file changed, 83 insertions(+), 63 deletions(-) diff --git a/libtiff/tif_dir.c b/libtiff/tif_dir.c index 6fbe039b..f4e12832 100644 --- a/libtiff/tif_dir.c +++ b/libtiff/tif_dir.c @@ -1,4 +1,4 @@ -/* $Id: tif_dir.c,v 1.67 2005-12-26 14:31:24 dron Exp $ */ +/* $Id: tif_dir.c,v 1.68 2006-02-03 15:58:42 dron Exp $ */ /* * Copyright (c) 1988-1997 Sam Leffler @@ -444,8 +444,10 @@ _TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) tv_size = _TIFFDataSize(fip->field_type); if (tv_size == 0) { status = 0; - TIFFErrorExt(tif->tif_clientdata, module, "%s: Bad field type %d for \"%s\"", - tif->tif_name, fip->field_type, fip->field_name); + TIFFErrorExt(tif->tif_clientdata, module, + "%s: Bad field type %d for \"%s\"", + tif->tif_name, fip->field_type, + fip->field_name); goto end; } @@ -467,76 +469,94 @@ _TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) _TIFFsetString((char **)&tv->value, va_arg(ap, char *)); else { tv->value = _TIFFmalloc(tv_size * tv->count); - if (!tv->value) { + if (!tv->value) { status = 0; goto end; - } + } - if (fip->field_passcount + if ((fip->field_passcount || fip->field_writecount == TIFF_VARIABLE || fip->field_writecount == TIFF_VARIABLE2 || fip->field_writecount == TIFF_SPP - || tv->count > 1) { + || tv->count > 1) + && fip->field_tag != TIFFTAG_PAGENUMBER + && fip->field_tag != TIFFTAG_HALFTONEHINTS + && fip->field_tag != TIFFTAG_YCBCRSUBSAMPLING + && fip->field_tag != TIFFTAG_DOTRANGE) { _TIFFmemcpy(tv->value, va_arg(ap, void *), tv->count * tv_size); } else { - switch (fip->field_type) { - case TIFF_BYTE: - case TIFF_UNDEFINED: - { - uint8 v = (uint8)va_arg(ap, int); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); + /* + * XXX: The following loop required to handle + * TIFFTAG_PAGENUMBER, TIFFTAG_HALFTONEHINTS, + * TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE tags. + * These tags are actually arrays and should be passed as + * array pointers to TIFFSetField() function, but actually + * passed as a list of separate values. This behaviour + * must be changed in the future! + */ + int i; + char *val = (char *)tv->value; + + for (i = 0; i < tv->count; i++, val += tv_size) { + switch (fip->field_type) { + case TIFF_BYTE: + case TIFF_UNDEFINED: + { + uint8 v = (uint8)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SBYTE: + { + int8 v = (int8)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SHORT: + { + uint16 v = (uint16)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SSHORT: + { + int16 v = (int16)va_arg(ap, int); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_LONG: + case TIFF_IFD: + { + uint32 v = va_arg(ap, uint32); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_SLONG: + { + int32 v = va_arg(ap, int32); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_RATIONAL: + case TIFF_SRATIONAL: + case TIFF_FLOAT: + { + float v = (float)va_arg(ap, double); + _TIFFmemcpy(val, &v, tv_size); + } + break; + case TIFF_DOUBLE: + { + double v = va_arg(ap, double); + _TIFFmemcpy(val, &v, tv_size); + } + break; + default: + _TIFFmemset(val, 0, tv_size); + status = 0; + break; } - break; - case TIFF_SBYTE: - { - int8 v = (int8)va_arg(ap, int); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - case TIFF_SHORT: - { - uint16 v = (uint16)va_arg(ap, int); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - case TIFF_SSHORT: - { - int16 v = (int16)va_arg(ap, int); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - case TIFF_LONG: - case TIFF_IFD: - { - uint32 v = va_arg(ap, uint32); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - case TIFF_SLONG: - { - int32 v = va_arg(ap, int32); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - case TIFF_RATIONAL: - case TIFF_SRATIONAL: - case TIFF_FLOAT: - { - float v = (float)va_arg(ap, double); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - case TIFF_DOUBLE: - { - double v = va_arg(ap, double); - _TIFFmemcpy(tv->value, &v, tv_size*tv->count); - } - break; - default: - _TIFFmemset(tv->value, 0, tv->count * tv_size); - status = 0; - break; } } }