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
This commit is contained in:
Andrey Kiselev 2006-02-03 15:58:42 +00:00
parent 4fab684de1
commit 31c405b3b8

View File

@ -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 * 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); tv_size = _TIFFDataSize(fip->field_type);
if (tv_size == 0) { if (tv_size == 0) {
status = 0; status = 0;
TIFFErrorExt(tif->tif_clientdata, module, "%s: Bad field type %d for \"%s\"", TIFFErrorExt(tif->tif_clientdata, module,
tif->tif_name, fip->field_type, fip->field_name); "%s: Bad field type %d for \"%s\"",
tif->tif_name, fip->field_type,
fip->field_name);
goto end; goto end;
} }
@ -467,76 +469,94 @@ _TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap)
_TIFFsetString((char **)&tv->value, va_arg(ap, char *)); _TIFFsetString((char **)&tv->value, va_arg(ap, char *));
else { else {
tv->value = _TIFFmalloc(tv_size * tv->count); tv->value = _TIFFmalloc(tv_size * tv->count);
if (!tv->value) { if (!tv->value) {
status = 0; status = 0;
goto end; goto end;
} }
if (fip->field_passcount if ((fip->field_passcount
|| fip->field_writecount == TIFF_VARIABLE || fip->field_writecount == TIFF_VARIABLE
|| fip->field_writecount == TIFF_VARIABLE2 || fip->field_writecount == TIFF_VARIABLE2
|| fip->field_writecount == TIFF_SPP || 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 *), _TIFFmemcpy(tv->value, va_arg(ap, void *),
tv->count * tv_size); tv->count * tv_size);
} else { } else {
switch (fip->field_type) { /*
case TIFF_BYTE: * XXX: The following loop required to handle
case TIFF_UNDEFINED: * TIFFTAG_PAGENUMBER, TIFFTAG_HALFTONEHINTS,
{ * TIFFTAG_YCBCRSUBSAMPLING and TIFFTAG_DOTRANGE tags.
uint8 v = (uint8)va_arg(ap, int); * These tags are actually arrays and should be passed as
_TIFFmemcpy(tv->value, &v, tv_size*tv->count); * 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;
} }
} }
} }