extractSvsTile function
Future<Uint8List?>
extractSvsTile(
- SvsFile svs,
- int layerIndex,
- int tileX,
- int tileY, {
- CancellationToken? cancelToken,
Extracts the raw bytes of a specific tile from a resolution layer in the SVS file.
svs is the open SvsFile.
layerIndex is the resolution layer index (0 is the highest resolution / baseline level).
tileX and tileY are the 0-based horizontal and vertical tile coordinates (not pixel coordinates).
cancelToken optional cancellation token to abort the operation.
Returns the raw tile bytes, or null if the tile coordinates or layer are invalid or cancelled.
Implementation
Future<Uint8List?> extractSvsTile(
SvsFile svs,
int layerIndex,
int tileX,
int tileY, {
CancellationToken? cancelToken,
}) async {
if (cancelToken?.isCancelled == true) {
return null;
}
final collected = await _getOrCollectTiledLevels(svs);
if (cancelToken?.isCancelled == true) {
return null;
}
final levels = collected.levels;
if (layerIndex < 0 || layerIndex >= levels.length) {
return null;
}
final targetLevel = levels[layerIndex];
final fullData = await _getOrLoadLevelFullData(svs, targetLevel, collected.globalJpegTables, collected.globalDisplayColor);
if (fullData == null || cancelToken?.isCancelled == true) {
return null;
}
if (tileX < 0 || tileX >= targetLevel.tilesAcross || tileY < 0 || tileY >= targetLevel.tilesDown) {
return null;
}
final tileIndex = tileY * targetLevel.tilesAcross + tileX;
if (tileIndex >= fullData.tileOffsets.length) {
return null;
}
final offset = fullData.tileOffsets[tileIndex];
final byteCount = tileIndex < fullData.tileByteCounts.length ? fullData.tileByteCounts[tileIndex] : 0;
if (byteCount == 0 || offset == 0) {
return Uint8List(0);
}
if (cancelToken?.isCancelled == true) {
return null;
}
final bytes = await svs.readBytesAt(offset, byteCount, cancelToken: cancelToken);
if (cancelToken?.isCancelled == true) {
return null;
}
return bytes;
}