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