summaryrefslogtreecommitdiff
path: root/tiff/tools/tiffset.c
diff options
context:
space:
mode:
Diffstat (limited to 'tiff/tools/tiffset.c')
-rw-r--r--tiff/tools/tiffset.c325
1 files changed, 325 insertions, 0 deletions
diff --git a/tiff/tools/tiffset.c b/tiff/tools/tiffset.c
new file mode 100644
index 0000000..eb68924
--- /dev/null
+++ b/tiff/tools/tiffset.c
@@ -0,0 +1,325 @@
+/******************************************************************************
+ * $Id: tiffset.c,v 1.12.2.1 2010-06-08 18:50:44 bfriesen Exp $
+ *
+ * Project: libtiff tools
+ * Purpose: Mainline for setting metadata in existing TIFF files.
+ * Author: Frank Warmerdam, warmerdam@pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2000, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: tiffset.c,v $
+ * Revision 1.12.2.1 2010-06-08 18:50:44 bfriesen
+ * * Add an emacs formatting mode footer to all source files so that
+ * emacs can be effectively used.
+ *
+ * Revision 1.12 2007/02/24 17:14:14 dron
+ * Properly handle tags with TIFF_VARIABLE writecount. As per bug
+ * http://bugzilla.remotesensing.org/show_bug.cgi?id=1350
+ *
+ * Revision 1.11 2005/09/13 14:13:42 dron
+ * Avoid warnings.
+ *
+ * Revision 1.10 2005/02/24 14:47:11 fwarmerdam
+ * Updated header.
+ *
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "tiffio.h"
+
+static char* usageMsg[] = {
+"usage: tiffset [options] filename",
+"where options are:",
+" -s <tagname> [count] <value>... set the tag value",
+" -sf <tagname> <filename> read the tag value from file (for ASCII tags only)",
+NULL
+};
+
+static void
+usage(void)
+{
+ int i;
+ for (i = 0; usageMsg[i]; i++)
+ fprintf(stderr, "%s\n", usageMsg[i]);
+ exit(-1);
+}
+
+static const TIFFFieldInfo *
+GetField(TIFF *tiff, const char *tagname)
+{
+ const TIFFFieldInfo *fip;
+
+ if( atoi(tagname) > 0 )
+ fip = TIFFFieldWithTag(tiff, (ttag_t)atoi(tagname));
+ else
+ fip = TIFFFieldWithName(tiff, tagname);
+
+ if (!fip) {
+ fprintf( stderr, "Field name %s not recognised.\n", tagname );
+ return (TIFFFieldInfo *)NULL;
+ }
+
+ return fip;
+}
+
+int
+main(int argc, char* argv[])
+{
+ TIFF *tiff;
+ int arg_index;
+
+ if (argc < 2)
+ usage();
+
+ tiff = TIFFOpen(argv[argc-1], "r+");
+ if (tiff == NULL)
+ return 2;
+
+ for( arg_index = 1; arg_index < argc-1; arg_index++ ) {
+ if (strcmp(argv[arg_index],"-s") == 0 && arg_index < argc-3) {
+ const TIFFFieldInfo *fip;
+ const char *tagname;
+
+ arg_index++;
+ tagname = argv[arg_index];
+ fip = GetField(tiff, tagname);
+
+ if (!fip)
+ return 3;
+
+ arg_index++;
+ if (fip->field_type == TIFF_ASCII) {
+ if (TIFFSetField(tiff, fip->field_tag, argv[arg_index]) != 1)
+ fprintf( stderr, "Failed to set %s=%s\n",
+ fip->field_name, argv[arg_index] );
+ } else if (fip->field_writecount > 0
+ || fip->field_writecount == TIFF_VARIABLE) {
+ int ret = 1;
+ short wc;
+
+ if (fip->field_writecount == TIFF_VARIABLE)
+ wc = atoi(argv[arg_index++]);
+ else
+ wc = fip->field_writecount;
+
+ if (argc - arg_index < wc) {
+ fprintf( stderr,
+ "Number of tag values is not enough. "
+ "Expected %d values for %s tag, got %d\n",
+ wc, fip->field_name, argc - arg_index);
+ return 4;
+ }
+
+ if (wc > 1) {
+ int i, size;
+ void *array;
+
+ switch (fip->field_type) {
+ /*
+ * XXX: We can't use TIFFDataWidth()
+ * to determine the space needed to store
+ * the value. For TIFF_RATIONAL values
+ * TIFFDataWidth() returns 8, but we use 4-byte
+ * float to represent rationals.
+ */
+ case TIFF_BYTE:
+ case TIFF_ASCII:
+ case TIFF_SBYTE:
+ case TIFF_UNDEFINED:
+ default:
+ size = 1;
+ break;
+
+ case TIFF_SHORT:
+ case TIFF_SSHORT:
+ size = 2;
+ break;
+
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_FLOAT:
+ case TIFF_IFD:
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ size = 4;
+ break;
+
+ case TIFF_DOUBLE:
+ size = 8;
+ break;
+ }
+
+ array = _TIFFmalloc(wc * size);
+ if (!array) {
+ fprintf(stderr, "No space for %s tag\n",
+ tagname);
+ return 4;
+ }
+
+ switch (fip->field_type) {
+ case TIFF_BYTE:
+ for (i = 0; i < wc; i++)
+ ((uint8 *)array)[i] = atoi(argv[arg_index+i]);
+ break;
+ case TIFF_SHORT:
+ for (i = 0; i < wc; i++)
+ ((uint16 *)array)[i] = atoi(argv[arg_index+i]);
+ break;
+ case TIFF_SBYTE:
+ for (i = 0; i < wc; i++)
+ ((int8 *)array)[i] = atoi(argv[arg_index+i]);
+ break;
+ case TIFF_SSHORT:
+ for (i = 0; i < wc; i++)
+ ((int16 *)array)[i] = atoi(argv[arg_index+i]);
+ break;
+ case TIFF_LONG:
+ for (i = 0; i < wc; i++)
+ ((uint32 *)array)[i] = atol(argv[arg_index+i]);
+ break;
+ case TIFF_SLONG:
+ case TIFF_IFD:
+ for (i = 0; i < wc; i++)
+ ((uint32 *)array)[i] = atol(argv[arg_index+i]);
+ break;
+ case TIFF_DOUBLE:
+ for (i = 0; i < wc; i++)
+ ((double *)array)[i] = atof(argv[arg_index+i]);
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ for (i = 0; i < wc; i++)
+ ((float *)array)[i] = (float)atof(argv[arg_index+i]);
+ break;
+ default:
+ break;
+ }
+
+ if (fip->field_passcount) {
+ ret = TIFFSetField(tiff, fip->field_tag,
+ wc, array);
+ } else {
+ ret = TIFFSetField(tiff, fip->field_tag,
+ array);
+ }
+
+ _TIFFfree(array);
+ } else {
+ switch (fip->field_type) {
+ case TIFF_BYTE:
+ case TIFF_SHORT:
+ case TIFF_SBYTE:
+ case TIFF_SSHORT:
+ ret = TIFFSetField(tiff, fip->field_tag,
+ atoi(argv[arg_index++]));
+ break;
+ case TIFF_LONG:
+ case TIFF_SLONG:
+ case TIFF_IFD:
+ ret = TIFFSetField(tiff, fip->field_tag,
+ atol(argv[arg_index++]));
+ break;
+ case TIFF_DOUBLE:
+ ret = TIFFSetField(tiff, fip->field_tag,
+ atof(argv[arg_index++]));
+ break;
+ case TIFF_RATIONAL:
+ case TIFF_SRATIONAL:
+ case TIFF_FLOAT:
+ ret = TIFFSetField(tiff, fip->field_tag,
+ (float)atof(argv[arg_index++]));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (ret != 1)
+ fprintf(stderr, "Failed to set %s\n", fip->field_name);
+ arg_index += wc;
+ }
+ } else if (strcmp(argv[arg_index],"-sf") == 0 && arg_index < argc-3) {
+ FILE *fp;
+ const TIFFFieldInfo *fip;
+ char *text;
+ int len;
+
+ arg_index++;
+ fip = GetField(tiff, argv[arg_index]);
+
+ if (!fip)
+ return 3;
+
+ if (fip->field_type != TIFF_ASCII) {
+ fprintf( stderr,
+ "Only ASCII tags can be set from file. "
+ "%s is not ASCII tag.\n", fip->field_name );
+ return 5;
+ }
+
+ arg_index++;
+ fp = fopen( argv[arg_index], "rt" );
+ if(fp == NULL) {
+ perror( argv[arg_index] );
+ continue;
+ }
+
+ text = (char *) malloc(1000000);
+ len = fread( text, 1, 999999, fp );
+ text[len] = '\0';
+
+ fclose( fp );
+
+ if(TIFFSetField( tiff, fip->field_tag, text ) != 1) {
+ fprintf(stderr, "Failed to set %s from file %s\n",
+ fip->field_name, argv[arg_index]);
+ }
+
+ _TIFFfree( text );
+ arg_index++;
+ } else {
+ fprintf(stderr, "Unrecognised option: %s\n",
+ argv[arg_index]);
+ usage();
+ }
+ }
+
+ TIFFRewriteDirectory(tiff);
+ TIFFClose(tiff);
+ return 0;
+}
+
+/* vim: set ts=8 sts=8 sw=8 noet: */
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 8
+ * fill-column: 78
+ * End:
+ */