summaryrefslogtreecommitdiff
path: root/java/tests/VrDemo/src/com/example/android/rs/vr/loaders/LoaderRaw.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/tests/VrDemo/src/com/example/android/rs/vr/loaders/LoaderRaw.java')
-rw-r--r--java/tests/VrDemo/src/com/example/android/rs/vr/loaders/LoaderRaw.java152
1 files changed, 152 insertions, 0 deletions
diff --git a/java/tests/VrDemo/src/com/example/android/rs/vr/loaders/LoaderRaw.java b/java/tests/VrDemo/src/com/example/android/rs/vr/loaders/LoaderRaw.java
new file mode 100644
index 00000000..c58d0ec3
--- /dev/null
+++ b/java/tests/VrDemo/src/com/example/android/rs/vr/loaders/LoaderRaw.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.rs.vr.loaders;
+
+import android.renderscript.Allocation;
+import android.renderscript.RenderScript;
+import android.renderscript.Type;
+import android.util.Log;
+
+import com.example.android.rs.vr.engine.ScriptC_bricked;
+import com.example.android.rs.vr.engine.Volume;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Properties;
+import java.util.Vector;
+
+/**
+ * Created by hoford on 2/2/15.
+ */
+public class LoaderRaw {
+ private static final String LOGTAG = "RawLoader";
+
+ /**
+ * This builds the volume based on a collection of raw image files
+ * @param rs The Renderscript context
+ * @param dir The directory containing the raw images
+ * @param prop property object containing information about the files
+ * @param listener To provide feedback
+ * @return The created volume
+ */
+ public static Volume buildRSVolume(final RenderScript rs, File dir, Properties prop,
+ final VolumeLoader.ProgressListener listener) {
+ String[] dim = prop.getProperty("dim").split("x");
+ Volume v = new Volume();
+ v.mDimx = Integer.parseInt(dim[0]);
+ v.mDimy = Integer.parseInt(dim[1]);
+ v.mDimz = Integer.parseInt(dim[2]);
+ String[] voxeldim = prop.getProperty("voxeldim").split(",");
+ v.mVoxelDim[0] = Float.parseFloat(voxeldim[0]);
+ v.mVoxelDim[1] = Float.parseFloat(voxeldim[1]);
+ v.mVoxelDim[2] = Float.parseFloat(voxeldim[2]);
+ Float min = Math.min(v.mVoxelDim[0], Math.min(v.mVoxelDim[1], v.mVoxelDim[2]));
+ v.mVoxelDim[0] /= min;
+ v.mVoxelDim[1] /= min;
+ v.mVoxelDim[2] /= min;
+ listener.progress(0, v.mDimz);
+ if (v.mDimz < 20) {
+ return null;
+ }
+ Log.v(LOGTAG, "Loading " + dir.getPath());
+ File[] f = dir.listFiles();
+ Log.v(LOGTAG, "dir contains " + f.length + " files");
+ Arrays.sort(f, new Comparator<File>() {
+
+ @Override
+ public int compare(File o1, File o2) {
+
+ return Integer.decode(o1.getName()).compareTo(Integer.decode(o2.getName()));
+ }
+ });
+
+ int count = 0;
+
+
+ final Vector<File> toRun = new Vector<File>();
+ final HashMap<File, Integer> fileMap = new HashMap<File, Integer>();
+ for (int i = 0; i < f.length; i++) {
+ if (f[i].isDirectory()) {
+ continue;
+ }
+
+ toRun.add(f[i]);
+ fileMap.put(f[i], count);
+ count++;
+ }
+
+ v.mDimz = count;
+ if (listener != null) {
+ listener.progress(0, v.mDimz);
+ }
+
+ v.mVolumeAllocation = null;
+ Allocation alloc_slice = null;
+ ScriptC_bricked scriptC_bricked = new ScriptC_bricked(rs);
+ FileInputStream inputStream;
+ String pixel_spacing = null;
+ String slice1_pos = null;
+ String slice2_pos = null;
+ boolean slice_spacing_set = false;
+ int z = 0;
+ for (File file : toRun) {
+ try {
+ inputStream = new FileInputStream(file);
+ MappedByteBuffer mbb = inputStream.getChannel().map(FileChannel.MapMode.READ_ONLY,
+ 0, v.mDimy * v.mDimx * 2);
+ short[] slice = new short[v.mDimy * v.mDimx];
+ mbb.asShortBuffer().get(slice);
+ inputStream.close();
+ mbb = null;
+ if (v.mVolumeAllocation == null) {
+ Log.v(LOGTAG, "make Volume " + z);
+ Type.Builder b = new Type.Builder(rs, android.renderscript.Element.I16(rs));
+ b.setX(v.mDimx).setY(v.mDimy);
+ alloc_slice = Allocation.createTyped(rs, b.create(), Allocation.USAGE_SCRIPT);
+ b.setZ(v.mDimz);
+ v.mVolumeAllocation = Allocation.createTyped(rs,
+ b.create(), Allocation.USAGE_SCRIPT);
+ scriptC_bricked.set_volume(v.mVolumeAllocation);
+
+ }
+ Log.v(LOGTAG, "LOAD SLICE " + z);
+ int size = v.mDimy * v.mDimx;
+ alloc_slice.copyFromUnchecked(slice);
+ scriptC_bricked.set_z(z);
+ scriptC_bricked.forEach_copy(alloc_slice);
+ z++;
+ if (listener != null) {
+ listener.progress(z, v.mDimz);
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ rs.finish();
+ alloc_slice.destroy();
+ Log.v(LOGTAG,"LOADING DONE ....");
+
+ scriptC_bricked.destroy();
+ return v;
+ }
+}