diff --git a/src/main/java/azgracompress/compression/CompressionOptions.java b/src/main/java/azgracompress/compression/CompressionOptions.java index 4b00e570c35cf58bb14679f51249ef177e8c95ea..407cb6ef931e5e5e80bdc91e3467b4a5203f6a7f 100644 --- a/src/main/java/azgracompress/compression/CompressionOptions.java +++ b/src/main/java/azgracompress/compression/CompressionOptions.java @@ -63,7 +63,7 @@ public class CompressionOptions { private boolean verbose = false; public CompressionOptions() { - int cores = Runtime.getRuntime().availableProcessors(); + final int cores = Runtime.getRuntime().availableProcessors(); this.workerCount = (cores / 2); } diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java index 9a2e086e788ee116340e3579e9d826bcd152b35c..323b82cc0c963a019108677969f103b00059dd4e 100644 --- a/src/main/java/azgracompress/compression/VQImageDecompressor.java +++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java @@ -412,19 +412,23 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I @Override public short[] decompressStreamMode(final DataInputStream compressedStream, final QCMPFileHeader header) throws ImageDecompressionException { - final short[] buffer = new short[(int) header.getImageDims().multiplyTogether()]; if (header.getQuantizationType() == QuantizationType.Vector3D) { final V3i voxelDim = new V3i(header.getVectorSizeX(), header.getVectorSizeY(), header.getVectorSizeZ()); decompressVoxelsStreamModeImpl(compressedStream, header, (voxel, voxelData, planeOffset) -> { - final ImageU16Dataset currentVoxelLayer = voxel.reconstructFromVoxelsToDataset(voxelDim, voxelData); - int offset = planeOffset * (voxelDim.getX() * voxelDim.getY()); - for (int layer = 0; layer < voxel.getDims().getZ(); layer++) { - final short[] voxelLayerData = currentVoxelLayer.getPlaneData(layer); - System.arraycopy(voxelLayerData, 0, buffer, offset, voxelLayerData.length); - offset += voxelLayerData.length; + final ImageU16Dataset decompressedVoxel = voxel.reconstructFromVoxelsToDataset(voxelDim, voxelData); + assert (decompressedVoxel.getPlaneCount() == voxel.getDims().getZ()); + final int expectedVoxelPlaneSize = header.getImageSizeX() * header.getImageSizeY(); + + final int baseOffset = planeOffset * expectedVoxelPlaneSize; + + for (int voxelLayerIndex = 0; voxelLayerIndex < decompressedVoxel.getPlaneCount(); voxelLayerIndex++) { + final short[] voxelLayerData = decompressedVoxel.getPlaneData(voxelLayerIndex); + assert (voxelLayerData.length == expectedVoxelPlaneSize); + final int bufferPos = baseOffset + (voxelLayerIndex * expectedVoxelPlaneSize); + System.arraycopy(voxelLayerData, 0, buffer, bufferPos, voxelLayerData.length); } }); return buffer;