blob: 3b3711bb320f90249514aa36a992ca61f7532f78 [file] [log] [blame]
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -07001/*
2 * Copyright (C) 2008 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
17package android.renderscript;
18
19import java.io.IOException;
20import java.io.InputStream;
21
22import android.content.res.Resources;
23import android.content.res.AssetManager;
24import android.graphics.Bitmap;
25import android.graphics.BitmapFactory;
26import android.util.Log;
27import android.util.TypedValue;
28
29/**
30 * @hide
31 *
32 **/
33public class FileA3D extends BaseObj {
34
35 public enum ClassID {
36
37 UNKNOWN,
38 MESH,
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -070039 TYPE,
40 ELEMENT,
41 ALLOCATION,
42 PROGRAM_VERTEX,
43 PROGRAM_RASTER,
44 PROGRAM_FRAGMENT,
45 PROGRAM_STORE,
46 SAMPLER,
47 ANIMATION,
48 LIGHT,
49 ADAPTER_1D,
50 ADAPTER_2D,
51 SCRIPT_C;
52
53 public static ClassID toClassID(int intID) {
54 return ClassID.values()[intID];
55 }
56 }
57
58 // Read only class with index entries
59 public class IndexEntry {
60 RenderScript mRS;
61 int mIndex;
62 int mID;
63 String mName;
64 ClassID mClassID;
65 BaseObj mLoadedObj;
66
67 public String getName() {
68 return mName;
69 }
70
71 public ClassID getClassID() {
72 return mClassID;
73 }
74
75 public BaseObj getObject() {
76 if(mLoadedObj != null) {
77 return mLoadedObj;
78 }
79
80 if(mClassID == ClassID.UNKNOWN) {
81 return null;
82 }
83
84 int objectID = mRS.nFileA3DGetEntryByIndex(mID, mIndex);
85 if(objectID == 0) {
86 return null;
87 }
88
89 switch (mClassID) {
90 case MESH:
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -070091 mLoadedObj = new Mesh(objectID, mRS);
Alex Sakhartchoukaae74ad2010-06-04 10:06:50 -070092 break;
93 case TYPE:
94 mLoadedObj = new Type(objectID, mRS);
95 break;
96 case ELEMENT:
97 mLoadedObj = null;
98 break;
99 case ALLOCATION:
100 mLoadedObj = null;
101 break;
102 case PROGRAM_VERTEX:
103 mLoadedObj = new ProgramVertex(objectID, mRS);
104 break;
105 case PROGRAM_RASTER:
106 break;
107 case PROGRAM_FRAGMENT:
108 break;
109 case PROGRAM_STORE:
110 break;
111 case SAMPLER:
112 break;
113 case ANIMATION:
114 break;
115 case LIGHT:
116 break;
117 case ADAPTER_1D:
118 break;
119 case ADAPTER_2D:
120 break;
121 case SCRIPT_C:
122 break;
123 }
124
125 return mLoadedObj;
126 }
127
128 IndexEntry(RenderScript rs, int index, int id, String name, ClassID classID) {
129 mRS = rs;
130 mIndex = index;
131 mID = id;
132 mName = name;
133 mClassID = classID;
134 mLoadedObj = null;
135 }
136 }
137
138 IndexEntry[] mFileEntries;
139
140 FileA3D(int id, RenderScript rs) {
141 super(rs);
142 mID = id;
143 }
144
145 private void initEntries() {
146 int numFileEntries = mRS.nFileA3DGetNumIndexEntries(mID);
147 if(numFileEntries <= 0) {
148 return;
149 }
150
151 mFileEntries = new IndexEntry[numFileEntries];
152 int[] ids = new int[numFileEntries];
153 String[] names = new String[numFileEntries];
154
155 mRS.nFileA3DGetIndexEntries(mID, numFileEntries, ids, names);
156
157 for(int i = 0; i < numFileEntries; i ++) {
158 mFileEntries[i] = new IndexEntry(mRS, i, mID, names[i], ClassID.toClassID(ids[i]));
159 }
160 }
161
162 public int getNumIndexEntries() {
163 if(mFileEntries == null) {
164 return 0;
165 }
166 return mFileEntries.length;
167 }
168
169 public IndexEntry getIndexEntry(int index) {
170 if(getNumIndexEntries() == 0 || index < 0 || index >= mFileEntries.length) {
171 return null;
172 }
173 return mFileEntries[index];
174 }
175
176 static public FileA3D createFromResource(RenderScript rs, Resources res, int id)
177 throws IllegalArgumentException {
178
179 rs.validate();
180 InputStream is = null;
181 try {
182 final TypedValue value = new TypedValue();
183 is = res.openRawResource(id, value);
184
185 int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
186
187 int fileId = rs.nFileA3DCreateFromAssetStream(asset);
188
189 if(fileId == 0) {
190 throw new IllegalStateException("Load failed.");
191 }
192 FileA3D fa3d = new FileA3D(fileId, rs);
193 fa3d.initEntries();
194 return fa3d;
195
196 } catch (Exception e) {
197 // Ignore
198 } finally {
199 if (is != null) {
200 try {
201 is.close();
202 } catch (IOException e) {
203 // Ignore
204 }
205 }
206 }
207
208 return null;
209 }
210}