FileA3D.java revision 460a04971c494fec39ffcb38e873bb8fdd82d113
1aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk/*
265c80f824711f084c4ece9204f543a7809534294Jason Sams * Copyright (C) 2008-2012 The Android Open Source Project
3aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
4aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * you may not use this file except in compliance with the License.
6aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * You may obtain a copy of the License at
7aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
8aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
10aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * See the License for the specific language governing permissions and
14aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * limitations under the License.
15aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk */
16aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
17aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukpackage android.renderscript;
18aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
19e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport java.io.File;
20aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport java.io.IOException;
21aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport java.io.InputStream;
22aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
23aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport android.content.res.AssetManager;
24e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport android.content.res.Resources;
25aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport android.graphics.Bitmap;
26aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport android.graphics.BitmapFactory;
27aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport android.util.Log;
28aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport android.util.TypedValue;
29aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
309c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
31a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide
3265c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16
33c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * FileA3D allows users to load RenderScript objects from files
34f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * or resources stored on disk. It could be used to load items
35c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * such as 3D geometry data converted to a RenderScript format from
36f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * content creation tools. Currently only meshes are supported
37f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * in FileA3D.
38f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk *
39f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * When successfully loaded, FileA3D will contain a list of
40f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * index entries for all the objects stored inside it.
41aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
42aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk **/
43aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukpublic class FileA3D extends BaseObj {
44aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
4665c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
47f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Specifies what renderscript object type is contained within
48f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * the FileA3D IndexEntry
49f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    **/
50e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public enum EntryType {
51e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
529c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
5365c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
54ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Unknown or or invalid object, nothing will be loaded
55ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        **/
56e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        UNKNOWN (0),
579c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
5865c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
59c11e25c4e653124def1fb18e203b894f42106cbeTim Murray        * RenderScript Mesh object
60ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        **/
61e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        MESH (1);
62e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
63e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        int mID;
64e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        EntryType(int id) {
65e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            mID = id;
66e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
67e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
68e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        static EntryType toEntryType(int intID) {
69e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            return EntryType.values()[intID];
70e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
71e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
72e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
739c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
7465c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
75c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    * IndexEntry contains information about one of the RenderScript
76f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * objects inside the file's index. It could be used to query the
7711518acc8c416023d8c2192b441a1767205676d9Robert Ly    * object's type and also name and load the object itself if
78f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * necessary.
79f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
80dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    public static class IndexEntry {
81aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        RenderScript mRS;
82aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        int mIndex;
83460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long mID;
84aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        String mName;
85e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        EntryType mEntryType;
86aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        BaseObj mLoadedObj;
87aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
889c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
8965c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
90ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Returns the name of a renderscript object the index entry
91ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * describes
92ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        *
93f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @return name of a renderscript object the index entry
94ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * describes
95ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        *
96f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
97aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        public String getName() {
98aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return mName;
99aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
100aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1019c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
10265c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
103ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Returns the type of a renderscript object the index entry
104ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * describes
105f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @return type of a renderscript object the index entry
106f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        *         describes
107f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
108e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        public EntryType getEntryType() {
109e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            return mEntryType;
110e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
111e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
1129c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
11365c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
114ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Used to load the object described by the index entry
115ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * @return base renderscript object described by the entry
116f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
117aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        public BaseObj getObject() {
118dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mRS.validate();
119dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            BaseObj obj = internalCreate(mRS, this);
120dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            return obj;
121dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
122dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
12465c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
125ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Used to load the mesh described by the index entry, object
126ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * described by the index entry must be a renderscript mesh
127ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        *
128f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @return renderscript mesh object described by the entry
129f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
130e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        public Mesh getMesh() {
131e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            return (Mesh)getObject();
132e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
133e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
134dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        static synchronized BaseObj internalCreate(RenderScript rs, IndexEntry entry) {
135dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(entry.mLoadedObj != null) {
136dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                return entry.mLoadedObj;
137aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
138aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
139e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            // to be purged on cleanup
140e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            if(entry.mEntryType == EntryType.UNKNOWN) {
141aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk                return null;
142aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
143aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
144dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            int objectID = rs.nFileA3DGetEntryByIndex(entry.mID, entry.mIndex);
145aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            if(objectID == 0) {
146aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk                return null;
147aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
148aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
149e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            switch (entry.mEntryType) {
150aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            case MESH:
151dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                entry.mLoadedObj = new Mesh(objectID, rs);
152aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk                break;
153aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
154aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
155dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            entry.mLoadedObj.updateFromNative();
156dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            return entry.mLoadedObj;
157aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
158aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
159460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        IndexEntry(RenderScript rs, int index, long id, String name, EntryType type) {
160aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mRS = rs;
161aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mIndex = index;
162aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mID = id;
163aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mName = name;
164e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            mEntryType = type;
165aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mLoadedObj = null;
166aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
167aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
168aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
169aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    IndexEntry[] mFileEntries;
170581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    InputStream mInputStream;
171aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
172460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    FileA3D(long id, RenderScript rs, InputStream stream) {
1730de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
174581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk        mInputStream = stream;
175aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
176aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
177aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    private void initEntries() {
178e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int numFileEntries = mRS.nFileA3DGetNumIndexEntries(getID(mRS));
179aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        if(numFileEntries <= 0) {
180aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return;
181aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
182aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
183aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        mFileEntries = new IndexEntry[numFileEntries];
184aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        int[] ids = new int[numFileEntries];
185aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        String[] names = new String[numFileEntries];
186aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
187e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nFileA3DGetIndexEntries(getID(mRS), numFileEntries, ids, names);
188aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
189aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        for(int i = 0; i < numFileEntries; i ++) {
190e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mFileEntries[i] = new IndexEntry(mRS, i, getID(mRS), names[i], EntryType.toEntryType(ids[i]));
191aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
192aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
193aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1949c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
19565c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
196ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * Returns the number of objects stored inside the a3d file
197ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
198ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return the number of objects stored inside the a3d file
199f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
200e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public int getIndexEntryCount() {
201aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        if(mFileEntries == null) {
202aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return 0;
203aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
204aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        return mFileEntries.length;
205aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
206aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
2079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
20865c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
209f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Returns an index entry from the list of all objects inside
210f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * FileA3D
211f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
212f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param index number of the entry from the list to return
213ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
214ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return entry in the a3d file described by the index
215f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
216aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    public IndexEntry getIndexEntry(int index) {
217e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        if(getIndexEntryCount() == 0 || index < 0 || index >= mFileEntries.length) {
218aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return null;
219aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
220aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        return mFileEntries[index];
221aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
222aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
2239c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
22465c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
225f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from an asset stored on disk
226f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
227f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
228f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param mgr asset manager used to load asset
229f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
230f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
231ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
232f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
233b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromAsset(RenderScript rs, AssetManager mgr, String path) {
234b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        rs.validate();
235460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = rs.nFileA3DCreateFromAsset(mgr, path);
236b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
237b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
238b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from asset " + path);
239b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
240b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, null);
241b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
242b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
243e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
244e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
24665c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
247f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from a file stored on disk
248f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
249f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
250f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
251f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
252ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
253f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
254b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromFile(RenderScript rs, String path) {
255460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = rs.nFileA3DCreateFromFile(path);
256b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
257b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
258b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from " + path);
259b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
260b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, null);
261b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
262b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
263e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
264e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
26665c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
267f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from a file stored on disk
268f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
269f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
270f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
271f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
272ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
273f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
274b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromFile(RenderScript rs, File path) {
275e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        return createFromFile(rs, path.getAbsolutePath());
276e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
277e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2789c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
27965c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
280f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from an application resource
281f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
282f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
283f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param res resource manager used for loading
284f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param id resource to create FileA3D from
285f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
286ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
287f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
288b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromResource(RenderScript rs, Resources res, int id) {
289aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
290aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        rs.validate();
291aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        InputStream is = null;
292aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        try {
293b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            is = res.openRawResource(id);
294b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } catch (Exception e) {
295b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to open resource " + id);
296b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
297aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
298460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = 0;
299b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if (is instanceof AssetManager.AssetInputStream) {
300aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
301b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            fileId = rs.nFileA3DCreateFromAssetStream(asset);
302b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } else {
303b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unsupported asset stream");
304b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
305aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
306b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
307b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from resource " + id);
308aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
309b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, is);
310b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
311b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
312aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
313aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
314aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
315