diff options
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.java | 152 |
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; + } +} |