// Utilities
/**
* Returns the number of image directories (subimages) stored in a
* given TIFF file, represented by a <code>SeekableStream</code>.
*/
public static int GetNumDirectories(RandomAccessFileOrArray stream)
{
long pointer = stream.FilePointer; // Save stream pointer
stream.Seek(0L);
int endian = stream.ReadUnsignedShort();
if (!IsValidEndianTag(endian)) {
throw new ArgumentException(MessageLocalization.GetComposedMessage("bad.endianness.tag.not.0x4949.or.0x4d4d"));
}
bool isBigEndian = (endian == 0x4d4d);
int magic = ReadUnsignedShort(stream, isBigEndian);
if (magic != 42) {
throw new ArgumentException(MessageLocalization.GetComposedMessage("bad.magic.number.should.be.42"));
}
stream.Seek(4L);
long offset = ReadUnsignedInt(stream, isBigEndian);
int numDirectories = 0;
while (offset != 0L) {
++numDirectories;
// EOFException means IFD was probably not properly terminated.
try {
stream.Seek(offset);
int entries = ReadUnsignedShort(stream, isBigEndian);
stream.Skip(12*entries);
offset = ReadUnsignedInt(stream, isBigEndian);
} catch (EndOfStreamException) {
numDirectories--;
break;
}
}
stream.Seek(pointer); // Reset stream pointer
return numDirectories;
}