diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/im_attrib.cpp | 10 | ||||
| -rw-r--r-- | src/im_format_tiff.cpp | 55 | ||||
| -rw-r--r-- | src/libtiff/tif_config.h | 28 | ||||
| -rw-r--r-- | src/libtiff/tiffiop.h | 6 | 
4 files changed, 56 insertions, 43 deletions
| diff --git a/src/im_attrib.cpp b/src/im_attrib.cpp index 90c007e..10d4599 100644 --- a/src/im_attrib.cpp +++ b/src/im_attrib.cpp @@ -2,7 +2,7 @@   * \brief Attributes Table   *   * See Copyright Notice in im_lib.h - * $Id: im_attrib.cpp,v 1.2 2009/08/19 18:39:43 scuri Exp $ + * $Id: im_attrib.cpp,v 1.3 2009/08/22 04:31:04 scuri Exp $   */  #include <stdlib.h> @@ -62,12 +62,15 @@ static char* utlStrDup(const char* str)  imAttribNode::imAttribNode(const char* name, int _data_type, int _count, const void* _data, imAttribNode* _next)  { +  if (_data_type == 0 && _count == -1)  /* BYTE meaning a string */ +    _count = strlen((char*)_data)+1; +    this->name = utlStrDup(name);    this->data_type = _data_type;    this->count = _count;    this->next = _next; -  int size = count * imDataTypeSize(_data_type); +  int size = _count * imDataTypeSize(_data_type);    this->data = malloc(size);    if (_data) memcpy(this->data, _data, size);    else memset(this->data, 0, size); @@ -152,9 +155,6 @@ void imAttribTableSet(imAttribTablePrivate* ptable, const char* name, int data_t    int index = iHashIndex(name, ptable->hash_size);    imAttribNode* first_node = ptable->hash_table[index]; -  if (data_type == 0 && count == -1)  /* BYTE */ -    count = strlen((char*)data)+1; -    // The name already exists ?    imAttribNode* cur_node = first_node;    imAttribNode* prev_node = NULL; diff --git a/src/im_format_tiff.cpp b/src/im_format_tiff.cpp index 66fbe57..5b072fc 100644 --- a/src/im_format_tiff.cpp +++ b/src/im_format_tiff.cpp @@ -3,7 +3,7 @@   *   * See Copyright Notice in im_lib.h   * See libTIFF Copyright Notice in tiff.h - * $Id: im_format_tiff.cpp,v 1.3 2009/08/19 18:39:43 scuri Exp $ + * $Id: im_format_tiff.cpp,v 1.4 2009/08/22 04:31:04 scuri Exp $   */  #include "im_format.h" @@ -34,9 +34,6 @@  static const TIFFFieldInfo iTiffFieldInfo[] =   { -  /* missing in libTIFF (fixed in libtiff 4.0) */ -  { EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, FIELD_CUSTOM, TRUE,	FALSE, "ColorSpace" }, -    /* Patch from Dave Coffin (Used for DNG) */    { TIFFTAG_WHITELEVEL,	-2, -1,	TIFF_LONG,	FIELD_CUSTOM,  0,	1,	"WhiteLevel" },    { TIFFTAG_WHITELEVEL,	-2, -1,	TIFF_SHORT,	FIELD_CUSTOM,  0,	1,	"WhiteLevel" }, @@ -301,12 +298,16 @@ static void iTIFFReadCustomTags(TIFF* tiff, imAttribTable* attrib_table)      if (fld == NULL)        continue; -    if (fld->field_tag == TIFFTAG_EXIFIFD ||         /* offset */ +    /* offsets */ +    if (fld->field_tag == TIFFTAG_EXIFIFD ||                   fld->field_tag == TIFFTAG_GPSIFD ||                    fld->field_tag == TIFFTAG_INTEROPERABILITYIFD ||     	      fld->field_tag == TIFFTAG_SUBIFD ||           -	      fld->field_tag == TIFFTAG_COLORMAP ||        /* handled elsewhere */ -	      fld->field_tag == TIFFTAG_EXTRASAMPLES || +	      fld->field_tag == TIFFTAG_COLORMAP) +      continue; +         +    /* handled elsewhere */ +	  if (fld->field_tag == TIFFTAG_EXTRASAMPLES ||  	      fld->field_tag == TIFFTAG_TRANSFERFUNCTION ||  	      fld->field_tag == TIFFTAG_RESOLUTIONUNIT ||  	      fld->field_tag == TIFFTAG_XRESOLUTION || @@ -449,7 +450,47 @@ static void iTIFFReadCustomTags(TIFF* tiff, imAttribTable* attrib_table)                delete [] float_data;              }              else +            { +              char* newstr = NULL; + +              if (fld->field_type == TIFF_ASCII && ((char*)data)[data_count-1] != 0) +              { +                int i = data_count-1; +                char* p = (char*)data; +                while (i > 0 && p[i] != 0) +                  i--; +                if (i == 0) +                { +                  if (fld->field_tag == TIFFTAG_DATETIME || +			                fld->field_tag == EXIFTAG_DATETIMEORIGINAL || +                      fld->field_tag == EXIFTAG_DATETIMEDIGITIZED) +                  { +                    /* sometimes theses tags get non standard strings, +                       libTIIF does not returns the actual number os bytes read, +                       it returns the standard value of 20. +                       so we will try to find the actual string size, but we risk in a memory invalid access. */ +                    i = data_count; +                    while (i < data_count+6 && p[i] != 0) +                      i++; +                    if (i < data_count+6) +                      data_count = i+1; +                  } +                  else +                  { +                    newstr = (char*)malloc(data_count+1); +                    memcpy(newstr, data, data_count); +                    newstr[data_count] = 0; +                    data_count++; +                  } +                } +                else +                  data_count = i; +              } +                attrib_table->Set(fld->field_name, data_type, data_count, data); + +              if (newstr) free(newstr); +            }            }          }        } diff --git a/src/libtiff/tif_config.h b/src/libtiff/tif_config.h index 3558fe7..f9db461 100644 --- a/src/libtiff/tif_config.h +++ b/src/libtiff/tif_config.h @@ -253,34 +253,6 @@  #define inline  #endif -#ifdef _MSC_VER -#if _MSC_VER>1400 -/* Signed 64-bit type formatter */ -#define TIFF_INT64_FORMAT "%I64d" - -/* Signed 64-bit type */ -#define TIFF_INT64_T signed __int64 - -/* Unsigned 64-bit type formatter */ -#define TIFF_UINT64_FORMAT "%I64u" - -/* Unsigned 64-bit type */ -#define TIFF_UINT64_T unsigned __int64 -//#else -///* Signed 64-bit type formatter */ -//#define TIFF_INT64_FORMAT "%I64d" -// -///* Signed 64-bit type */ -//#define TIFF_INT64_T signed __int64 -// -///* Unsigned 64-bit type formatter */ -//#define TIFF_UINT64_FORMAT "%I64u" -// -///* Unsigned 64-bit type */ -//#define TIFF_UINT64_T unsigned __int64 -#endif -#endif -  /* Define to `long' if <sys/types.h> does not define. */  /* #undef off_t */ diff --git a/src/libtiff/tiffiop.h b/src/libtiff/tiffiop.h index dcf9a63..3360b7a 100644 --- a/src/libtiff/tiffiop.h +++ b/src/libtiff/tiffiop.h @@ -1,4 +1,4 @@ -/* $Id: tiffiop.h,v 1.2 2009/08/21 04:01:59 scuri Exp $ */ +/* $Id: tiffiop.h,v 1.3 2009/08/22 04:31:04 scuri Exp $ */  /*   * Copyright (c) 1988-1997 Sam Leffler @@ -61,8 +61,8 @@ extern void *lfind(const void *, const void *, size_t *, size_t,    Libtiff itself does not require a 64-bit type, but bundled TIFF    utilities may use it.  */ -typedef TIFF_INT64_T  int64; -typedef TIFF_UINT64_T uint64; +/* typedef TIFF_INT64_T  int64;  IMLIB */ +/* typedef TIFF_UINT64_T uint64; IMLIB */  #include "tiffio.h"  #include "tif_dir.h" | 
