2003.09.25 10:45 "[Tiff] Extended rational tag.", by David Christopher
Hi,
I'm new to libtiff and have been trying to read values from an extended rational tag in a variant of a tiff file. I've used Niles' code for this and replaced his example tags with my own. However the values that I'm getting when I try to read the tag are nonsense. However, TIFFGetField doesn't return 0 so it suggests that it can find the tag ok. Hence I guess I haven't declared the correct data types in places.
I've copied the parts of the code that I've changed below. Can anybody tell me what I've done wrong?!
Regards
Dave Christopher
// from tif_dir.c
static const TIFFFieldInfo xtiffFieldInfo[] = {
/* XXX Replace these example tags with your own
extended tags */
{ TIFFTAG_UIC3_STKINFO, -1, -1, TIFF_RATIONAL, FIELD_UIC3_STKINFO, TRUE, TRUE, "UIC3STKTag" },
};
static int
_XTIFFVSetField(TIFF* tif, ttag_t tag, va_list ap)
{
xtiff *xt = XTIFFDIR(tif);
XTIFFDirectory* xd = &xt->xtif_dir;
int status = 1;
uint32 v32=0;
int i=0, v=0;
va_list ap1 = ap;
/* va_start is called by the calling routine */
switch (tag)
{
/*
* XXX put your extended tags here; replace the implemented
* example tags with your own.
*/
case TIFFTAG_UIC3_STKINFO:
xd->xd_uic3_stkinfo_size = (uint32) va_arg(ap, uint32);
/ *** in the long array here I've passed two * size as
I think size is the number of rationals, but I want
twice this number for the long array? *****/
_TIFFsetLongArray( &xd->tag3_extra, (uint32*) va_arg(ap, uint32*), (long) 2*xd->xd_uic3_stkinfo_size );
break;
default:
/* call the inherited method */
return (PARENT(xt,vsetfield))(tif,tag,ap);
break;
}
if (status) {
/* we have to override the print method here,
* after the compression tags have gotten to it.
* This makes sense because the only time we would
* need the extended print method is if an extended
* tag is set by the reader.
*/
if (!(xt->xtif_flags & XTIFFP_PRINT))
{
PARENT(xt,printdir) = TIFFMEMBER(tif,printdir);
TIFFMEMBER(tif,printdir) = _XTIFFPrintDirectory;
xt->xtif_flags |= XTIFFP_PRINT;
}
TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit);
tif->tif_flags |= TIFF_DIRTYDIRECT;
}
va_end(ap);
return (status);
}
static int
_XTIFFVGetField(TIFF* tif, ttag_t tag, va_list ap)
{
xtiff *xt = XTIFFDIR(tif);
XTIFFDirectory* xd = &xt->xtif_dir;
switch (tag) {
/*
* XXX put your extended tags here; replace the implemented
* example tags with your own.
*/
case TIFFTAG_UIC3_STKINFO:
*va_arg(ap, uint32*) = xd->xd_uic3_stkinfo_size;
*va_arg(ap, uint32**) = xd->tag3_extra;
break;
default:
/* return inherited method */
return (PARENT(xt,vgetfield))(tif,tag,ap);
break;
}
return (1);
}
/// From tiffiop.h
/* XXX - Define number of your extended tags here */
#define NUM_XFIELD 1
#define XFIELD_BASE (FIELD_LAST-NUM_XFIELD)
/* XXX - Define your Tag Fields here */
#define FIELD_UIC3_STKINFO (XFIELD_BASE+0)
/* XXX - Define Private directory tag structure here */
struct XTIFFDirectory
{
uint32 xd_uic3_stkinfo_size;
uint32* tag3_extra;
};
typedef struct XTIFFDirectory XTIFFDirectory;