Added special function to handle SubjectDistance EXIF tag as per bug

http://bugzilla.remotesensing.org/show_bug.cgi?id=1362
This commit is contained in:
Andrey Kiselev 2007-02-24 17:09:31 +00:00
parent c4f2e5b44e
commit 6c7bf882d0

View File

@ -1,4 +1,4 @@
/* $Id: tif_dirread.c,v 1.90 2007-02-22 11:33:44 dron Exp $ */ /* $Id: tif_dirread.c,v 1.91 2007-02-24 17:09:31 dron Exp $ */
/* /*
* Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1988-1997 Sam Leffler
@ -58,6 +58,7 @@ static int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*);
static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*); static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*);
static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**); static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**);
static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*); static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*);
static int TIFFFetchSubjectDistance(TIFF*, TIFFDirEntry*);
static float TIFFFetchFloat(TIFF*, TIFFDirEntry*); static float TIFFFetchFloat(TIFF*, TIFFDirEntry*);
static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*); static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*);
static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*);
@ -509,7 +510,7 @@ TIFFReadDirectory(TIFF* tif)
} }
} }
/* /*
* Joris: OJPEG hack: * OJPEG hack:
* - If a) compression is OJPEG, and b) photometric tag is missing, * - If a) compression is OJPEG, and b) photometric tag is missing,
* then we consistently find that photometric should be YCbCr * then we consistently find that photometric should be YCbCr
* - If a) compression is OJPEG, and b) photometric tag says it's RGB, * - If a) compression is OJPEG, and b) photometric tag says it's RGB,
@ -580,7 +581,7 @@ TIFFReadDirectory(TIFF* tif)
goto bad; goto bad;
} }
/* /*
* Joris: OJPEG hack: * OJPEG hack:
* We do no further messing with strip/tile offsets/bytecounts in OJPEG * We do no further messing with strip/tile offsets/bytecounts in OJPEG
* TIFFs * TIFFs
*/ */
@ -860,7 +861,17 @@ TIFFReadCustomDirectory(TIFF* tif, toff_t diroff,
goto ignore; goto ignore;
} }
(void) TIFFFetchNormalTag(tif, dp); /*
* EXIF tags which need to be specifically processed.
*/
switch (dp->tdir_tag) {
case EXIFTAG_SUBJECTDISTANCE:
(void) TIFFFetchSubjectDistance(tif, dp);
break;
default:
(void) TIFFFetchNormalTag(tif, dp);
break;
}
} }
if (dir) if (dir)
@ -1226,9 +1237,8 @@ cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv)
} }
/* /*
* Fetch a rational item from the file * Fetch a rational item from the file at offset off and return the value as a
* at offset off and return the value * floating point number.
* as a floating point number.
*/ */
static float static float
TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir) TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir)
@ -1241,9 +1251,8 @@ TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir)
} }
/* /*
* Fetch a single floating point value * Fetch a single floating point value from the offset field and return it as
* from the offset field and return it * a native float.
* as a native float.
*/ */
static float static float
TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir) TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir)
@ -1887,6 +1896,30 @@ TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir)
return (ok); return (ok);
} }
/*
* Fetch and set the SubjectDistance EXIF tag.
*/
static int
TIFFFetchSubjectDistance(TIFF* tif, TIFFDirEntry* dir)
{
uint32 l[2];
float v;
int ok = 0;
if (TIFFFetchData(tif, dir, (char *)l)
&& cvtRational(tif, dir, l[0], l[1], &v)) {
/*
* XXX: Numerator 0xFFFFFFFF means that we have infinite
* distance. Indicate that with a negative floating point
* SubjectDistance value.
*/
ok = TIFFSetField(tif, dir->tdir_tag,
(l[0] != 0xFFFFFFFF) ? v : -v);
}
return ok;
}
/* /*
* Replace a single strip (tile) of uncompressed data by multiple strips * Replace a single strip (tile) of uncompressed data by multiple strips
* (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for * (tiles), each approximately STRIP_SIZE_DEFAULT bytes. This is useful for