/* * 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; } }