readSvsMetadata function
Reads basic metadata of the primary image from the SVS file.
svs is the open SvsFile.
Returns an SvsMetadata instance, or null on failure.
Implementation
Future<SvsMetadata?> readSvsMetadata(SvsFile svs) async {
return await svs.synchronized(() async {
final raf = svs.raf;
final endian = svs.endian;
final isBigTiff = svs.isBigTiff;
int ifdOffset = svs.firstIfdOffset;
Map<String, String> properties = {};
int width = 0;
int height = 0;
int? tileWidth;
int? tileHeight;
if (ifdOffset != 0) {
final header = await _readIfdHeader(raf, ifdOffset, endian, isBigTiff);
if (header == null) return null;
for (var i = 0; i < header.numEntries; i++) {
final entry = await _readIfdEntry(raf, endian, isBigTiff);
if (entry == null) break;
if (entry.tag == 256) {
width = _readTiffValue(entry.dataType, entry.count, entry.valueOffset, entry.entryBd, entry.offsetInEntry, endian);
} else if (entry.tag == 257) {
height = _readTiffValue(entry.dataType, entry.count, entry.valueOffset, entry.entryBd, entry.offsetInEntry, endian);
} else if (entry.tag == 322) {
tileWidth = _readTiffValue(entry.dataType, entry.count, entry.valueOffset, entry.entryBd, entry.offsetInEntry, endian);
} else if (entry.tag == 323) {
tileHeight = _readTiffValue(entry.dataType, entry.count, entry.valueOffset, entry.entryBd, entry.offsetInEntry, endian);
} else if (entry.tag == 270) {
final description = await _readTiffString(raf, entry.count, entry.valueOffset, inlineMaxBytes: entry.inlineMaxBytes, entryBd: entry.entryBd, offsetInEntry: entry.offsetInEntry);
if (description != null) {
properties = _parseAperioDescription(description);
}
}
}
}
return SvsMetadata(
properties: properties,
width: width,
height: height,
tileWidth: tileWidth,
tileHeight: tileHeight,
compression: properties['Compression'],
displayColor: parseDisplayColor(properties['DisplayColor']),
);
});
}