From c891f3ebd47d3cc6598088dc4636e640aba68f2d Mon Sep 17 00:00:00 2001
From: Vojtech Moravec <vojtech.moravec.st@vsb.cz>
Date: Tue, 13 Oct 2020 14:25:32 +0200
Subject: [PATCH] Generalize BasicLoader::valueAt()

---
 .../cz/it4i/qcmp/io/loader/BasicLoader.java   | 35 +++++++++++--------
 .../it4i/qcmp/io/loader/FlatBufferLoader.java |  6 ++--
 .../qcmp/io/loader/ImageJBufferLoader.java    |  8 ++---
 .../cz/it4i/qcmp/io/loader/RawDataLoader.java |  7 ++++
 .../cz/it4i/qcmp/io/loader/SCIFIOLoader.java  |  7 ++++
 5 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/src/main/java/cz/it4i/qcmp/io/loader/BasicLoader.java b/src/main/java/cz/it4i/qcmp/io/loader/BasicLoader.java
index 1ef3ccd..60d9698 100644
--- a/src/main/java/cz/it4i/qcmp/io/loader/BasicLoader.java
+++ b/src/main/java/cz/it4i/qcmp/io/loader/BasicLoader.java
@@ -37,18 +37,20 @@ public abstract class BasicLoader {
      */
     public abstract int[] loadPlaneData(final int plane) throws IOException;
 
-    /**
-     * Read value from plane at specified offset.
-     *
-     * @param plane  Zero based plane index.
-     * @param offset Offset on flattened plane data.
-     * @return Plane value at the index.
-     */
-    protected int valueAt(final int plane, final int offset) {
-        new Exception().printStackTrace(System.err);
-        assert (false) : "Unimplemented overload of BasicLoader::valueAt()";
-        return Integer.MIN_VALUE;
-    }
+    //    /**
+    //     * Read value from plane at specified offset.
+    //     *
+    //     * @param plane  Zero based plane index.
+    //     * @param offset Offset on flattened plane data.
+    //     * @return Plane value at the index.
+    //     */
+    //    protected int valueAt(final int plane, final int offset) {
+    //        new Exception().printStackTrace(System.err);
+    //        assert (false) : "Unimplemented overload of BasicLoader::valueAt()";
+    //        return Integer.MIN_VALUE;
+    //    }
+
+    protected abstract int valueAt(final int plane, final int x, final int y, final int width);
 
     /**
      * Wrap column (x) index based on specified wrapping strategy.
@@ -149,7 +151,9 @@ public abstract class BasicLoader {
                                 break;
                             srcX = wrapColumnIndex(srcX);
                         }
-                        rowVectors[vectorIndex][vectorX] = valueAt(plane, Block.index(srcX, row, dims.getY()));
+
+                        // TODO(Moravec): dims.getY() should probably be dims.getX()! Check this!
+                        rowVectors[vectorIndex][vectorX] = valueAt(plane, srcX, row, dims.getY());
                     }
                     ++vectorIndex;
                 }
@@ -217,7 +221,8 @@ public abstract class BasicLoader {
                     }
                     srcX = wrapColumnIndex(srcX);
                 }
-                block[Block.index(x, y, blockDim.getX())] = valueAt(planeIndex, Block.index(srcX, srcY, dims.getX()));
+
+                block[Block.index(x, y, blockDim.getX())] = valueAt(planeIndex, srcX, srcY, dims.getX());
             }
         }
     }
@@ -284,7 +289,7 @@ public abstract class BasicLoader {
                         srcX = wrapColumnIndex(srcX);
                     }
 
-                    voxel[Voxel.dataIndex(x, y, z, voxelDim)] = valueAt(srcZ, Block.index(srcX, srcY, dims.getX()));
+                    voxel[Voxel.dataIndex(x, y, z, voxelDim)] = valueAt(srcZ, srcX, srcY, dims.getX());
                 }
             }
         }
diff --git a/src/main/java/cz/it4i/qcmp/io/loader/FlatBufferLoader.java b/src/main/java/cz/it4i/qcmp/io/loader/FlatBufferLoader.java
index 023c76d..a5b60bb 100644
--- a/src/main/java/cz/it4i/qcmp/io/loader/FlatBufferLoader.java
+++ b/src/main/java/cz/it4i/qcmp/io/loader/FlatBufferLoader.java
@@ -1,5 +1,6 @@
 package cz.it4i.qcmp.io.loader;
 
+import cz.it4i.qcmp.data.Block;
 import cz.it4i.qcmp.data.Range;
 import cz.it4i.qcmp.data.V2i;
 import cz.it4i.qcmp.data.V3i;
@@ -44,9 +45,10 @@ public class FlatBufferLoader extends BasicLoader implements IPlaneLoader {
         }
     }
 
+
     @Override
-    protected int valueAt(final int plane, final int offset) {
-        return TypeConverter.shortToInt(((short[]) bufferInputData.getPixelBuffer())[(plane * planePixelCount) + offset]);
+    protected int valueAt(final int plane, final int x, final int y, final int width) {
+        return TypeConverter.shortToInt(((short[]) bufferInputData.getPixelBuffer())[(plane * planePixelCount) + Block.index(x, y, width)]);
     }
 
     @Override
diff --git a/src/main/java/cz/it4i/qcmp/io/loader/ImageJBufferLoader.java b/src/main/java/cz/it4i/qcmp/io/loader/ImageJBufferLoader.java
index 259964b..a0b8e7e 100644
--- a/src/main/java/cz/it4i/qcmp/io/loader/ImageJBufferLoader.java
+++ b/src/main/java/cz/it4i/qcmp/io/loader/ImageJBufferLoader.java
@@ -1,5 +1,6 @@
 package cz.it4i.qcmp.io.loader;
 
+import cz.it4i.qcmp.data.Block;
 import cz.it4i.qcmp.data.Range;
 import cz.it4i.qcmp.data.V2i;
 import cz.it4i.qcmp.data.V3i;
@@ -36,11 +37,10 @@ public final class ImageJBufferLoader extends BasicLoader implements IPlaneLoade
         final short[] srcBuffer = (short[]) bufferInputData.getPixelBuffer(plane);
         return TypeConverter.shortArrayToIntArray(srcBuffer);
     }
-
-
+    
     @Override
-    protected int valueAt(final int plane, final int offset) {
-        return TypeConverter.shortToInt(((short[]) bufferInputData.getPixelBuffer(plane))[offset]);
+    protected int valueAt(int plane, int x, int y, int width) {
+        return TypeConverter.shortToInt(((short[]) bufferInputData.getPixelBuffer(plane))[Block.index(x, y, width)]);
     }
 
     @Override
diff --git a/src/main/java/cz/it4i/qcmp/io/loader/RawDataLoader.java b/src/main/java/cz/it4i/qcmp/io/loader/RawDataLoader.java
index b699e3a..c226a72 100644
--- a/src/main/java/cz/it4i/qcmp/io/loader/RawDataLoader.java
+++ b/src/main/java/cz/it4i/qcmp/io/loader/RawDataLoader.java
@@ -20,6 +20,13 @@ public final class RawDataLoader extends BasicLoader implements IPlaneLoader {
         this.inputDataInfo = inputDataInfo;
     }
 
+    @Override
+    protected int valueAt(final int plane, final int x, final int y, final int width) {
+        new Exception().printStackTrace(System.err);
+        assert (false) : "RawDataLoader shouldn't use valueAt impl methods!";
+        return -1;
+    }
+
     @Override
     public int[] loadPlaneData(final int plane) throws IOException {
         final byte[] buffer;
diff --git a/src/main/java/cz/it4i/qcmp/io/loader/SCIFIOLoader.java b/src/main/java/cz/it4i/qcmp/io/loader/SCIFIOLoader.java
index aaf7e86..a253532 100644
--- a/src/main/java/cz/it4i/qcmp/io/loader/SCIFIOLoader.java
+++ b/src/main/java/cz/it4i/qcmp/io/loader/SCIFIOLoader.java
@@ -29,6 +29,13 @@ public final class SCIFIOLoader extends BasicLoader implements IPlaneLoader {
         this.reader = ScifioWrapper.getReader(this.inputDataInfo.getFilePath());
     }
 
+    @Override
+    protected int valueAt(final int plane, final int x, final int y, final int width) {
+        new Exception().printStackTrace(System.err);
+        assert (false) : "SCIFIOLoader shouldn't use valueAt impl methods!";
+        return -1;
+    }
+
     @Override
     public int[] loadPlaneData(final int plane) throws IOException {
         final byte[] planeBytes;
-- 
GitLab