readSvsMetadata function

Future<SvsMetadata?> readSvsMetadata(
  1. SvsFile svs
)

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 {
  if (svs is HamamatsuFile) return svs.metadata();
  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']),
    );
  });
}