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