From: davechristopher2002@yahoo.co.uk (=?iso-8859-1?q?David=20Christopher?=)
Date: Thu, 25 Sep 2003 11:45:07 +0100 (BST)
Subject: [Tiff] Extended rational tag.
Message-ID: <20030925104507.50242.qmail@web21605.mail.yahoo.com>

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;

________________________________________________________________________
Want to chat instantly with your online friends?  Get the FREE Yahoo!
Messenger http://mail.messenger.yahoo.co.uk

