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