geotrellis.raster.io.geotiff.Int32GeoTiffTile.scala Maven / Gradle / Ivy
package geotrellis.raster.io.geotiff
import geotrellis.raster._
import geotrellis.raster.io.geotiff.compression._
import spire.syntax.cfor._
class Int32GeoTiffTile(
val compressedBytes: Array[Array[Byte]],
val decompressor: Decompressor,
segmentLayout: GeoTiffSegmentLayout,
compression: Compression,
val cellType: IntCells with NoDataHandling
) extends GeoTiffTile(segmentLayout, compression) with Int32GeoTiffSegmentCollection {
val noDataValue: Option[Int] = cellType match {
case IntCellType => None
case IntConstantNoDataCellType => Some(Int.MinValue)
case IntUserDefinedNoDataCellType(nd) => Some(nd)
}
def mutable: MutableArrayTile = {
val arr = Array.ofDim[Byte](cols * rows * IntConstantNoDataCellType.bytes)
if(segmentLayout.isStriped) {
var i = 0
cfor(0)(_ < segmentCount, _ + 1) { segmentIndex =>
val segment =
getSegment(segmentIndex)
val size = segment.bytes.size
System.arraycopy(segment.bytes, 0, arr, i, size)
i += size
}
} else {
cfor(0)(_ < segmentCount, _ + 1) { segmentIndex =>
val segment =
getSegment(segmentIndex)
val segmentTransform = segmentLayout.getSegmentTransform(segmentIndex)
val width = segmentTransform.segmentCols * IntConstantNoDataCellType.bytes
val tileWidth = segmentLayout.tileLayout.tileCols * IntConstantNoDataCellType.bytes
cfor(0)(_ < tileWidth * segmentTransform.segmentRows, _ + tileWidth) { i =>
val col = segmentTransform.indexToCol(i / IntConstantNoDataCellType.bytes)
val row = segmentTransform.indexToRow(i / IntConstantNoDataCellType.bytes)
val j = ((row * cols) + col) * IntConstantNoDataCellType.bytes
System.arraycopy(segment.bytes, i, arr, j, width)
}
}
}
IntArrayTile.fromBytes(arr, cols, rows, cellType)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy