private int fetchData(TiffDirEntry dir, byte[] buffer)
{
int width = DataWidth(dir.tdir_type);
int count = (int)dir.tdir_count * width;
// Check for overflow.
if (dir.tdir_count == 0 || width == 0 || (count / width) != dir.tdir_count)
fetchFailed(dir);
if (!seekOK(dir.tdir_offset))
fetchFailed(dir);
if (!readOK(buffer, count))
fetchFailed(dir);
if ((m_flags & TiffFlags.SWAB) == TiffFlags.SWAB)
{
switch (dir.tdir_type)
{
case TiffType.SHORT:
case TiffType.SSHORT:
short[] s = ByteArrayToShorts(buffer, 0, count);
SwabArrayOfShort(s, dir.tdir_count);
ShortsToByteArray(s, 0, dir.tdir_count, buffer, 0);
break;
case TiffType.LONG:
case TiffType.SLONG:
case TiffType.FLOAT:
case TiffType.IFD:
int[] l = ByteArrayToInts(buffer, 0, count);
SwabArrayOfLong(l, dir.tdir_count);
IntsToByteArray(l, 0, dir.tdir_count, buffer, 0);
break;
case TiffType.RATIONAL:
case TiffType.SRATIONAL:
int[] r = ByteArrayToInts(buffer, 0, count);
SwabArrayOfLong(r, 2 * dir.tdir_count);
IntsToByteArray(r, 0, 2 * dir.tdir_count, buffer, 0);
break;
case TiffType.DOUBLE:
swab64BitData(buffer, 0, count);
break;
}
}
return count;
}