From 53b233093ee027c612006f5e0e77990667949c58 Mon Sep 17 00:00:00 2001
From: Vojtech Moravec <vojtech.moravec.st@vsb.cz>
Date: Tue, 18 Aug 2020 07:24:07 +0200
Subject: [PATCH] Set parsed RAW dims and improve logging.

We weren't setting the parsed dimensions of the RAW file. Also when
input file doesn't exist, report the path of the file.

Added isConsoleApplication() helper, which returns true, when the app is
run from console.
---
 .../azgracompress/cli/ParsedCliOptions.java   | 12 ++++-
 .../compression/CompressionOptions.java       |  2 +
 .../compression/VQImageCompressor.java        | 11 +++--
 .../compression/VQImageDecompressor.java      | 44 +++++++++++--------
 4 files changed, 46 insertions(+), 23 deletions(-)

diff --git a/src/main/java/azgracompress/cli/ParsedCliOptions.java b/src/main/java/azgracompress/cli/ParsedCliOptions.java
index d20f44a..db87c5a 100644
--- a/src/main/java/azgracompress/cli/ParsedCliOptions.java
+++ b/src/main/java/azgracompress/cli/ParsedCliOptions.java
@@ -189,7 +189,7 @@ public class ParsedCliOptions extends CompressionOptions implements Cloneable {
         // Check if input file exists.
         if (!new File(fileInputData.getFilePath()).exists()) {
             parseErrorOccurred = true;
-            errorBuilder.append("Input file doesn't exist.\n");
+            errorBuilder.append("Input file doesn't exist. Provided path: '").append(fileInputData.getFilePath()).append("'\n");
             return;
         }
 
@@ -273,13 +273,16 @@ public class ParsedCliOptions extends CompressionOptions implements Cloneable {
         getInputDataInfo().setDataLoaderType(InputData.DataLoaderType.RawDataLoader);
         final Optional<V3i> parsedImageDims = ParseUtils.tryParseV3i(inputFileArguments[1], 'x');
 
-        if (!parsedImageDims.isPresent()) {
+        if (parsedImageDims.isPresent()) {
+            getInputDataInfo().setDimension(parsedImageDims.get());
+        } else {
             parseErrorOccurred = true;
             errorBuilder.append("Failed to parse image dimensions of format DxDxD. Got: ")
                     .append(inputFileArguments[1])
                     .append('\n');
             return;
         }
+
         // User specified plane index or plane range.
         if (inputFileArguments.length > 2) {
             parseInputFilePlaneOptions(errorBuilder, inputFileArguments, 2);
@@ -531,4 +534,9 @@ public class ParsedCliOptions extends CompressionOptions implements Cloneable {
     public Object clone() throws CloneNotSupportedException {
         return super.clone();
     }
+
+    @Override
+    public boolean isConsoleApplication() {
+        return true;
+    }
 }
diff --git a/src/main/java/azgracompress/compression/CompressionOptions.java b/src/main/java/azgracompress/compression/CompressionOptions.java
index 0d7040d..66d805a 100644
--- a/src/main/java/azgracompress/compression/CompressionOptions.java
+++ b/src/main/java/azgracompress/compression/CompressionOptions.java
@@ -139,4 +139,6 @@ public class CompressionOptions {
     public void setCodebookType(CodebookType codebookType) {
         this.codebookType = codebookType;
     }
+
+    public boolean isConsoleApplication() {return false;}
 }
diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java
index 777236c..cbbd702 100644
--- a/src/main/java/azgracompress/compression/VQImageCompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageCompressor.java
@@ -272,9 +272,14 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm
             final int[] indices = quantizer.quantizeIntoIndices(voxelData, options.getWorkerCount());
             voxelLayersSizes[voxelLayerIndex] = writeHuffmanEncodedIndices(compressStream, huffman, indices);
             stopwatch.stop();
-            reportProgressToListeners(voxelLayerIndex, voxelLayerCount,
-                                      "%d/%d Finished voxel layer %s compression pass in %s",
-                                      voxelLayerIndex, voxelLayerCount, voxelLayerRange.toString(), stopwatch.getElapsedTimeString());
+            if (options.isConsoleApplication()) {
+                reportStatusToListeners("%d/%d Finished voxel layer %s compression pass in %s",
+                                        voxelLayerIndex, voxelLayerCount, voxelLayerRange.toString(), stopwatch.getElapsedTimeString());
+            } else {
+                reportProgressToListeners(voxelLayerIndex, voxelLayerCount,
+                                          "%d/%d Finished voxel layer %s compression pass in %s",
+                                          voxelLayerIndex, voxelLayerCount, voxelLayerRange.toString(), stopwatch.getElapsedTimeString());
+            }
         }
 
         return voxelLayersSizes;
diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java
index 220b91b..ec0d379 100644
--- a/src/main/java/azgracompress/compression/VQImageDecompressor.java
+++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java
@@ -136,8 +136,8 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
 
             final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex];
             try (InBitStream inBitStream = new InBitStream(compressedStream,
-                    header.getBitsPerCodebookIndex(),
-                    planeDataSize)) {
+                                                           header.getBitsPerCodebookIndex(),
+                                                           planeDataSize)) {
                 inBitStream.readToBuffer();
                 inBitStream.setAllowReadFromUnderlyingStream(false);
 
@@ -145,13 +145,13 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
                 for (int vecIndex = 0; vecIndex < planeVectorCount; vecIndex++) {
                     final int huffmanSymbol = decodeHuffmanSymbol(huffman, inBitStream);
                     System.arraycopy(codebook.getVectors()[huffmanSymbol].getVector(),
-                            0, decompressedVectors[vecIndex], 0, vectorSize);
+                                     0, decompressedVectors[vecIndex], 0, vectorSize);
                 }
 
 
                 final ImageU16 decompressedPlane = reconstructImageFromQuantizedVectors(decompressedVectors,
-                        qVector,
-                        header.getImageDims());
+                                                                                        qVector,
+                                                                                        header.getImageDims());
                 decompressedPlaneData =
                         TypeConverter.unsignedShortArrayToByteArray(decompressedPlane.getData(), false);
             } catch (Exception ex) {
@@ -167,7 +167,7 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
 
             stopwatch.stop();
             reportProgressToListeners(planeIndex, planeCountForDecompression,
-                    "Decompressed plane %d in %s", planeIndex, stopwatch.getElapsedTimeString());
+                                      "Decompressed plane %d in %s", planeIndex, stopwatch.getElapsedTimeString());
         }
     }
 
@@ -207,8 +207,8 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
 
             final int planeDataSize = (int) header.getPlaneDataSizes()[planeIndex];
             try (InBitStream inBitStream = new InBitStream(compressedStream,
-                    header.getBitsPerCodebookIndex(),
-                    planeDataSize)) {
+                                                           header.getBitsPerCodebookIndex(),
+                                                           planeDataSize)) {
                 inBitStream.readToBuffer();
                 inBitStream.setAllowReadFromUnderlyingStream(false);
 
@@ -221,20 +221,22 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
                         currentHuffmanNode = currentHuffmanNode.traverse(bit);
                     }
                     System.arraycopy(codebook.getVectors()[currentHuffmanNode.getSymbol()].getVector(),
-                            0, decompressedVectors[vecIndex], 0, vectorSize);
+                                     0, decompressedVectors[vecIndex], 0, vectorSize);
                 }
 
 
                 final ImageU16 decompressedPlane = reconstructImageFromQuantizedVectors(decompressedVectors,
-                        qVector,
-                        header.getImageDims());
+                                                                                        qVector,
+                                                                                        header.getImageDims());
 
                 buffer[planeIndex] = TypeConverter.intArrayToShortArray(decompressedPlane.getData());
             } catch (Exception ex) {
-                throw new ImageDecompressionException("VQImageDecompressor::decompressToBuffer() - Unable to read indices from InBitStream.", ex);
+                throw new ImageDecompressionException("VQImageDecompressor::decompressToBuffer() - Unable to read indices from " +
+                                                              "InBitStream.",
+                                                      ex);
             }
             reportProgressToListeners(planeIndex, planeCountForDecompression,
-                    "Decompressed plane %d.", planeIndex);
+                                      "Decompressed plane %d.", planeIndex);
         }
     }
 
@@ -283,13 +285,14 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
                 for (int voxelIndex = 0; voxelIndex < voxelLayerVoxelCount; voxelIndex++) {
                     final int huffmanSymbol = decodeHuffmanSymbol(huffman, inBitStream);
                     System.arraycopy(codebook.getVectors()[huffmanSymbol].getVector(),
-                            0, decompressedVoxels[voxelIndex], 0, vectorSize);
+                                     0, decompressedVoxels[voxelIndex], 0, vectorSize);
                 }
 
                 final Voxel currentVoxel = new Voxel(currentVoxelLayerDims);
                 currentVoxelLayer = currentVoxel.reconstructFromVoxelsToDataset(voxelDims, decompressedVoxels);
             } catch (Exception e) {
-                throw new ImageDecompressionException("VQImageDecompressor::decompressVoxels() - Unable to read indices from InBitStream.", e);
+                throw new ImageDecompressionException("VQImageDecompressor::decompressVoxels() - Unable to read indices from InBitStream.",
+                                                      e);
             }
 
             for (int layer = 0; layer < currentVoxelLayerDims.getZ(); layer++) {
@@ -301,9 +304,14 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I
             }
 
             stopwatch.stop();
-            reportProgressToListeners(voxelLayerIndex, voxelLayerCount,
-                    "Decompressed voxel layer %d/%d in %s",
-                    voxelLayerIndex, voxelLayerCount, stopwatch.getElapsedTimeString());
+            if (options.isConsoleApplication()) {
+                reportStatusToListeners("Decompressed voxel layer %d/%d in %s",
+                                        voxelLayerIndex, voxelLayerCount, stopwatch.getElapsedTimeString());
+            } else {
+                reportProgressToListeners(voxelLayerIndex, voxelLayerCount,
+                                          "Decompressed voxel layer %d/%d in %s",
+                                          voxelLayerIndex, voxelLayerCount, stopwatch.getElapsedTimeString());
+            }
         }
     }
 
-- 
GitLab