|
|
@ -40,7 +40,7 @@ internal class DirectoryReader |
|
|
public IList<ExifProfile> Read() |
|
|
public IList<ExifProfile> Read() |
|
|
{ |
|
|
{ |
|
|
this.ByteOrder = ReadByteOrder(this.stream); |
|
|
this.ByteOrder = ReadByteOrder(this.stream); |
|
|
var headerReader = new HeaderReader(this.stream, this.ByteOrder); |
|
|
HeaderReader headerReader = new(this.stream, this.ByteOrder); |
|
|
headerReader.ReadFileHeader(); |
|
|
headerReader.ReadFileHeader(); |
|
|
|
|
|
|
|
|
this.nextIfdOffset = headerReader.FirstIfdOffset; |
|
|
this.nextIfdOffset = headerReader.FirstIfdOffset; |
|
|
@ -52,7 +52,12 @@ internal class DirectoryReader |
|
|
private static ByteOrder ReadByteOrder(Stream stream) |
|
|
private static ByteOrder ReadByteOrder(Stream stream) |
|
|
{ |
|
|
{ |
|
|
Span<byte> headerBytes = stackalloc byte[2]; |
|
|
Span<byte> headerBytes = stackalloc byte[2]; |
|
|
stream.Read(headerBytes); |
|
|
|
|
|
|
|
|
if (stream.Read(headerBytes) != 2) |
|
|
|
|
|
{ |
|
|
|
|
|
throw TiffThrowHelper.ThrowInvalidHeader(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (headerBytes[0] == TiffConstants.ByteOrderLittleEndian && headerBytes[1] == TiffConstants.ByteOrderLittleEndian) |
|
|
if (headerBytes[0] == TiffConstants.ByteOrderLittleEndian && headerBytes[1] == TiffConstants.ByteOrderLittleEndian) |
|
|
{ |
|
|
{ |
|
|
return ByteOrder.LittleEndian; |
|
|
return ByteOrder.LittleEndian; |
|
|
@ -68,10 +73,10 @@ internal class DirectoryReader |
|
|
|
|
|
|
|
|
private IList<ExifProfile> ReadIfds(bool isBigTiff) |
|
|
private IList<ExifProfile> ReadIfds(bool isBigTiff) |
|
|
{ |
|
|
{ |
|
|
var readers = new List<EntryReader>(); |
|
|
List<EntryReader> readers = new(); |
|
|
while (this.nextIfdOffset != 0 && this.nextIfdOffset < (ulong)this.stream.Length) |
|
|
while (this.nextIfdOffset != 0 && this.nextIfdOffset < (ulong)this.stream.Length) |
|
|
{ |
|
|
{ |
|
|
var reader = new EntryReader(this.stream, this.ByteOrder, this.allocator); |
|
|
EntryReader reader = new(this.stream, this.ByteOrder, this.allocator); |
|
|
reader.ReadTags(isBigTiff, this.nextIfdOffset); |
|
|
reader.ReadTags(isBigTiff, this.nextIfdOffset); |
|
|
|
|
|
|
|
|
if (reader.BigValues.Count > 0) |
|
|
if (reader.BigValues.Count > 0) |
|
|
@ -85,6 +90,11 @@ internal class DirectoryReader |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (this.nextIfdOffset >= reader.NextIfdOffset && reader.NextIfdOffset != 0) |
|
|
|
|
|
{ |
|
|
|
|
|
TiffThrowHelper.ThrowImageFormatException("TIFF image contains circular directory offsets"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
this.nextIfdOffset = reader.NextIfdOffset; |
|
|
this.nextIfdOffset = reader.NextIfdOffset; |
|
|
readers.Add(reader); |
|
|
readers.Add(reader); |
|
|
|
|
|
|
|
|
@ -94,11 +104,11 @@ internal class DirectoryReader |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var list = new List<ExifProfile>(readers.Count); |
|
|
List<ExifProfile> list = new(readers.Count); |
|
|
foreach (EntryReader reader in readers) |
|
|
foreach (EntryReader reader in readers) |
|
|
{ |
|
|
{ |
|
|
reader.ReadBigValues(); |
|
|
reader.ReadBigValues(); |
|
|
var profile = new ExifProfile(reader.Values, reader.InvalidTags); |
|
|
ExifProfile profile = new(reader.Values, reader.InvalidTags); |
|
|
list.Add(profile); |
|
|
list.Add(profile); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|