15b539461dcc159bd89297443780d635ccc5e3564John Hoford/*
25b539461dcc159bd89297443780d635ccc5e3564John Hoford * Copyright (C) 2015 The Android Open Source Project
35b539461dcc159bd89297443780d635ccc5e3564John Hoford *
45b539461dcc159bd89297443780d635ccc5e3564John Hoford * Licensed under the Apache License, Version 2.0 (the "License");
55b539461dcc159bd89297443780d635ccc5e3564John Hoford * you may not use this file except in compliance with the License.
65b539461dcc159bd89297443780d635ccc5e3564John Hoford * You may obtain a copy of the License at
75b539461dcc159bd89297443780d635ccc5e3564John Hoford *
85b539461dcc159bd89297443780d635ccc5e3564John Hoford *      http://www.apache.org/licenses/LICENSE-2.0
95b539461dcc159bd89297443780d635ccc5e3564John Hoford *
105b539461dcc159bd89297443780d635ccc5e3564John Hoford * Unless required by applicable law or agreed to in writing, software
115b539461dcc159bd89297443780d635ccc5e3564John Hoford * distributed under the License is distributed on an "AS IS" BASIS,
125b539461dcc159bd89297443780d635ccc5e3564John Hoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b539461dcc159bd89297443780d635ccc5e3564John Hoford * See the License for the specific language governing permissions and
145b539461dcc159bd89297443780d635ccc5e3564John Hoford * limitations under the License.
155b539461dcc159bd89297443780d635ccc5e3564John Hoford */
165b539461dcc159bd89297443780d635ccc5e3564John Hoford
175b539461dcc159bd89297443780d635ccc5e3564John Hofordpackage com.example.android.rs.vr.loaders;
185b539461dcc159bd89297443780d635ccc5e3564John Hoford
195b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.RenderScript;
205b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.util.Log;
215b539461dcc159bd89297443780d635ccc5e3564John Hoford
225b539461dcc159bd89297443780d635ccc5e3564John Hofordimport com.example.android.rs.vr.engine.Volume;
235b539461dcc159bd89297443780d635ccc5e3564John Hoford
245b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.io.File;
255b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.io.FileReader;
265b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.io.FilenameFilter;
275b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Arrays;
285b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.HashMap;
295b539461dcc159bd89297443780d635ccc5e3564John Hofordimport java.util.Properties;
305b539461dcc159bd89297443780d635ccc5e3564John Hoford
315b539461dcc159bd89297443780d635ccc5e3564John Hofordpublic class VolumeLoader {
325b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static final String LOGTAG = "VolumeLoader";
335b539461dcc159bd89297443780d635ccc5e3564John Hoford    HashMap<String, Properties> map = new HashMap<String, Properties>();
345b539461dcc159bd89297443780d635ccc5e3564John Hoford    File baseDir;
355b539461dcc159bd89297443780d635ccc5e3564John Hoford    ProgressListener mListener;
365b539461dcc159bd89297443780d635ccc5e3564John Hoford
375b539461dcc159bd89297443780d635ccc5e3564John Hoford    public VolumeLoader(String dir) {
385b539461dcc159bd89297443780d635ccc5e3564John Hoford        map.put(Mandelbulb.NAME,null);
395ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        map.put(Droid.NAME,null);
405b539461dcc159bd89297443780d635ccc5e3564John Hoford        baseDir = new File(dir);
415b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (!baseDir.exists()) {
425b539461dcc159bd89297443780d635ccc5e3564John Hoford            Log.e(LOGTAG, "Directory: \""+dir+"\" does not exist ");
435b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
445b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
455b539461dcc159bd89297443780d635ccc5e3564John Hoford        Properties[] prop = getPropertyFiles(baseDir);
465b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < prop.length; i++) {
475b539461dcc159bd89297443780d635ccc5e3564John Hoford            map.put(prop[i].getProperty("name"), prop[i]);
485b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
495b539461dcc159bd89297443780d635ccc5e3564John Hoford
505b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
515b539461dcc159bd89297443780d635ccc5e3564John Hoford
525b539461dcc159bd89297443780d635ccc5e3564John Hoford    public String[] getNames() {
535b539461dcc159bd89297443780d635ccc5e3564John Hoford       String [] ret = map.keySet().toArray(new String[map.size()]);
545b539461dcc159bd89297443780d635ccc5e3564John Hoford        Arrays.sort(ret);
555b539461dcc159bd89297443780d635ccc5e3564John Hoford        return ret;
565b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
575b539461dcc159bd89297443780d635ccc5e3564John Hoford
585b539461dcc159bd89297443780d635ccc5e3564John Hoford    public Volume getVolume(RenderScript rs, String name) {
595b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (name.equals(Mandelbulb.NAME)) {
605b539461dcc159bd89297443780d635ccc5e3564John Hoford            return  Mandelbulb.buildRSVolume(rs,mListener);
615b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
625ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        if (name.equals(Droid.NAME)) {
635ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford            return  Droid.buildRSVolume(rs,mListener);
645ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        }
655b539461dcc159bd89297443780d635ccc5e3564John Hoford        Properties p = map.get(name);
665b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (p == null) {
675b539461dcc159bd89297443780d635ccc5e3564John Hoford            Log.v(LOGTAG,"Could not find "+name);
685b539461dcc159bd89297443780d635ccc5e3564John Hoford            return null;
695b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
705b539461dcc159bd89297443780d635ccc5e3564John Hoford        String dir = p.getProperty("dir");
715b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG,"dir ="+dir);
725b539461dcc159bd89297443780d635ccc5e3564John Hoford
735b539461dcc159bd89297443780d635ccc5e3564John Hoford        if ("dicom".equalsIgnoreCase(p.getProperty("format"))) {
745b539461dcc159bd89297443780d635ccc5e3564John Hoford            Log.v(LOGTAG,"processing dicom");
755b539461dcc159bd89297443780d635ccc5e3564John Hoford            Volume v = LoaderDicom.buildRSVolume(rs, new File(baseDir, dir), mListener);
765b539461dcc159bd89297443780d635ccc5e3564John Hoford            String [] looks = p.getProperty("looks").split(",");
775b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int j = 0; j < looks.length; j++) {
785b539461dcc159bd89297443780d635ccc5e3564John Hoford                String look_color = p.getProperty(looks[j]+".color");
795b539461dcc159bd89297443780d635ccc5e3564John Hoford                String look_opacity = p.getProperty(looks[j]+".opacity");
805b539461dcc159bd89297443780d635ccc5e3564John Hoford                v.addLook(looks[j],look_color,look_opacity);
815b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
825b539461dcc159bd89297443780d635ccc5e3564John Hoford            return v;
835b539461dcc159bd89297443780d635ccc5e3564John Hoford        } else if ("raw".equalsIgnoreCase(p.getProperty("format"))) {
845b539461dcc159bd89297443780d635ccc5e3564John Hoford            Log.v(LOGTAG,"processing dicom");
855b539461dcc159bd89297443780d635ccc5e3564John Hoford            Volume v = LoaderRaw.buildRSVolume(rs, new File(baseDir, dir), p, mListener);
865b539461dcc159bd89297443780d635ccc5e3564John Hoford            String [] looks = p.getProperty("looks").split(",");
875b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int j = 0; j < looks.length; j++) {
885b539461dcc159bd89297443780d635ccc5e3564John Hoford                String look_color = p.getProperty(looks[j]+".color");
895b539461dcc159bd89297443780d635ccc5e3564John Hoford                String look_opacity = p.getProperty(looks[j]+".opacity");
905b539461dcc159bd89297443780d635ccc5e3564John Hoford                v.addLook(looks[j],look_color,look_opacity);
915b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
925b539461dcc159bd89297443780d635ccc5e3564John Hoford            return v;
935b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
945b539461dcc159bd89297443780d635ccc5e3564John Hoford        Log.v(LOGTAG,"could recognize format");
955b539461dcc159bd89297443780d635ccc5e3564John Hoford        return null;
965b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
975b539461dcc159bd89297443780d635ccc5e3564John Hoford
985b539461dcc159bd89297443780d635ccc5e3564John Hoford    static Properties[] getPropertyFiles(File dir) {
995b539461dcc159bd89297443780d635ccc5e3564John Hoford
1005b539461dcc159bd89297443780d635ccc5e3564John Hoford        File[] f = dir.listFiles(new FilenameFilter() {
1015b539461dcc159bd89297443780d635ccc5e3564John Hoford
1025b539461dcc159bd89297443780d635ccc5e3564John Hoford            @Override
1035b539461dcc159bd89297443780d635ccc5e3564John Hoford            public boolean accept(File dir, String name) {
1045b539461dcc159bd89297443780d635ccc5e3564John Hoford                Log.v(LOGTAG, name);
1055b539461dcc159bd89297443780d635ccc5e3564John Hoford                return name.endsWith(".prop");
1065b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
1075b539461dcc159bd89297443780d635ccc5e3564John Hoford        });
1085b539461dcc159bd89297443780d635ccc5e3564John Hoford        Properties[]ret = new Properties[f.length];
1095b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < f.length; i++) {
1105b539461dcc159bd89297443780d635ccc5e3564John Hoford            Properties prop = new Properties();
1115b539461dcc159bd89297443780d635ccc5e3564John Hoford            ret[i] = prop;
1125b539461dcc159bd89297443780d635ccc5e3564John Hoford            try {
1135b539461dcc159bd89297443780d635ccc5e3564John Hoford                prop.load(new FileReader(f[i]));
1145b539461dcc159bd89297443780d635ccc5e3564John Hoford
1155b539461dcc159bd89297443780d635ccc5e3564John Hoford            } catch (Exception e) {
1165b539461dcc159bd89297443780d635ccc5e3564John Hoford                e.printStackTrace();
1175b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
1185b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1195b539461dcc159bd89297443780d635ccc5e3564John Hoford        return ret;
1205b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1215b539461dcc159bd89297443780d635ccc5e3564John Hoford
1225b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setProgressListener(ProgressListener listener){
1235b539461dcc159bd89297443780d635ccc5e3564John Hoford        mListener = listener;
1245b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1255b539461dcc159bd89297443780d635ccc5e3564John Hoford
1265b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static interface ProgressListener {
1275b539461dcc159bd89297443780d635ccc5e3564John Hoford        public void progress(int n, int total);
1285b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1295b539461dcc159bd89297443780d635ccc5e3564John Hoford}
130