Another fix for the fetching SBYTE arrays by the TIFFFetchByteArray()

function. Should finally resolve
http://bugzilla.remotesensing.org/show_bug.cgi?id=52
This commit is contained in:
Andrey Kiselev 2002-10-02 08:46:54 +00:00
parent b7acbf192d
commit ff993722c9
2 changed files with 38 additions and 23 deletions

View File

@ -1,3 +1,10 @@
2002-10-02 Andrey Kiselev <dron@remotesensing.org>
* libtiff/tif_dirread.c: Another fix for the fetching SBYTE arrays
by the TIFFFetchByteArray() function. Should finally resolve
http://bugzilla.remotesensing.org/show_bug.cgi?id=52
2002-09-15 Andrey Kiselev <dron@remotesensing.org> 2002-09-15 Andrey Kiselev <dron@remotesensing.org>
* Makefile.in, /man/{raw2tiff.1, Makefile.in, libtiff.3}: Added * Makefile.in, /man/{raw2tiff.1, Makefile.in, libtiff.3}: Added

View File

@ -1,4 +1,4 @@
/* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dirread.c,v 1.12 2002-09-08 18:01:20 warmerda Exp $ */ /* $Header: /cvs/maptools/cvsroot/libtiff/libtiff/tif_dirread.c,v 1.13 2002-10-02 08:46:54 dron Exp $ */
/* /*
* Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1988-1997 Sam Leffler
@ -780,28 +780,36 @@ TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
* Extract data from offset field. * Extract data from offset field.
*/ */
if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
switch (dir->tdir_count) { if (dir->tdir_type == TIFF_SBYTE)
case 4: v[3] = (uint16)(dir->tdir_offset & 0xff); switch (dir->tdir_count) {
case 3: v[2] = (uint16)((dir->tdir_offset >> 8) & 0xff); case 4: v[3] = (signed char)(dir->tdir_offset & 0xff);
case 2: v[1] = (uint16)((dir->tdir_offset >> 16) & 0xff); case 3: v[2] = (signed char)((dir->tdir_offset >> 8) & 0xff);
case 1: case 2: v[1] = (signed char)((dir->tdir_offset >> 16) & 0xff);
if (dir->tdir_type == TIFF_SBYTE) case 1: v[0] = (signed char)(dir->tdir_offset >> 24);
v[0] = (signed char)(dir->tdir_offset >> 24); }
else else
v[0] = (uint16)(dir->tdir_offset >> 24); switch (dir->tdir_count) {
} case 4: v[3] = (uint16)(dir->tdir_offset & 0xff);
} else { case 3: v[2] = (uint16)((dir->tdir_offset >> 8) & 0xff);
switch (dir->tdir_count) { case 2: v[1] = (uint16)((dir->tdir_offset >> 16) & 0xff);
case 4: v[3] = (uint16)(dir->tdir_offset >> 24); case 1: v[0] = (uint16)(dir->tdir_offset >> 24);
case 3: v[2] = (uint16)((dir->tdir_offset >> 16) & 0xff); }
case 2: v[1] = (uint16)((dir->tdir_offset >> 8) & 0xff); } else {
case 1: if (dir->tdir_type == TIFF_SBYTE)
if (dir->tdir_type == TIFF_SBYTE) switch (dir->tdir_count) {
v[0] = (signed char)((dir->tdir_offset) & 0xff); case 4: v[3] = (signed char)(dir->tdir_offset >> 24);
else case 3: v[2] = (signed char)((dir->tdir_offset >> 16) & 0xff);
v[0] = (uint16)(dir->tdir_offset & 0xff); case 2: v[1] = (signed char)((dir->tdir_offset >> 8) & 0xff);
} case 1: v[0] = (signed char)(dir->tdir_offset & 0xff);
} }
else
switch (dir->tdir_count) {
case 4: v[3] = (uint16)(dir->tdir_offset >> 24);
case 3: v[2] = (uint16)((dir->tdir_offset >> 16) & 0xff);
case 2: v[1] = (uint16)((dir->tdir_offset >> 8) & 0xff);
case 1: v[0] = (uint16)(dir->tdir_offset & 0xff);
}
}
return (1); return (1);
} else } else
return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */ return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */