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:
parent
4fab684de1
commit
31c405b3b8
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user