Blame libtiff/tif_dirwrite.c

Packit 7838c8
/* $Id: tif_dirwrite.c,v 1.89 2017-08-23 13:33:42 erouault Exp $ */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Copyright (c) 1988-1997 Sam Leffler
Packit 7838c8
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
Packit 7838c8
 *
Packit 7838c8
 * Permission to use, copy, modify, distribute, and sell this software and
Packit 7838c8
 * its documentation for any purpose is hereby granted without fee, provided
Packit 7838c8
 * that (i) the above copyright notices and this permission notice appear in
Packit 7838c8
 * all copies of the software and related documentation, and (ii) the names of
Packit 7838c8
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
Packit 7838c8
 * publicity relating to the software without the specific, prior written
Packit 7838c8
 * permission of Sam Leffler and Silicon Graphics.
Packit 7838c8
 *
Packit 7838c8
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
Packit 7838c8
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
Packit 7838c8
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Packit 7838c8
 *
Packit 7838c8
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
Packit 7838c8
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
Packit 7838c8
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit 7838c8
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
Packit 7838c8
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
Packit 7838c8
 * OF THIS SOFTWARE.
Packit 7838c8
 */
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * TIFF Library.
Packit 7838c8
 *
Packit 7838c8
 * Directory Write Support Routines.
Packit 7838c8
 */
Packit 7838c8
#include "tiffiop.h"
Packit 7838c8
#include <float.h>
Packit 7838c8
Packit 7838c8
#ifdef HAVE_IEEEFP
Packit 7838c8
#define TIFFCvtNativeToIEEEFloat(tif, n, fp)
Packit 7838c8
#define TIFFCvtNativeToIEEEDouble(tif, n, dp)
Packit 7838c8
#else
Packit 7838c8
extern void TIFFCvtNativeToIEEEFloat(TIFF* tif, uint32 n, float* fp);
Packit 7838c8
extern void TIFFCvtNativeToIEEEDouble(TIFF* tif, uint32 n, double* dp);
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff);
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
Packit 7838c8
static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
Packit 7838c8
#endif
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
Packit 7838c8
static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
Packit 7838c8
static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
Packit 7838c8
static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
Packit 7838c8
#endif
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
Packit 7838c8
#endif
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
Packit 7838c8
static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
Packit 7838c8
static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
Packit 7838c8
static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
Packit 7838c8
#endif
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
Packit 7838c8
static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
Packit 7838c8
static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
Packit 7838c8
static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
Packit 7838c8
#endif
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
Packit 7838c8
static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data);
Packit 7838c8
Packit 7838c8
static int TIFFLinkDirectory(TIFF*);
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Write the contents of the current directory
Packit 7838c8
 * to the specified file.  This routine doesn't
Packit 7838c8
 * handle overwriting a directory with auxiliary
Packit 7838c8
 * storage that's been changed.
Packit 7838c8
 */
Packit 7838c8
int
Packit 7838c8
TIFFWriteDirectory(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	return TIFFWriteDirectorySec(tif,TRUE,TRUE,NULL);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Similar to TIFFWriteDirectory(), writes the directory out
Packit 7838c8
 * but leaves all data structures in memory so that it can be
Packit 7838c8
 * written again.  This will make a partially written TIFF file
Packit 7838c8
 * readable before it is successfully completed/closed.
Packit 7838c8
 */
Packit 7838c8
int
Packit 7838c8
TIFFCheckpointDirectory(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	int rc;
Packit 7838c8
	/* Setup the strips arrays, if they haven't already been. */
Packit 7838c8
	if (tif->tif_dir.td_stripoffset == NULL)
Packit 7838c8
	    (void) TIFFSetupStrips(tif);
Packit 7838c8
	rc = TIFFWriteDirectorySec(tif,TRUE,FALSE,NULL);
Packit 7838c8
	(void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
Packit 7838c8
	return rc;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
int
Packit 7838c8
TIFFWriteCustomDirectory(TIFF* tif, uint64* pdiroff)
Packit 7838c8
{
Packit 7838c8
	return TIFFWriteDirectorySec(tif,FALSE,FALSE,pdiroff);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Similar to TIFFWriteDirectory(), but if the directory has already
Packit 7838c8
 * been written once, it is relocated to the end of the file, in case it
Packit 7838c8
 * has changed in size.  Note that this will result in the loss of the
Packit 7838c8
 * previously used directory space. 
Packit 7838c8
 */ 
Packit 7838c8
int
Packit 7838c8
TIFFRewriteDirectory( TIFF *tif )
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFRewriteDirectory";
Packit 7838c8
Packit 7838c8
	/* We don't need to do anything special if it hasn't been written. */
Packit 7838c8
	if( tif->tif_diroff == 0 )
Packit 7838c8
		return TIFFWriteDirectory( tif );
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Find and zero the pointer to this directory, so that TIFFLinkDirectory
Packit 7838c8
	 * will cause it to be added after this directories current pre-link.
Packit 7838c8
	 */
Packit 7838c8
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff)
Packit 7838c8
		{
Packit 7838c8
			tif->tif_header.classic.tiff_diroff = 0;
Packit 7838c8
			tif->tif_diroff = 0;
Packit 7838c8
Packit 7838c8
			TIFFSeekFile(tif,4,SEEK_SET);
Packit 7838c8
			if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff),4))
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
				    "Error updating TIFF header");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			uint32 nextdir;
Packit 7838c8
			nextdir = tif->tif_header.classic.tiff_diroff;
Packit 7838c8
			while(1) {
Packit 7838c8
				uint16 dircount;
Packit 7838c8
				uint32 nextnextdir;
Packit 7838c8
Packit 7838c8
				if (!SeekOK(tif, nextdir) ||
Packit 7838c8
				    !ReadOK(tif, &dircount, 2)) {
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory count");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
					TIFFSwabShort(&dircount);
Packit 7838c8
				(void) TIFFSeekFile(tif,
Packit 7838c8
				    nextdir+2+dircount*12, SEEK_SET);
Packit 7838c8
				if (!ReadOK(tif, &nextnextdir, 4)) {
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory link");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
					TIFFSwabLong(&nextnextdir);
Packit 7838c8
				if (nextnextdir==tif->tif_diroff)
Packit 7838c8
				{
Packit 7838c8
					uint32 m;
Packit 7838c8
					m=0;
Packit 7838c8
					(void) TIFFSeekFile(tif,
Packit 7838c8
					    nextdir+2+dircount*12, SEEK_SET);
Packit 7838c8
					if (!WriteOK(tif, &m, 4)) {
Packit 7838c8
						TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
						     "Error writing directory link");
Packit 7838c8
						return (0);
Packit 7838c8
					}
Packit 7838c8
					tif->tif_diroff=0;
Packit 7838c8
					break;
Packit 7838c8
				}
Packit 7838c8
				nextdir=nextnextdir;
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		if (tif->tif_header.big.tiff_diroff == tif->tif_diroff)
Packit 7838c8
		{
Packit 7838c8
			tif->tif_header.big.tiff_diroff = 0;
Packit 7838c8
			tif->tif_diroff = 0;
Packit 7838c8
Packit 7838c8
			TIFFSeekFile(tif,8,SEEK_SET);
Packit 7838c8
			if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff),8))
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
				    "Error updating TIFF header");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			uint64 nextdir;
Packit 7838c8
			nextdir = tif->tif_header.big.tiff_diroff;
Packit 7838c8
			while(1) {
Packit 7838c8
				uint64 dircount64;
Packit 7838c8
				uint16 dircount;
Packit 7838c8
				uint64 nextnextdir;
Packit 7838c8
Packit 7838c8
				if (!SeekOK(tif, nextdir) ||
Packit 7838c8
				    !ReadOK(tif, &dircount64, 8)) {
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory count");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
					TIFFSwabLong8(&dircount64);
Packit 7838c8
				if (dircount64>0xFFFF)
Packit 7838c8
				{
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Sanity check on tag count failed, likely corrupt TIFF");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				dircount=(uint16)dircount64;
Packit 7838c8
				(void) TIFFSeekFile(tif,
Packit 7838c8
				    nextdir+8+dircount*20, SEEK_SET);
Packit 7838c8
				if (!ReadOK(tif, &nextnextdir, 8)) {
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory link");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
					TIFFSwabLong8(&nextnextdir);
Packit 7838c8
				if (nextnextdir==tif->tif_diroff)
Packit 7838c8
				{
Packit 7838c8
					uint64 m;
Packit 7838c8
					m=0;
Packit 7838c8
					(void) TIFFSeekFile(tif,
Packit 7838c8
					    nextdir+8+dircount*20, SEEK_SET);
Packit 7838c8
					if (!WriteOK(tif, &m, 8)) {
Packit 7838c8
						TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
						     "Error writing directory link");
Packit 7838c8
						return (0);
Packit 7838c8
					}
Packit 7838c8
					tif->tif_diroff=0;
Packit 7838c8
					break;
Packit 7838c8
				}
Packit 7838c8
				nextdir=nextnextdir;
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Now use TIFFWriteDirectory() normally.
Packit 7838c8
	 */
Packit 7838c8
Packit 7838c8
	return TIFFWriteDirectory( tif );
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectorySec";
Packit 7838c8
	uint32 ndir;
Packit 7838c8
	TIFFDirEntry* dir;
Packit 7838c8
	uint32 dirsize;
Packit 7838c8
	void* dirmem;
Packit 7838c8
	uint32 m;
Packit 7838c8
	if (tif->tif_mode == O_RDONLY)
Packit 7838c8
		return (1);
Packit 7838c8
Packit 7838c8
        _TIFFFillStriles( tif );
Packit 7838c8
        
Packit 7838c8
	/*
Packit 7838c8
	 * Clear write state so that subsequent images with
Packit 7838c8
	 * different characteristics get the right buffers
Packit 7838c8
	 * setup for them.
Packit 7838c8
	 */
Packit 7838c8
	if (imagedone)
Packit 7838c8
	{
Packit 7838c8
		if (tif->tif_flags & TIFF_POSTENCODE)
Packit 7838c8
		{
Packit 7838c8
			tif->tif_flags &= ~TIFF_POSTENCODE;
Packit 7838c8
			if (!(*tif->tif_postencode)(tif))
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata,module,
Packit 7838c8
				    "Error post-encoding before directory write");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		(*tif->tif_close)(tif);       /* shutdown encoder */
Packit 7838c8
		/*
Packit 7838c8
		 * Flush any data that might have been written
Packit 7838c8
		 * by the compression close+cleanup routines.  But
Packit 7838c8
                 * be careful not to write stuff if we didn't add data
Packit 7838c8
                 * in the previous steps as the "rawcc" data may well be
Packit 7838c8
                 * a previously read tile/strip in mixed read/write mode.
Packit 7838c8
		 */
Packit 7838c8
		if (tif->tif_rawcc > 0 
Packit 7838c8
		    && (tif->tif_flags & TIFF_BEENWRITING) != 0 )
Packit 7838c8
		{
Packit 7838c8
		    if( !TIFFFlushData1(tif) )
Packit 7838c8
                    {
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
			    "Error flushing data before directory write");
Packit 7838c8
			return (0);
Packit 7838c8
                    }
Packit 7838c8
		}
Packit 7838c8
		if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
Packit 7838c8
		{
Packit 7838c8
			_TIFFfree(tif->tif_rawdata);
Packit 7838c8
			tif->tif_rawdata = NULL;
Packit 7838c8
			tif->tif_rawcc = 0;
Packit 7838c8
			tif->tif_rawdatasize = 0;
Packit 7838c8
                        tif->tif_rawdataoff = 0;
Packit 7838c8
                        tif->tif_rawdataloaded = 0;
Packit 7838c8
		}
Packit 7838c8
		tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
Packit 7838c8
	}
Packit 7838c8
	dir=NULL;
Packit 7838c8
	dirmem=NULL;
Packit 7838c8
	dirsize=0;
Packit 7838c8
	while (1)
Packit 7838c8
	{
Packit 7838c8
		ndir=0;
Packit 7838c8
		if (isimage)
Packit 7838c8
		{
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGEWIDTH,tif->tif_dir.td_imagewidth))
Packit 7838c8
					goto bad;
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGELENGTH,tif->tif_dir.td_imagelength))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILEWIDTH,tif->tif_dir.td_tilewidth))
Packit 7838c8
					goto bad;
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILELENGTH,tif->tif_dir.td_tilelength))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_RESOLUTION))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XRESOLUTION,tif->tif_dir.td_xresolution))
Packit 7838c8
					goto bad;
Packit 7838c8
				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YRESOLUTION,tif->tif_dir.td_yresolution))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_POSITION))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XPOSITION,tif->tif_dir.td_xposition))
Packit 7838c8
					goto bad;
Packit 7838c8
				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YPOSITION,tif->tif_dir.td_yposition))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_SUBFILETYPE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_SUBFILETYPE,tif->tif_dir.td_subfiletype))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_BITSPERSAMPLE,tif->tif_dir.td_bitspersample))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_COMPRESSION))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_COMPRESSION,tif->tif_dir.td_compression))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PHOTOMETRIC,tif->tif_dir.td_photometric))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_THRESHHOLDING))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_THRESHHOLDING,tif->tif_dir.td_threshholding))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_FILLORDER))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_FILLORDER,tif->tif_dir.td_fillorder))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_ORIENTATION))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_ORIENTATION,tif->tif_dir.td_orientation))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_SAMPLESPERPIXEL,tif->tif_dir.td_samplesperpixel))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_ROWSPERSTRIP,tif->tif_dir.td_rowsperstrip))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MINSAMPLEVALUE,tif->tif_dir.td_minsamplevalue))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MAXSAMPLEVALUE,tif->tif_dir.td_maxsamplevalue))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_PLANARCONFIG))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PLANARCONFIG,tif->tif_dir.td_planarconfig))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_RESOLUTIONUNIT,tif->tif_dir.td_resolutionunit))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_PAGENUMBER,2,&tif->tif_dir.td_pagenumber[0]))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_STRIPBYTECOUNTS))
Packit 7838c8
			{
Packit 7838c8
				if (!isTiled(tif))
Packit 7838c8
				{
Packit 7838c8
					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
Packit 7838c8
						goto bad;
Packit 7838c8
				}
Packit 7838c8
				else
Packit 7838c8
				{
Packit 7838c8
					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
Packit 7838c8
						goto bad;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_STRIPOFFSETS))
Packit 7838c8
			{
Packit 7838c8
				if (!isTiled(tif))
Packit 7838c8
				{
Packit 7838c8
                    /* td_stripoffset might be NULL in an odd OJPEG case. See
Packit 7838c8
                     *  tif_dirread.c around line 3634.
Packit 7838c8
                     * XXX: OJPEG hack.
Packit 7838c8
                     * If a) compression is OJPEG, b) it's not a tiled TIFF,
Packit 7838c8
                     * and c) the number of strips is 1,
Packit 7838c8
                     * then we tolerate the absence of stripoffsets tag,
Packit 7838c8
                     * because, presumably, all required data is in the
Packit 7838c8
                     * JpegInterchangeFormat stream.
Packit 7838c8
                     * We can get here when using tiffset on such a file.
Packit 7838c8
                     * See http://bugzilla.maptools.org/show_bug.cgi?id=2500
Packit 7838c8
                    */
Packit 7838c8
                    if (tif->tif_dir.td_stripoffset != NULL &&
Packit 7838c8
                        !TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
Packit 7838c8
                        goto bad;
Packit 7838c8
				}
Packit 7838c8
				else
Packit 7838c8
				{
Packit 7838c8
					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
Packit 7838c8
						goto bad;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_COLORMAP))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagColormap(tif,&ndir,dir))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES))
Packit 7838c8
			{
Packit 7838c8
				if (tif->tif_dir.td_extrasamples)
Packit 7838c8
				{
Packit 7838c8
					uint16 na;
Packit 7838c8
					uint16* nb;
Packit 7838c8
					TIFFGetFieldDefaulted(tif,TIFFTAG_EXTRASAMPLES,&na,&nb);
Packit 7838c8
					if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_EXTRASAMPLES,na,nb))
Packit 7838c8
						goto bad;
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_SAMPLEFORMAT,tif->tif_dir.td_sampleformat))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMINSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_sminsamplevalue))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMAXSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_smaxsamplevalue))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_IMAGEDEPTH,tif->tif_dir.td_imagedepth))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_TILEDEPTH,tif->tif_dir.td_tiledepth))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_HALFTONEHINTS,2,&tif->tif_dir.td_halftonehints[0]))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_YCBCRSUBSAMPLING,2,&tif->tif_dir.td_ycbcrsubsampling[0]))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_YCBCRPOSITIONING,tif->tif_dir.td_ycbcrpositioning))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,TIFFTAG_REFERENCEBLACKWHITE,6,tif->tif_dir.td_refblackwhite))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagTransferfunction(tif,&ndir,dir))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_INKNAMES))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,TIFFTAG_INKNAMES,tif->tif_dir.td_inknameslen,tif->tif_dir.td_inknames))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			if (TIFFFieldSet(tif,FIELD_SUBIFD))
Packit 7838c8
			{
Packit 7838c8
				if (!TIFFWriteDirectoryTagSubifd(tif,&ndir,dir))
Packit 7838c8
					goto bad;
Packit 7838c8
			}
Packit 7838c8
			{
Packit 7838c8
				uint32 n;
Packit 7838c8
				for (n=0; n<tif->tif_nfields; n++) {
Packit 7838c8
					const TIFFField* o;
Packit 7838c8
					o = tif->tif_fields[n];
Packit 7838c8
					if ((o->field_bit>=FIELD_CODEC)&&(TIFFFieldSet(tif,o->field_bit)))
Packit 7838c8
					{
Packit 7838c8
						switch (o->get_field_type)
Packit 7838c8
						{
Packit 7838c8
							case TIFF_SETGET_ASCII:
Packit 7838c8
								{
Packit 7838c8
									uint32 pa;
Packit 7838c8
									char* pb;
Packit 7838c8
									assert(o->field_type==TIFF_ASCII);
Packit 7838c8
									assert(o->field_readcount==TIFF_VARIABLE);
Packit 7838c8
									assert(o->field_passcount==0);
Packit 7838c8
									TIFFGetField(tif,o->field_tag,&pb;;
Packit 7838c8
									pa=(uint32)(strlen(pb));
Packit 7838c8
									if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,(uint16)o->field_tag,pa,pb))
Packit 7838c8
										goto bad;
Packit 7838c8
								}
Packit 7838c8
								break;
Packit 7838c8
							case TIFF_SETGET_UINT16:
Packit 7838c8
								{
Packit 7838c8
									uint16 p;
Packit 7838c8
									assert(o->field_type==TIFF_SHORT);
Packit 7838c8
									assert(o->field_readcount==1);
Packit 7838c8
									assert(o->field_passcount==0);
Packit 7838c8
									TIFFGetField(tif,o->field_tag,&p);
Packit 7838c8
									if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,(uint16)o->field_tag,p))
Packit 7838c8
										goto bad;
Packit 7838c8
								}
Packit 7838c8
								break;
Packit 7838c8
							case TIFF_SETGET_UINT32:
Packit 7838c8
								{
Packit 7838c8
									uint32 p;
Packit 7838c8
									assert(o->field_type==TIFF_LONG);
Packit 7838c8
									assert(o->field_readcount==1);
Packit 7838c8
									assert(o->field_passcount==0);
Packit 7838c8
									TIFFGetField(tif,o->field_tag,&p);
Packit 7838c8
									if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,(uint16)o->field_tag,p))
Packit 7838c8
										goto bad;
Packit 7838c8
								}
Packit 7838c8
								break;
Packit 7838c8
							case TIFF_SETGET_C32_UINT8:
Packit 7838c8
								{
Packit 7838c8
									uint32 pa;
Packit 7838c8
									void* pb;
Packit 7838c8
									assert(o->field_type==TIFF_UNDEFINED);
Packit 7838c8
									assert(o->field_readcount==TIFF_VARIABLE2);
Packit 7838c8
									assert(o->field_passcount==1);
Packit 7838c8
									TIFFGetField(tif,o->field_tag,&pa,&pb;;
Packit 7838c8
									if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,(uint16)o->field_tag,pa,pb))
Packit 7838c8
										goto bad;
Packit 7838c8
								}
Packit 7838c8
								break;
Packit 7838c8
							default:
Packit 7838c8
								assert(0);   /* we should never get here */
Packit 7838c8
								break;
Packit 7838c8
						}
Packit 7838c8
					}
Packit 7838c8
				}
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		for (m=0; m<(uint32)(tif->tif_dir.td_customValueCount); m++)
Packit 7838c8
		{
Packit 7838c8
                        uint16 tag = (uint16)tif->tif_dir.td_customValues[m].info->field_tag;
Packit 7838c8
                        uint32 count = tif->tif_dir.td_customValues[m].count;
Packit 7838c8
			switch (tif->tif_dir.td_customValues[m].info->field_type)
Packit 7838c8
			{
Packit 7838c8
				case TIFF_ASCII:
Packit 7838c8
					if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_UNDEFINED:
Packit 7838c8
					if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_BYTE:
Packit 7838c8
					if (!TIFFWriteDirectoryTagByteArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_SBYTE:
Packit 7838c8
					if (!TIFFWriteDirectoryTagSbyteArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_SHORT:
Packit 7838c8
					if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_SSHORT:
Packit 7838c8
					if (!TIFFWriteDirectoryTagSshortArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_LONG:
Packit 7838c8
					if (!TIFFWriteDirectoryTagLongArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_SLONG:
Packit 7838c8
					if (!TIFFWriteDirectoryTagSlongArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_LONG8:
Packit 7838c8
					if (!TIFFWriteDirectoryTagLong8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_SLONG8:
Packit 7838c8
					if (!TIFFWriteDirectoryTagSlong8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_RATIONAL:
Packit 7838c8
					if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_SRATIONAL:
Packit 7838c8
					if (!TIFFWriteDirectoryTagSrationalArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_FLOAT:
Packit 7838c8
					if (!TIFFWriteDirectoryTagFloatArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_DOUBLE:
Packit 7838c8
					if (!TIFFWriteDirectoryTagDoubleArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_IFD:
Packit 7838c8
					if (!TIFFWriteDirectoryTagIfdArray(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				case TIFF_IFD8:
Packit 7838c8
					if (!TIFFWriteDirectoryTagIfdIfd8Array(tif,&ndir,dir,tag,count,tif->tif_dir.td_customValues[m].value))
Packit 7838c8
						goto bad;
Packit 7838c8
					break;
Packit 7838c8
				default:
Packit 7838c8
					assert(0);   /* we should never get here */
Packit 7838c8
					break;
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		if (dir!=NULL)
Packit 7838c8
			break;
Packit 7838c8
		dir=_TIFFmalloc(ndir*sizeof(TIFFDirEntry));
Packit 7838c8
		if (dir==NULL)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
			goto bad;
Packit 7838c8
		}
Packit 7838c8
		if (isimage)
Packit 7838c8
		{
Packit 7838c8
			if ((tif->tif_diroff==0)&&(!TIFFLinkDirectory(tif)))
Packit 7838c8
				goto bad;
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
			tif->tif_diroff=(TIFFSeekFile(tif,0,SEEK_END)+1)&(~((toff_t)1));
Packit 7838c8
		if (pdiroff!=NULL)
Packit 7838c8
			*pdiroff=tif->tif_diroff;
Packit 7838c8
		if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
			dirsize=2+ndir*12+4;
Packit 7838c8
		else
Packit 7838c8
			dirsize=8+ndir*20+8;
Packit 7838c8
		tif->tif_dataoff=tif->tif_diroff+dirsize;
Packit 7838c8
		if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
			tif->tif_dataoff=(uint32)tif->tif_dataoff;
Packit 7838c8
		if ((tif->tif_dataoff<tif->tif_diroff)||(tif->tif_dataoff<(uint64)dirsize))
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
Packit 7838c8
			goto bad;
Packit 7838c8
		}
Packit 7838c8
		if (tif->tif_dataoff&1)
Packit 7838c8
			tif->tif_dataoff++;
Packit 7838c8
		if (isimage)
Packit 7838c8
			tif->tif_curdir++;
Packit 7838c8
	}
Packit 7838c8
	if (isimage)
Packit 7838c8
	{
Packit 7838c8
		if (TIFFFieldSet(tif,FIELD_SUBIFD)&&(tif->tif_subifdoff==0))
Packit 7838c8
		{
Packit 7838c8
			uint32 na;
Packit 7838c8
			TIFFDirEntry* nb;
Packit 7838c8
			for (na=0, nb=dir; ; na++, nb++)
Packit 7838c8
			{
Packit 7838c8
				if( na == ndir )
Packit 7838c8
                                {
Packit 7838c8
                                    TIFFErrorExt(tif->tif_clientdata,module,
Packit 7838c8
                                                 "Cannot find SubIFD tag");
Packit 7838c8
                                    goto bad;
Packit 7838c8
                                }
Packit 7838c8
				if (nb->tdir_tag==TIFFTAG_SUBIFD)
Packit 7838c8
					break;
Packit 7838c8
			}
Packit 7838c8
			if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
				tif->tif_subifdoff=tif->tif_diroff+2+na*12+8;
Packit 7838c8
			else
Packit 7838c8
				tif->tif_subifdoff=tif->tif_diroff+8+na*20+12;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	dirmem=_TIFFmalloc(dirsize);
Packit 7838c8
	if (dirmem==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		goto bad;
Packit 7838c8
	}
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		uint8* n;
Packit 7838c8
		uint32 nTmp;
Packit 7838c8
		TIFFDirEntry* o;
Packit 7838c8
		n=dirmem;
Packit 7838c8
		*(uint16*)n=(uint16)ndir;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabShort((uint16*)n);
Packit 7838c8
		n+=2;
Packit 7838c8
		o=dir;
Packit 7838c8
		for (m=0; m
Packit 7838c8
		{
Packit 7838c8
			*(uint16*)n=o->tdir_tag;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabShort((uint16*)n);
Packit 7838c8
			n+=2;
Packit 7838c8
			*(uint16*)n=o->tdir_type;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabShort((uint16*)n);
Packit 7838c8
			n+=2;
Packit 7838c8
			nTmp = (uint32)o->tdir_count;
Packit 7838c8
			_TIFFmemcpy(n,&nTmp,4);
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong((uint32*)n);
Packit 7838c8
			n+=4;
Packit 7838c8
			/* This is correct. The data has been */
Packit 7838c8
			/* swabbed previously in TIFFWriteDirectoryTagData */
Packit 7838c8
			_TIFFmemcpy(n,&o->tdir_offset,4);
Packit 7838c8
			n+=4;
Packit 7838c8
			o++;
Packit 7838c8
		}
Packit 7838c8
		nTmp = (uint32)tif->tif_nextdiroff;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&nTmp);
Packit 7838c8
		_TIFFmemcpy(n,&nTmp,4);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		uint8* n;
Packit 7838c8
		TIFFDirEntry* o;
Packit 7838c8
		n=dirmem;
Packit 7838c8
		*(uint64*)n=ndir;
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong8((uint64*)n);
Packit 7838c8
		n+=8;
Packit 7838c8
		o=dir;
Packit 7838c8
		for (m=0; m
Packit 7838c8
		{
Packit 7838c8
			*(uint16*)n=o->tdir_tag;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabShort((uint16*)n);
Packit 7838c8
			n+=2;
Packit 7838c8
			*(uint16*)n=o->tdir_type;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabShort((uint16*)n);
Packit 7838c8
			n+=2;
Packit 7838c8
			_TIFFmemcpy(n,&o->tdir_count,8);
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong8((uint64*)n);
Packit 7838c8
			n+=8;
Packit 7838c8
			_TIFFmemcpy(n,&o->tdir_offset,8);
Packit 7838c8
			n+=8;
Packit 7838c8
			o++;
Packit 7838c8
		}
Packit 7838c8
		_TIFFmemcpy(n,&tif->tif_nextdiroff,8);
Packit 7838c8
		if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong8((uint64*)n);
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(dir);
Packit 7838c8
	dir=NULL;
Packit 7838c8
	if (!SeekOK(tif,tif->tif_diroff))
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
Packit 7838c8
		goto bad;
Packit 7838c8
	}
Packit 7838c8
	if (!WriteOK(tif,dirmem,(tmsize_t)dirsize))
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
Packit 7838c8
		goto bad;
Packit 7838c8
	}
Packit 7838c8
	_TIFFfree(dirmem);
Packit 7838c8
	if (imagedone)
Packit 7838c8
	{
Packit 7838c8
		TIFFFreeDirectory(tif);
Packit 7838c8
		tif->tif_flags &= ~TIFF_DIRTYDIRECT;
Packit 7838c8
		tif->tif_flags &= ~TIFF_DIRTYSTRIP;
Packit 7838c8
		(*tif->tif_cleanup)(tif);
Packit 7838c8
		/*
Packit 7838c8
		* Reset directory-related state for subsequent
Packit 7838c8
		* directories.
Packit 7838c8
		*/
Packit 7838c8
		TIFFCreateDirectory(tif);
Packit 7838c8
	}
Packit 7838c8
	return(1);
Packit 7838c8
bad:
Packit 7838c8
	if (dir!=NULL)
Packit 7838c8
		_TIFFfree(dir);
Packit 7838c8
	if (dirmem!=NULL)
Packit 7838c8
		_TIFFfree(dirmem);
Packit 7838c8
	return(0);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static float TIFFClampDoubleToFloat( double val )
Packit 7838c8
{
Packit 7838c8
    if( val > FLT_MAX )
Packit 7838c8
        return FLT_MAX;
Packit 7838c8
    if( val < -FLT_MAX )
Packit 7838c8
        return -FLT_MAX;
Packit 7838c8
    return (float)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int8 TIFFClampDoubleToInt8( double val )
Packit 7838c8
{
Packit 7838c8
    if( val > 127 )
Packit 7838c8
        return 127;
Packit 7838c8
    if( val < -128 || val != val )
Packit 7838c8
        return -128;
Packit 7838c8
    return (int8)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int16 TIFFClampDoubleToInt16( double val )
Packit 7838c8
{
Packit 7838c8
    if( val > 32767 )
Packit 7838c8
        return 32767;
Packit 7838c8
    if( val < -32768 || val != val )
Packit 7838c8
        return -32768;
Packit 7838c8
    return (int16)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int32 TIFFClampDoubleToInt32( double val )
Packit 7838c8
{
Packit 7838c8
    if( val > 0x7FFFFFFF )
Packit 7838c8
        return 0x7FFFFFFF;
Packit 7838c8
    if( val < -0x7FFFFFFF-1 || val != val )
Packit 7838c8
        return -0x7FFFFFFF-1;
Packit 7838c8
    return (int32)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static uint8 TIFFClampDoubleToUInt8( double val )
Packit 7838c8
{
Packit 7838c8
    if( val < 0 )
Packit 7838c8
        return 0;
Packit 7838c8
    if( val > 255 || val != val )
Packit 7838c8
        return 255;
Packit 7838c8
    return (uint8)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static uint16 TIFFClampDoubleToUInt16( double val )
Packit 7838c8
{
Packit 7838c8
    if( val < 0 )
Packit 7838c8
        return 0;
Packit 7838c8
    if( val > 65535 || val != val )
Packit 7838c8
        return 65535;
Packit 7838c8
    return (uint16)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static uint32 TIFFClampDoubleToUInt32( double val )
Packit 7838c8
{
Packit 7838c8
    if( val < 0 )
Packit 7838c8
        return 0;
Packit 7838c8
    if( val > 0xFFFFFFFFU || val != val )
Packit 7838c8
        return 0xFFFFFFFFU;
Packit 7838c8
    return (uint32)val;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagSampleformatArray";
Packit 7838c8
	void* conv;
Packit 7838c8
	uint32 i;
Packit 7838c8
	int ok;
Packit 7838c8
	conv = _TIFFmalloc(count*sizeof(double));
Packit 7838c8
	if (conv == NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata, module, "Out of memory");
Packit 7838c8
		return (0);
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	switch (tif->tif_dir.td_sampleformat)
Packit 7838c8
	{
Packit 7838c8
		case SAMPLEFORMAT_IEEEFP:
Packit 7838c8
			if (tif->tif_dir.td_bitspersample<=32)
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((float*)conv)[i] = TIFFClampDoubleToFloat(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv);
Packit 7838c8
			}
Packit 7838c8
			else
Packit 7838c8
			{
Packit 7838c8
				ok = TIFFWriteDirectoryTagDoubleArray(tif,ndir,dir,tag,count,value);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case SAMPLEFORMAT_INT:
Packit 7838c8
			if (tif->tif_dir.td_bitspersample<=8)
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((int8*)conv)[i] = TIFFClampDoubleToInt8(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv);
Packit 7838c8
			}
Packit 7838c8
			else if (tif->tif_dir.td_bitspersample<=16)
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((int16*)conv)[i] = TIFFClampDoubleToInt16(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv);
Packit 7838c8
			}
Packit 7838c8
			else
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((int32*)conv)[i] = TIFFClampDoubleToInt32(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		case SAMPLEFORMAT_UINT:
Packit 7838c8
			if (tif->tif_dir.td_bitspersample<=8)
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((uint8*)conv)[i] = TIFFClampDoubleToUInt8(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv);
Packit 7838c8
			}
Packit 7838c8
			else if (tif->tif_dir.td_bitspersample<=16)
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((uint16*)conv)[i] = TIFFClampDoubleToUInt16(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv);
Packit 7838c8
			}
Packit 7838c8
			else
Packit 7838c8
			{
Packit 7838c8
				for (i = 0; i < count; ++i)
Packit 7838c8
					((uint32*)conv)[i] = TIFFClampDoubleToUInt32(value[i]);
Packit 7838c8
				ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv);
Packit 7838c8
			}
Packit 7838c8
			break;
Packit 7838c8
		default:
Packit 7838c8
			ok = 0;
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	_TIFFfree(conv);
Packit 7838c8
	return (ok);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
Packit 7838c8
{
Packit 7838c8
	switch (tif->tif_dir.td_sampleformat)
Packit 7838c8
	{
Packit 7838c8
		case SAMPLEFORMAT_IEEEFP:
Packit 7838c8
			if (tif->tif_dir.td_bitspersample<=32)
Packit 7838c8
				return(TIFFWriteDirectoryTagFloatPerSample(tif,ndir,dir,tag,(float)value));
Packit 7838c8
			else
Packit 7838c8
				return(TIFFWriteDirectoryTagDoublePerSample(tif,ndir,dir,tag,value));
Packit 7838c8
		case SAMPLEFORMAT_INT:
Packit 7838c8
			if (tif->tif_dir.td_bitspersample<=8)
Packit 7838c8
				return(TIFFWriteDirectoryTagSbytePerSample(tif,ndir,dir,tag,(int8)value));
Packit 7838c8
			else if (tif->tif_dir.td_bitspersample<=16)
Packit 7838c8
				return(TIFFWriteDirectoryTagSshortPerSample(tif,ndir,dir,tag,(int16)value));
Packit 7838c8
			else
Packit 7838c8
				return(TIFFWriteDirectoryTagSlongPerSample(tif,ndir,dir,tag,(int32)value));
Packit 7838c8
		case SAMPLEFORMAT_UINT:
Packit 7838c8
			if (tif->tif_dir.td_bitspersample<=8)
Packit 7838c8
				return(TIFFWriteDirectoryTagBytePerSample(tif,ndir,dir,tag,(uint8)value));
Packit 7838c8
			else if (tif->tif_dir.td_bitspersample<=16)
Packit 7838c8
				return(TIFFWriteDirectoryTagShortPerSample(tif,ndir,dir,tag,(uint16)value));
Packit 7838c8
			else
Packit 7838c8
				return(TIFFWriteDirectoryTagLongPerSample(tif,ndir,dir,tag,(uint32)value));
Packit 7838c8
		default:
Packit 7838c8
			return(1);
Packit 7838c8
	}
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedAscii(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedUndefinedArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedByte(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagBytePerSample";
Packit 7838c8
	uint8* m;
Packit 7838c8
	uint8* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint8));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSbyte(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagSbytePerSample";
Packit 7838c8
	int8* m;
Packit 7838c8
	int8* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int8));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagShortPerSample";
Packit 7838c8
	uint16* m;
Packit 7838c8
	uint16* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint16));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSshort(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagSshortPerSample";
Packit 7838c8
	int16* m;
Packit 7838c8
	int16* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int16));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagLongPerSample";
Packit 7838c8
	uint32* m;
Packit 7838c8
	uint32* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint32));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSlong(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagSlongPerSample";
Packit 7838c8
	int32* m;
Packit 7838c8
	int32* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int32));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedLong8(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSlong8(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSlong8Array(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedRational(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedRationalArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedSrationalArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedFloat(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagFloatPerSample";
Packit 7838c8
	float* m;
Packit 7838c8
	float* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(float));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedDouble(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#if 0
Packit 7838c8
static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagDoublePerSample";
Packit 7838c8
	double* m;
Packit 7838c8
	double* na;
Packit 7838c8
	uint16 nb;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(double));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
Packit 7838c8
		*na=value;
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,tag,count,value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
Packit 7838c8
{
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	if (value<=0xFFFF)
Packit 7838c8
		return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,(uint16)value));
Packit 7838c8
	else
Packit 7838c8
		return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/************************************************************************/
Packit 7838c8
/*                TIFFWriteDirectoryTagLongLong8Array()                 */
Packit 7838c8
/*                                                                      */
Packit 7838c8
/*      Write out LONG8 array as LONG8 for BigTIFF or LONG for          */
Packit 7838c8
/*      Classic TIFF with some checking.                                */
Packit 7838c8
/************************************************************************/
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
    static const char module[] = "TIFFWriteDirectoryTagLongLong8Array";
Packit 7838c8
    uint64* ma;
Packit 7838c8
    uint32 mb;
Packit 7838c8
    uint32* p;
Packit 7838c8
    uint32* q;
Packit 7838c8
    int o;
Packit 7838c8
Packit 7838c8
    /* is this just a counting pass? */
Packit 7838c8
    if (dir==NULL)
Packit 7838c8
    {
Packit 7838c8
        (*ndir)++;
Packit 7838c8
        return(1);
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    /* We always write LONG8 for BigTIFF, no checking needed. */
Packit 7838c8
    if( tif->tif_flags&TIFF_BIGTIFF )
Packit 7838c8
        return TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,
Packit 7838c8
                                                      tag,count,value);
Packit 7838c8
Packit 7838c8
    /*
Packit 7838c8
    ** For classic tiff we want to verify everything is in range for LONG
Packit 7838c8
    ** and convert to long format.
Packit 7838c8
    */
Packit 7838c8
Packit 7838c8
    p = _TIFFmalloc(count*sizeof(uint32));
Packit 7838c8
    if (p==NULL)
Packit 7838c8
    {
Packit 7838c8
        TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
        return(0);
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    for (q=p, ma=value, mb=0; mb
Packit 7838c8
    {
Packit 7838c8
        if (*ma>0xFFFFFFFF)
Packit 7838c8
        {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata,module,
Packit 7838c8
                         "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
Packit 7838c8
            _TIFFfree(p);
Packit 7838c8
            return(0);
Packit 7838c8
        }
Packit 7838c8
        *q= (uint32)(*ma);
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
Packit 7838c8
    _TIFFfree(p);
Packit 7838c8
Packit 7838c8
    return(o);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/************************************************************************/
Packit 7838c8
/*                 TIFFWriteDirectoryTagIfdIfd8Array()                  */
Packit 7838c8
/*                                                                      */
Packit 7838c8
/*      Write either IFD8 or IFD array depending on file type.          */
Packit 7838c8
/************************************************************************/
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
    static const char module[] = "TIFFWriteDirectoryTagIfdIfd8Array";
Packit 7838c8
    uint64* ma;
Packit 7838c8
    uint32 mb;
Packit 7838c8
    uint32* p;
Packit 7838c8
    uint32* q;
Packit 7838c8
    int o;
Packit 7838c8
Packit 7838c8
    /* is this just a counting pass? */
Packit 7838c8
    if (dir==NULL)
Packit 7838c8
    {
Packit 7838c8
        (*ndir)++;
Packit 7838c8
        return(1);
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    /* We always write IFD8 for BigTIFF, no checking needed. */
Packit 7838c8
    if( tif->tif_flags&TIFF_BIGTIFF )
Packit 7838c8
        return TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,
Packit 7838c8
                                                     tag,count,value);
Packit 7838c8
Packit 7838c8
    /*
Packit 7838c8
    ** For classic tiff we want to verify everything is in range for IFD
Packit 7838c8
    ** and convert to long format.
Packit 7838c8
    */
Packit 7838c8
Packit 7838c8
    p = _TIFFmalloc(count*sizeof(uint32));
Packit 7838c8
    if (p==NULL)
Packit 7838c8
    {
Packit 7838c8
        TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
        return(0);
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    for (q=p, ma=value, mb=0; mb
Packit 7838c8
    {
Packit 7838c8
        if (*ma>0xFFFFFFFF)
Packit 7838c8
        {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata,module,
Packit 7838c8
                         "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
Packit 7838c8
            _TIFFfree(p);
Packit 7838c8
            return(0);
Packit 7838c8
        }
Packit 7838c8
        *q= (uint32)(*ma);
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    o=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,p);
Packit 7838c8
    _TIFFfree(p);
Packit 7838c8
Packit 7838c8
    return(o);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagShortLongLong8Array";
Packit 7838c8
	uint64* ma;
Packit 7838c8
	uint32 mb;
Packit 7838c8
	uint8 n;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	n=0;
Packit 7838c8
	for (ma=value, mb=0; mb
Packit 7838c8
	{
Packit 7838c8
		if ((n==0)&&(*ma>0xFFFF))
Packit 7838c8
			n=1;
Packit 7838c8
		if ((n==1)&&(*ma>0xFFFFFFFF))
Packit 7838c8
		{
Packit 7838c8
			n=2;
Packit 7838c8
			break;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	if (n==0)
Packit 7838c8
	{
Packit 7838c8
		uint16* p;
Packit 7838c8
		uint16* q;
Packit 7838c8
		p=_TIFFmalloc(count*sizeof(uint16));
Packit 7838c8
		if (p==NULL)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		for (ma=value, mb=0, q=p; mb
Packit 7838c8
			*q=(uint16)(*ma);
Packit 7838c8
		o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,p);
Packit 7838c8
		_TIFFfree(p);
Packit 7838c8
	}
Packit 7838c8
	else if (n==1)
Packit 7838c8
	{
Packit 7838c8
		uint32* p;
Packit 7838c8
		uint32* q;
Packit 7838c8
		p=_TIFFmalloc(count*sizeof(uint32));
Packit 7838c8
		if (p==NULL)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		for (ma=value, mb=0, q=p; mb
Packit 7838c8
			*q=(uint32)(*ma);
Packit 7838c8
		o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
Packit 7838c8
		_TIFFfree(p);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		assert(n==2);
Packit 7838c8
		o=TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value);
Packit 7838c8
	}
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagColormap";
Packit 7838c8
	uint32 m;
Packit 7838c8
	uint16* n;
Packit 7838c8
	int o;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=(1<<tif->tif_dir.td_bitspersample);
Packit 7838c8
	n=_TIFFmalloc(3*m*sizeof(uint16));
Packit 7838c8
	if (n==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	_TIFFmemcpy(&n[0],tif->tif_dir.td_colormap[0],m*sizeof(uint16));
Packit 7838c8
	_TIFFmemcpy(&n[m],tif->tif_dir.td_colormap[1],m*sizeof(uint16));
Packit 7838c8
	_TIFFmemcpy(&n[2*m],tif->tif_dir.td_colormap[2],m*sizeof(uint16));
Packit 7838c8
	o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_COLORMAP,3*m,n);
Packit 7838c8
	_TIFFfree(n);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagTransferfunction";
Packit 7838c8
	uint32 m;
Packit 7838c8
	uint16 n;
Packit 7838c8
	uint16* o;
Packit 7838c8
	int p;
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=(1<<tif->tif_dir.td_bitspersample);
Packit 7838c8
	n=tif->tif_dir.td_samplesperpixel-tif->tif_dir.td_extrasamples;
Packit 7838c8
	/*
Packit 7838c8
	 * Check if the table can be written as a single column,
Packit 7838c8
	 * or if it must be written as 3 columns.  Note that we
Packit 7838c8
	 * write a 3-column tag if there are 2 samples/pixel and
Packit 7838c8
	 * a single column of data won't suffice--hmm.
Packit 7838c8
	 */
Packit 7838c8
	if (n>3)
Packit 7838c8
		n=3;
Packit 7838c8
	if (n==3)
Packit 7838c8
	{
Packit 7838c8
		if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16)))
Packit 7838c8
			n=2;
Packit 7838c8
	}
Packit 7838c8
	if (n==2)
Packit 7838c8
	{
Packit 7838c8
		if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16)))
Packit 7838c8
			n=1;
Packit 7838c8
	}
Packit 7838c8
	if (n==0)
Packit 7838c8
		n=1;
Packit 7838c8
	o=_TIFFmalloc(n*m*sizeof(uint16));
Packit 7838c8
	if (o==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	_TIFFmemcpy(&o[0],tif->tif_dir.td_transferfunction[0],m*sizeof(uint16));
Packit 7838c8
	if (n>1)
Packit 7838c8
		_TIFFmemcpy(&o[m],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16));
Packit 7838c8
	if (n>2)
Packit 7838c8
		_TIFFmemcpy(&o[2*m],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16));
Packit 7838c8
	p=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_TRANSFERFUNCTION,n*m,o);
Packit 7838c8
	_TIFFfree(o);
Packit 7838c8
	return(p);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagSubifd";
Packit 7838c8
	uint64 m;
Packit 7838c8
	int n;
Packit 7838c8
	if (tif->tif_dir.td_nsubifd==0)
Packit 7838c8
		return(1);
Packit 7838c8
	if (dir==NULL)
Packit 7838c8
	{
Packit 7838c8
		(*ndir)++;
Packit 7838c8
		return(1);
Packit 7838c8
	}
Packit 7838c8
	m=tif->tif_dataoff;
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		uint32* o;
Packit 7838c8
		uint64* pa;
Packit 7838c8
		uint32* pb;
Packit 7838c8
		uint16 p;
Packit 7838c8
		o=_TIFFmalloc(tif->tif_dir.td_nsubifd*sizeof(uint32));
Packit 7838c8
		if (o==NULL)
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		pa=tif->tif_dir.td_subifd;
Packit 7838c8
		pb=o;
Packit 7838c8
		for (p=0; p < tif->tif_dir.td_nsubifd; p++)
Packit 7838c8
		{
Packit 7838c8
                        assert(pa != 0);
Packit 7838c8
Packit 7838c8
                        /* Could happen if an classicTIFF has a SubIFD of type LONG8 (which is illegal) */
Packit 7838c8
                        if( *pa > 0xFFFFFFFFUL)
Packit 7838c8
                        {
Packit 7838c8
                            TIFFErrorExt(tif->tif_clientdata,module,"Illegal value for SubIFD tag");
Packit 7838c8
                            _TIFFfree(o);
Packit 7838c8
                            return(0);
Packit 7838c8
                        }
Packit 7838c8
			*pb++=(uint32)(*pa++);
Packit 7838c8
		}
Packit 7838c8
		n=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,o);
Packit 7838c8
		_TIFFfree(o);
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
		n=TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,tif->tif_dir.td_subifd);
Packit 7838c8
	if (!n)
Packit 7838c8
		return(0);
Packit 7838c8
	/*
Packit 7838c8
	 * Total hack: if this directory includes a SubIFD
Packit 7838c8
	 * tag then force the next <n> directories to be
Packit 7838c8
	 * written as ``sub directories'' of this one.  This
Packit 7838c8
	 * is used to write things like thumbnails and
Packit 7838c8
	 * image masks that one wants to keep out of the
Packit 7838c8
	 * normal directory linkage access mechanism.
Packit 7838c8
	 */
Packit 7838c8
	tif->tif_flags|=TIFF_INSUBIFD;
Packit 7838c8
	tif->tif_nsubifd=tif->tif_dir.td_nsubifd;
Packit 7838c8
	if (tif->tif_dir.td_nsubifd==1)
Packit 7838c8
		tif->tif_subifdoff=0;
Packit 7838c8
	else
Packit 7838c8
		tif->tif_subifdoff=m;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(char)==1);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_ASCII,count,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(uint8)==1);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_UNDEFINED,count,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(uint8)==1);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,1,1,&value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(uint8)==1);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,count,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(int8)==1);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,1,1,&value));
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
Packit 7838c8
{
Packit 7838c8
	assert(sizeof(int8)==1);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,count,count,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
Packit 7838c8
{
Packit 7838c8
	uint16 m;
Packit 7838c8
	assert(sizeof(uint16)==2);
Packit 7838c8
	m=value;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabShort(&m);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,1,2,&m);;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x80000000);
Packit 7838c8
	assert(sizeof(uint16)==2);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfShort(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,count,count*2,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
Packit 7838c8
{
Packit 7838c8
	int16 m;
Packit 7838c8
	assert(sizeof(int16)==2);
Packit 7838c8
	m=value;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabShort((uint16*)(&m);;
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,1,2,&m);;
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x80000000);
Packit 7838c8
	assert(sizeof(int16)==2);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfShort((uint16*)value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,count,count*2,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
Packit 7838c8
{
Packit 7838c8
	uint32 m;
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	m=value;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong(&m);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,1,4,&m);;
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x40000000);
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,count,count*4,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
Packit 7838c8
{
Packit 7838c8
	int32 m;
Packit 7838c8
	assert(sizeof(int32)==4);
Packit 7838c8
	m=value;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong((uint32*)(&m);;
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,1,4,&m);;
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x40000000);
Packit 7838c8
	assert(sizeof(int32)==4);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong((uint32*)value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,count,count*4,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
Packit 7838c8
{
Packit 7838c8
	uint64 m;
Packit 7838c8
	assert(sizeof(uint64)==8);
Packit 7838c8
	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8","LONG8 not allowed for ClassicTIFF");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	m=value;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong8(&m);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,1,8,&m);;
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x20000000);
Packit 7838c8
	assert(sizeof(uint64)==8);
Packit 7838c8
	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedLong8Array","LONG8 not allowed for ClassicTIFF");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong8(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
Packit 7838c8
{
Packit 7838c8
	int64 m;
Packit 7838c8
	assert(sizeof(int64)==8);
Packit 7838c8
	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedSlong8","SLONG8 not allowed for ClassicTIFF");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	m=value;
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabLong8((uint64*)(&m);;
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,1,8,&m);;
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x20000000);
Packit 7838c8
	assert(sizeof(int64)==8);
Packit 7838c8
	if( !(tif->tif_flags&TIFF_BIGTIFF) ) {
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,"TIFFWriteDirectoryTagCheckedSlong8Array","SLONG8 not allowed for ClassicTIFF");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong8((uint64*)value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
Packit 7838c8
{
Packit 7838c8
        static const char module[] = "TIFFWriteDirectoryTagCheckedRational";
Packit 7838c8
	uint32 m[2];
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
        if( value < 0 )
Packit 7838c8
        {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata,module,"Negative value is illegal");
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
        else if( value != value )
Packit 7838c8
        {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata,module,"Not-a-number value is illegal");
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
	else if (value==0.0)
Packit 7838c8
	{
Packit 7838c8
		m[0]=0;
Packit 7838c8
		m[1]=1;
Packit 7838c8
	}
Packit 7838c8
	else if (value <= 0xFFFFFFFFU && value==(double)(uint32)value)
Packit 7838c8
	{
Packit 7838c8
		m[0]=(uint32)value;
Packit 7838c8
		m[1]=1;
Packit 7838c8
	}
Packit 7838c8
	else if (value<1.0)
Packit 7838c8
	{
Packit 7838c8
		m[0]=(uint32)(value*0xFFFFFFFF);
Packit 7838c8
		m[1]=0xFFFFFFFF;
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		m[0]=0xFFFFFFFF;
Packit 7838c8
		m[1]=(uint32)(0xFFFFFFFF/value);
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
	{
Packit 7838c8
		TIFFSwabLong(&m[0]);
Packit 7838c8
		TIFFSwabLong(&m[1]);
Packit 7838c8
	}
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,1,8,&m[0]));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray";
Packit 7838c8
	uint32* m;
Packit 7838c8
	float* na;
Packit 7838c8
	uint32* nb;
Packit 7838c8
	uint32 nc;
Packit 7838c8
	int o;
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	m=_TIFFmalloc(count*2*sizeof(uint32));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=value, nb=m, nc=0; nc
Packit 7838c8
	{
Packit 7838c8
		if (*na<=0.0 || *na != *na)
Packit 7838c8
		{
Packit 7838c8
			nb[0]=0;
Packit 7838c8
			nb[1]=1;
Packit 7838c8
		}
Packit 7838c8
		else if (*na >= 0 && *na <= (float)0xFFFFFFFFU &&
Packit 7838c8
                         *na==(float)(uint32)(*na))
Packit 7838c8
		{
Packit 7838c8
			nb[0]=(uint32)(*na);
Packit 7838c8
			nb[1]=1;
Packit 7838c8
		}
Packit 7838c8
		else if (*na<1.0)
Packit 7838c8
		{
Packit 7838c8
			nb[0]=(uint32)((double)(*na)*0xFFFFFFFF);
Packit 7838c8
			nb[1]=0xFFFFFFFF;
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			nb[0]=0xFFFFFFFF;
Packit 7838c8
			nb[1]=(uint32)((double)0xFFFFFFFF/(*na));
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong(m,count*2);
Packit 7838c8
	o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,count,count*8,&m[0]);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray";
Packit 7838c8
	int32* m;
Packit 7838c8
	float* na;
Packit 7838c8
	int32* nb;
Packit 7838c8
	uint32 nc;
Packit 7838c8
	int o;
Packit 7838c8
	assert(sizeof(int32)==4);
Packit 7838c8
	m=_TIFFmalloc(count*2*sizeof(int32));
Packit 7838c8
	if (m==NULL)
Packit 7838c8
	{
Packit 7838c8
		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
Packit 7838c8
		return(0);
Packit 7838c8
	}
Packit 7838c8
	for (na=value, nb=m, nc=0; nc
Packit 7838c8
	{
Packit 7838c8
		if (*na<0.0)
Packit 7838c8
		{
Packit 7838c8
			if (*na==(int32)(*na))
Packit 7838c8
			{
Packit 7838c8
				nb[0]=(int32)(*na);
Packit 7838c8
				nb[1]=1;
Packit 7838c8
			}
Packit 7838c8
			else if (*na>-1.0)
Packit 7838c8
			{
Packit 7838c8
				nb[0]=-(int32)((double)(-*na)*0x7FFFFFFF);
Packit 7838c8
				nb[1]=0x7FFFFFFF;
Packit 7838c8
			}
Packit 7838c8
			else
Packit 7838c8
			{
Packit 7838c8
				nb[0]=-0x7FFFFFFF;
Packit 7838c8
				nb[1]=(int32)((double)0x7FFFFFFF/(-*na));
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			if (*na==(int32)(*na))
Packit 7838c8
			{
Packit 7838c8
				nb[0]=(int32)(*na);
Packit 7838c8
				nb[1]=1;
Packit 7838c8
			}
Packit 7838c8
			else if (*na<1.0)
Packit 7838c8
			{
Packit 7838c8
				nb[0]=(int32)((double)(*na)*0x7FFFFFFF);
Packit 7838c8
				nb[1]=0x7FFFFFFF;
Packit 7838c8
			}
Packit 7838c8
			else
Packit 7838c8
			{
Packit 7838c8
				nb[0]=0x7FFFFFFF;
Packit 7838c8
				nb[1]=(int32)((double)0x7FFFFFFF/(*na));
Packit 7838c8
			}
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong((uint32*)m,count*2);
Packit 7838c8
	o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SRATIONAL,count,count*8,&m[0]);
Packit 7838c8
	_TIFFfree(m);
Packit 7838c8
	return(o);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
Packit 7838c8
{
Packit 7838c8
	float m;
Packit 7838c8
	assert(sizeof(float)==4);
Packit 7838c8
	m=value;
Packit 7838c8
	TIFFCvtNativeToIEEEFloat(tif,1,&m);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabFloat(&m);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,1,4,&m);;
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x40000000);
Packit 7838c8
	assert(sizeof(float)==4);
Packit 7838c8
	TIFFCvtNativeToIEEEFloat(tif,count,&value);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfFloat(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,count,count*4,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
#ifdef notdef
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
Packit 7838c8
{
Packit 7838c8
	double m;
Packit 7838c8
	assert(sizeof(double)==8);
Packit 7838c8
	m=value;
Packit 7838c8
	TIFFCvtNativeToIEEEDouble(tif,1,&m);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabDouble(&m);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,1,8,&m);;
Packit 7838c8
}
Packit 7838c8
#endif
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x20000000);
Packit 7838c8
	assert(sizeof(double)==8);
Packit 7838c8
	TIFFCvtNativeToIEEEDouble(tif,count,&value);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfDouble(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,count,count*8,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x40000000);
Packit 7838c8
	assert(sizeof(uint32)==4);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD,count,count*4,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
Packit 7838c8
{
Packit 7838c8
	assert(count<0x20000000);
Packit 7838c8
	assert(sizeof(uint64)==8);
Packit 7838c8
	assert(tif->tif_flags&TIFF_BIGTIFF);
Packit 7838c8
	if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
		TIFFSwabArrayOfLong8(value,count);
Packit 7838c8
	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD8,count,count*8,value));
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
static int
Packit 7838c8
TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFWriteDirectoryTagData";
Packit 7838c8
	uint32 m;
Packit 7838c8
	m=0;
Packit 7838c8
	while (m<(*ndir))
Packit 7838c8
	{
Packit 7838c8
		assert(dir[m].tdir_tag!=tag);
Packit 7838c8
		if (dir[m].tdir_tag>tag)
Packit 7838c8
			break;
Packit 7838c8
		m++;
Packit 7838c8
	}
Packit 7838c8
	if (m<(*ndir))
Packit 7838c8
	{
Packit 7838c8
		uint32 n;
Packit 7838c8
		for (n=*ndir; n>m; n--)
Packit 7838c8
			dir[n]=dir[n-1];
Packit 7838c8
	}
Packit 7838c8
	dir[m].tdir_tag=tag;
Packit 7838c8
	dir[m].tdir_type=datatype;
Packit 7838c8
	dir[m].tdir_count=count;
Packit 7838c8
	dir[m].tdir_offset.toff_long8 = 0;
Packit 7838c8
	if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U))
Packit 7838c8
		_TIFFmemcpy(&dir[m].tdir_offset,data,datalength);
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		uint64 na,nb;
Packit 7838c8
		na=tif->tif_dataoff;
Packit 7838c8
		nb=na+datalength;
Packit 7838c8
		if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
			nb=(uint32)nb;
Packit 7838c8
		if ((nb
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		if (!SeekOK(tif,na))
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		assert(datalength<0x80000000UL);
Packit 7838c8
		if (!WriteOK(tif,data,(tmsize_t)datalength))
Packit 7838c8
		{
Packit 7838c8
			TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
Packit 7838c8
			return(0);
Packit 7838c8
		}
Packit 7838c8
		tif->tif_dataoff=nb;
Packit 7838c8
		if (tif->tif_dataoff&1)
Packit 7838c8
			tif->tif_dataoff++;
Packit 7838c8
		if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
		{
Packit 7838c8
			uint32 o;
Packit 7838c8
			o=(uint32)na;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong(&o);
Packit 7838c8
			_TIFFmemcpy(&dir[m].tdir_offset,&o,4);
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			dir[m].tdir_offset.toff_long8 = na;
Packit 7838c8
			if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong8(&dir[m].tdir_offset.toff_long8);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	(*ndir)++;
Packit 7838c8
	return(1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/*
Packit 7838c8
 * Link the current directory into the directory chain for the file.
Packit 7838c8
 */
Packit 7838c8
static int
Packit 7838c8
TIFFLinkDirectory(TIFF* tif)
Packit 7838c8
{
Packit 7838c8
	static const char module[] = "TIFFLinkDirectory";
Packit 7838c8
Packit 7838c8
	tif->tif_diroff = (TIFFSeekFile(tif,0,SEEK_END)+1) & (~((toff_t)1));
Packit 7838c8
Packit 7838c8
	/*
Packit 7838c8
	 * Handle SubIFDs
Packit 7838c8
	 */
Packit 7838c8
	if (tif->tif_flags & TIFF_INSUBIFD)
Packit 7838c8
	{
Packit 7838c8
		if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
		{
Packit 7838c8
			uint32 m;
Packit 7838c8
			m = (uint32)tif->tif_diroff;
Packit 7838c8
			if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong(&m);
Packit 7838c8
			(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
Packit 7838c8
			if (!WriteOK(tif, &m, 4)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
				     "Error writing SubIFD directory link");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			/*
Packit 7838c8
			 * Advance to the next SubIFD or, if this is
Packit 7838c8
			 * the last one configured, revert back to the
Packit 7838c8
			 * normal directory linkage.
Packit 7838c8
			 */
Packit 7838c8
			if (--tif->tif_nsubifd)
Packit 7838c8
				tif->tif_subifdoff += 4;
Packit 7838c8
			else
Packit 7838c8
				tif->tif_flags &= ~TIFF_INSUBIFD;
Packit 7838c8
			return (1);
Packit 7838c8
		}
Packit 7838c8
		else
Packit 7838c8
		{
Packit 7838c8
			uint64 m;
Packit 7838c8
			m = tif->tif_diroff;
Packit 7838c8
			if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong8(&m);
Packit 7838c8
			(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
Packit 7838c8
			if (!WriteOK(tif, &m, 8)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
				     "Error writing SubIFD directory link");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			/*
Packit 7838c8
			 * Advance to the next SubIFD or, if this is
Packit 7838c8
			 * the last one configured, revert back to the
Packit 7838c8
			 * normal directory linkage.
Packit 7838c8
			 */
Packit 7838c8
			if (--tif->tif_nsubifd)
Packit 7838c8
				tif->tif_subifdoff += 8;
Packit 7838c8
			else
Packit 7838c8
				tif->tif_flags &= ~TIFF_INSUBIFD;
Packit 7838c8
			return (1);
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
Packit 7838c8
	if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
	{
Packit 7838c8
		uint32 m;
Packit 7838c8
		uint32 nextdir;
Packit 7838c8
		m = (uint32)(tif->tif_diroff);
Packit 7838c8
		if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong(&m);
Packit 7838c8
		if (tif->tif_header.classic.tiff_diroff == 0) {
Packit 7838c8
			/*
Packit 7838c8
			 * First directory, overwrite offset in header.
Packit 7838c8
			 */
Packit 7838c8
			tif->tif_header.classic.tiff_diroff = (uint32) tif->tif_diroff;
Packit 7838c8
			(void) TIFFSeekFile(tif,4, SEEK_SET);
Packit 7838c8
			if (!WriteOK(tif, &m, 4)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
					     "Error writing TIFF header");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			return (1);
Packit 7838c8
		}
Packit 7838c8
		/*
Packit 7838c8
		 * Not the first directory, search to the last and append.
Packit 7838c8
		 */
Packit 7838c8
		nextdir = tif->tif_header.classic.tiff_diroff;
Packit 7838c8
		while(1) {
Packit 7838c8
			uint16 dircount;
Packit 7838c8
			uint32 nextnextdir;
Packit 7838c8
Packit 7838c8
			if (!SeekOK(tif, nextdir) ||
Packit 7838c8
			    !ReadOK(tif, &dircount, 2)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory count");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
				TIFFSwabShort(&dircount);
Packit 7838c8
			(void) TIFFSeekFile(tif,
Packit 7838c8
			    nextdir+2+dircount*12, SEEK_SET);
Packit 7838c8
			if (!ReadOK(tif, &nextnextdir, 4)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory link");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong(&nextnextdir);
Packit 7838c8
			if (nextnextdir==0)
Packit 7838c8
			{
Packit 7838c8
				(void) TIFFSeekFile(tif,
Packit 7838c8
				    nextdir+2+dircount*12, SEEK_SET);
Packit 7838c8
				if (!WriteOK(tif, &m, 4)) {
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error writing directory link");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				break;
Packit 7838c8
			}
Packit 7838c8
			nextdir=nextnextdir;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	else
Packit 7838c8
	{
Packit 7838c8
		uint64 m;
Packit 7838c8
		uint64 nextdir;
Packit 7838c8
		m = tif->tif_diroff;
Packit 7838c8
		if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
			TIFFSwabLong8(&m);
Packit 7838c8
		if (tif->tif_header.big.tiff_diroff == 0) {
Packit 7838c8
			/*
Packit 7838c8
			 * First directory, overwrite offset in header.
Packit 7838c8
			 */
Packit 7838c8
			tif->tif_header.big.tiff_diroff = tif->tif_diroff;
Packit 7838c8
			(void) TIFFSeekFile(tif,8, SEEK_SET);
Packit 7838c8
			if (!WriteOK(tif, &m, 8)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
Packit 7838c8
					     "Error writing TIFF header");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			return (1);
Packit 7838c8
		}
Packit 7838c8
		/*
Packit 7838c8
		 * Not the first directory, search to the last and append.
Packit 7838c8
		 */
Packit 7838c8
		nextdir = tif->tif_header.big.tiff_diroff;
Packit 7838c8
		while(1) {
Packit 7838c8
			uint64 dircount64;
Packit 7838c8
			uint16 dircount;
Packit 7838c8
			uint64 nextnextdir;
Packit 7838c8
Packit 7838c8
			if (!SeekOK(tif, nextdir) ||
Packit 7838c8
			    !ReadOK(tif, &dircount64, 8)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory count");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong8(&dircount64);
Packit 7838c8
			if (dircount64>0xFFFF)
Packit 7838c8
			{
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Sanity check on tag count failed, likely corrupt TIFF");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			dircount=(uint16)dircount64;
Packit 7838c8
			(void) TIFFSeekFile(tif,
Packit 7838c8
			    nextdir+8+dircount*20, SEEK_SET);
Packit 7838c8
			if (!ReadOK(tif, &nextnextdir, 8)) {
Packit 7838c8
				TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error fetching directory link");
Packit 7838c8
				return (0);
Packit 7838c8
			}
Packit 7838c8
			if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
				TIFFSwabLong8(&nextnextdir);
Packit 7838c8
			if (nextnextdir==0)
Packit 7838c8
			{
Packit 7838c8
				(void) TIFFSeekFile(tif,
Packit 7838c8
				    nextdir+8+dircount*20, SEEK_SET);
Packit 7838c8
				if (!WriteOK(tif, &m, 8)) {
Packit 7838c8
					TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
					     "Error writing directory link");
Packit 7838c8
					return (0);
Packit 7838c8
				}
Packit 7838c8
				break;
Packit 7838c8
			}
Packit 7838c8
			nextdir=nextnextdir;
Packit 7838c8
		}
Packit 7838c8
	}
Packit 7838c8
	return (1);
Packit 7838c8
}
Packit 7838c8
Packit 7838c8
/************************************************************************/
Packit 7838c8
/*                          TIFFRewriteField()                          */
Packit 7838c8
/*                                                                      */
Packit 7838c8
/*      Rewrite a field in the directory on disk without regard to      */
Packit 7838c8
/*      updating the TIFF directory structure in memory.  Currently     */
Packit 7838c8
/*      only supported for field that already exist in the on-disk      */
Packit 7838c8
/*      directory.  Mainly used for updating stripoffset /              */
Packit 7838c8
/*      stripbytecount values after the directory is already on         */
Packit 7838c8
/*      disk.                                                           */
Packit 7838c8
/*                                                                      */
Packit 7838c8
/*      Returns zero on failure, and one on success.                    */
Packit 7838c8
/************************************************************************/
Packit 7838c8
Packit 7838c8
int
Packit 7838c8
_TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype, 
Packit 7838c8
                  tmsize_t count, void* data)
Packit 7838c8
{
Packit 7838c8
    static const char module[] = "TIFFResetField";
Packit 7838c8
    /* const TIFFField* fip = NULL; */
Packit 7838c8
    uint16 dircount;
Packit 7838c8
    tmsize_t dirsize;
Packit 7838c8
    uint8 direntry_raw[20];
Packit 7838c8
    uint16 entry_tag = 0;
Packit 7838c8
    uint16 entry_type = 0;
Packit 7838c8
    uint64 entry_count = 0;
Packit 7838c8
    uint64 entry_offset = 0;
Packit 7838c8
    int    value_in_entry = 0;
Packit 7838c8
    uint64 read_offset;
Packit 7838c8
    uint8 *buf_to_write = NULL;
Packit 7838c8
    TIFFDataType datatype;
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Find field definition.                                          */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    /*fip =*/ TIFFFindField(tif, tag, TIFF_ANY);
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Do some checking this is a straight forward case.               */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if( isMapped(tif) )
Packit 7838c8
    {
Packit 7838c8
        TIFFErrorExt( tif->tif_clientdata, module, 
Packit 7838c8
                      "Memory mapped files not currently supported for this operation." );
Packit 7838c8
        return 0;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    if( tif->tif_diroff == 0 )
Packit 7838c8
    {
Packit 7838c8
        TIFFErrorExt( tif->tif_clientdata, module, 
Packit 7838c8
                      "Attempt to reset field on directory not already on disk." );
Packit 7838c8
        return 0;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Read the directory entry count.                                 */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if (!SeekOK(tif, tif->tif_diroff)) {
Packit 7838c8
        TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                     "%s: Seek error accessing TIFF directory",
Packit 7838c8
                     tif->tif_name);
Packit 7838c8
        return 0;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    read_offset = tif->tif_diroff;
Packit 7838c8
Packit 7838c8
    if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
    {
Packit 7838c8
        if (!ReadOK(tif, &dircount, sizeof (uint16))) {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                         "%s: Can not read TIFF directory count",
Packit 7838c8
                         tif->tif_name);
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
        if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
            TIFFSwabShort(&dircount);
Packit 7838c8
        dirsize = 12;
Packit 7838c8
        read_offset += 2;
Packit 7838c8
    } else {
Packit 7838c8
        uint64 dircount64;
Packit 7838c8
        if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                         "%s: Can not read TIFF directory count",
Packit 7838c8
                         tif->tif_name);
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
        if (tif->tif_flags & TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong8(&dircount64);
Packit 7838c8
        dircount = (uint16)dircount64;
Packit 7838c8
        dirsize = 20;
Packit 7838c8
        read_offset += 8;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Read through directory to find target tag.                      */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    while( dircount > 0 )
Packit 7838c8
    {
Packit 7838c8
        if (!ReadOK(tif, direntry_raw, dirsize)) {
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                         "%s: Can not read TIFF directory entry.",
Packit 7838c8
                         tif->tif_name);
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
        memcpy( &entry_tag, direntry_raw + 0, sizeof(uint16) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabShort( &entry_tag );
Packit 7838c8
Packit 7838c8
        if( entry_tag == tag )
Packit 7838c8
            break;
Packit 7838c8
Packit 7838c8
        read_offset += dirsize;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    if( entry_tag != tag )
Packit 7838c8
    {
Packit 7838c8
        TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                     "%s: Could not find tag %d.",
Packit 7838c8
                     tif->tif_name, tag );
Packit 7838c8
        return 0;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Extract the type, count and offset for this entry.              */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    memcpy( &entry_type, direntry_raw + 2, sizeof(uint16) );
Packit 7838c8
    if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
        TIFFSwabShort( &entry_type );
Packit 7838c8
Packit 7838c8
    if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
    {
Packit 7838c8
        uint32 value;
Packit 7838c8
        
Packit 7838c8
        memcpy( &value, direntry_raw + 4, sizeof(uint32) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong( &value );
Packit 7838c8
        entry_count = value;
Packit 7838c8
Packit 7838c8
        memcpy( &value, direntry_raw + 8, sizeof(uint32) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong( &value );
Packit 7838c8
        entry_offset = value;
Packit 7838c8
    }
Packit 7838c8
    else
Packit 7838c8
    {
Packit 7838c8
        memcpy( &entry_count, direntry_raw + 4, sizeof(uint64) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong8( &entry_count );
Packit 7838c8
Packit 7838c8
        memcpy( &entry_offset, direntry_raw + 12, sizeof(uint64) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong8( &entry_offset );
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      What data type do we want to write this as?                     */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if( TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags&TIFF_BIGTIFF) )
Packit 7838c8
    {
Packit 7838c8
        if( in_datatype == TIFF_LONG8 )
Packit 7838c8
            datatype = TIFF_LONG;
Packit 7838c8
        else if( in_datatype == TIFF_SLONG8 )
Packit 7838c8
            datatype = TIFF_SLONG;
Packit 7838c8
        else if( in_datatype == TIFF_IFD8 )
Packit 7838c8
            datatype = TIFF_IFD;
Packit 7838c8
        else
Packit 7838c8
            datatype = in_datatype;
Packit 7838c8
    }
Packit 7838c8
    else 
Packit 7838c8
        datatype = in_datatype;
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Prepare buffer of actual data to write.  This includes          */
Packit 7838c8
/*      swabbing as needed.                                             */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    buf_to_write =
Packit 7838c8
	    (uint8 *)_TIFFCheckMalloc(tif, count, TIFFDataWidth(datatype),
Packit 7838c8
				      "for field buffer.");
Packit 7838c8
    if (!buf_to_write)
Packit 7838c8
        return 0;
Packit 7838c8
Packit 7838c8
    if( datatype == in_datatype )
Packit 7838c8
        memcpy( buf_to_write, data, count * TIFFDataWidth(datatype) );
Packit 7838c8
    else if( datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8 )
Packit 7838c8
    {
Packit 7838c8
	tmsize_t i;
Packit 7838c8
Packit 7838c8
        for( i = 0; i < count; i++ )
Packit 7838c8
        {
Packit 7838c8
            ((int32 *) buf_to_write)[i] = 
Packit 7838c8
                (int32) ((int64 *) data)[i];
Packit 7838c8
            if( (int64) ((int32 *) buf_to_write)[i] != ((int64 *) data)[i] )
Packit 7838c8
            {
Packit 7838c8
                _TIFFfree( buf_to_write );
Packit 7838c8
                TIFFErrorExt( tif->tif_clientdata, module, 
Packit 7838c8
                              "Value exceeds 32bit range of output type." );
Packit 7838c8
                return 0;
Packit 7838c8
            }
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
    else if( (datatype == TIFF_LONG && in_datatype == TIFF_LONG8)
Packit 7838c8
             || (datatype == TIFF_IFD && in_datatype == TIFF_IFD8) )
Packit 7838c8
    {
Packit 7838c8
	tmsize_t i;
Packit 7838c8
Packit 7838c8
        for( i = 0; i < count; i++ )
Packit 7838c8
        {
Packit 7838c8
            ((uint32 *) buf_to_write)[i] = 
Packit 7838c8
                (uint32) ((uint64 *) data)[i];
Packit 7838c8
            if( (uint64) ((uint32 *) buf_to_write)[i] != ((uint64 *) data)[i] )
Packit 7838c8
            {
Packit 7838c8
                _TIFFfree( buf_to_write );
Packit 7838c8
                TIFFErrorExt( tif->tif_clientdata, module, 
Packit 7838c8
                              "Value exceeds 32bit range of output type." );
Packit 7838c8
                return 0;
Packit 7838c8
            }
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    if( TIFFDataWidth(datatype) > 1 && (tif->tif_flags&TIFF_SWAB) )
Packit 7838c8
    {
Packit 7838c8
        if( TIFFDataWidth(datatype) == 2 )
Packit 7838c8
            TIFFSwabArrayOfShort( (uint16 *) buf_to_write, count );
Packit 7838c8
        else if( TIFFDataWidth(datatype) == 4 )
Packit 7838c8
            TIFFSwabArrayOfLong( (uint32 *) buf_to_write, count );
Packit 7838c8
        else if( TIFFDataWidth(datatype) == 8 )
Packit 7838c8
            TIFFSwabArrayOfLong8( (uint64 *) buf_to_write, count );
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Is this a value that fits into the directory entry?             */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
    {
Packit 7838c8
        if( TIFFDataWidth(datatype) * count <= 4 )
Packit 7838c8
        {
Packit 7838c8
            entry_offset = read_offset + 8;
Packit 7838c8
            value_in_entry = 1;
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
    else
Packit 7838c8
    {
Packit 7838c8
        if( TIFFDataWidth(datatype) * count <= 8 )
Packit 7838c8
        {
Packit 7838c8
            entry_offset = read_offset + 12;
Packit 7838c8
            value_in_entry = 1;
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      If the tag type, and count match, then we just write it out     */
Packit 7838c8
/*      over the old values without altering the directory entry at     */
Packit 7838c8
/*      all.                                                            */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if( entry_count == (uint64)count && entry_type == (uint16) datatype )
Packit 7838c8
    {
Packit 7838c8
        if (!SeekOK(tif, entry_offset)) {
Packit 7838c8
            _TIFFfree( buf_to_write );
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                         "%s: Seek error accessing TIFF directory",
Packit 7838c8
                         tif->tif_name);
Packit 7838c8
            return 0;
Packit 7838c8
        }
Packit 7838c8
        if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
Packit 7838c8
            _TIFFfree( buf_to_write );
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                         "Error writing directory link");
Packit 7838c8
            return (0);
Packit 7838c8
        }
Packit 7838c8
Packit 7838c8
        _TIFFfree( buf_to_write );
Packit 7838c8
        return 1;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Otherwise, we write the new tag data at the end of the file.    */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if( !value_in_entry )
Packit 7838c8
    {
Packit 7838c8
        entry_offset = TIFFSeekFile(tif,0,SEEK_END);
Packit 7838c8
        
Packit 7838c8
        if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
Packit 7838c8
            _TIFFfree( buf_to_write );
Packit 7838c8
            TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                         "Error writing directory link");
Packit 7838c8
            return (0);
Packit 7838c8
        }
Packit 7838c8
    }
Packit 7838c8
    else
Packit 7838c8
    {
Packit 7838c8
        memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype));
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    _TIFFfree( buf_to_write );
Packit 7838c8
    buf_to_write = 0;
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Adjust the directory entry.                                     */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    entry_type = datatype;
Packit 7838c8
    memcpy( direntry_raw + 2, &entry_type, sizeof(uint16) );
Packit 7838c8
    if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
        TIFFSwabShort( (uint16 *) (direntry_raw + 2) );
Packit 7838c8
Packit 7838c8
    if (!(tif->tif_flags&TIFF_BIGTIFF))
Packit 7838c8
    {
Packit 7838c8
        uint32 value;
Packit 7838c8
Packit 7838c8
        value = (uint32) entry_count;
Packit 7838c8
        memcpy( direntry_raw + 4, &value, sizeof(uint32) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong( (uint32 *) (direntry_raw + 4) );
Packit 7838c8
Packit 7838c8
        value = (uint32) entry_offset;
Packit 7838c8
        memcpy( direntry_raw + 8, &value, sizeof(uint32) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong( (uint32 *) (direntry_raw + 8) );
Packit 7838c8
    }
Packit 7838c8
    else
Packit 7838c8
    {
Packit 7838c8
        memcpy( direntry_raw + 4, &entry_count, sizeof(uint64) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong8( (uint64 *) (direntry_raw + 4) );
Packit 7838c8
Packit 7838c8
        memcpy( direntry_raw + 12, &entry_offset, sizeof(uint64) );
Packit 7838c8
        if (tif->tif_flags&TIFF_SWAB)
Packit 7838c8
            TIFFSwabLong8( (uint64 *) (direntry_raw + 12) );
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
/*      Write the directory entry out to disk.                          */
Packit 7838c8
/* -------------------------------------------------------------------- */
Packit 7838c8
    if (!SeekOK(tif, read_offset )) {
Packit 7838c8
        TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                     "%s: Seek error accessing TIFF directory",
Packit 7838c8
                     tif->tif_name);
Packit 7838c8
        return 0;
Packit 7838c8
    }
Packit 7838c8
Packit 7838c8
    if (!WriteOK(tif, direntry_raw,dirsize))
Packit 7838c8
    {
Packit 7838c8
        TIFFErrorExt(tif->tif_clientdata, module,
Packit 7838c8
                     "%s: Can not write TIFF directory entry.",
Packit 7838c8
                     tif->tif_name);
Packit 7838c8
        return 0;
Packit 7838c8
    }
Packit 7838c8
    
Packit 7838c8
    return 1;
Packit 7838c8
}
Packit 7838c8
/* vim: set ts=8 sts=8 sw=8 noet: */
Packit 7838c8
/*
Packit 7838c8
 * Local Variables:
Packit 7838c8
 * mode: c
Packit 7838c8
 * c-basic-offset: 8
Packit 7838c8
 * fill-column: 78
Packit 7838c8
 * End:
Packit 7838c8
 */