blob: 957f2dd3815dec600b96b98083f6a7e69997c977 [file] [log] [blame]
Jason Samsb8c5a842009-07-31 20:40:47 -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
Jason Samsb8c5a842009-07-31 20:40:47 -070019import java.io.IOException;
20import java.io.InputStream;
21
22import android.content.res.Resources;
Romain Guy650a3eb2009-08-31 14:06:43 -070023import android.content.res.AssetManager;
Jason Samsb8c5a842009-07-31 20:40:47 -070024import android.graphics.Bitmap;
25import android.graphics.BitmapFactory;
Jason Samsb8c5a842009-07-31 20:40:47 -070026import android.util.Log;
Romain Guy650a3eb2009-08-31 14:06:43 -070027import android.util.TypedValue;
Jason Samsb8c5a842009-07-31 20:40:47 -070028
29/**
30 * @hide
31 *
32 **/
33public class Allocation extends BaseObj {
Jason Sams43ee06852009-08-12 17:54:11 -070034 Type mType;
35
36 Allocation(int id, RenderScript rs, Type t) {
Jason Samsb8c5a842009-07-31 20:40:47 -070037 super(rs);
38 mID = id;
Jason Sams43ee06852009-08-12 17:54:11 -070039 mType = t;
Jason Samsb8c5a842009-07-31 20:40:47 -070040 }
41
42 public void uploadToTexture(int baseMipLevel) {
43 mRS.nAllocationUploadToTexture(mID, baseMipLevel);
44 }
45
Jason Sams07ae4062009-08-27 20:23:34 -070046 public void uploadToBufferObject() {
47 mRS.nAllocationUploadToBufferObject(mID);
48 }
49
Jason Samsb8c5a842009-07-31 20:40:47 -070050 public void data(int[] d) {
Jason Sams768bc022009-09-21 19:41:04 -070051 subData1D(0, mType.getElementCount(), d);
52 }
53 public void data(short[] d) {
54 subData1D(0, mType.getElementCount(), d);
55 }
56 public void data(byte[] d) {
57 subData1D(0, mType.getElementCount(), d);
58 }
59 public void data(float[] d) {
60 subData1D(0, mType.getElementCount(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -070061 }
62
Jason Sams768bc022009-09-21 19:41:04 -070063 private void data1DChecks(int off, int count, int len, int dataSize) {
64 if((off < 0) || (count < 1) || ((off + count) > mType.getElementCount())) {
65 throw new IllegalArgumentException("Offset or Count out of bounds.");
Jason Sams07ae4062009-08-27 20:23:34 -070066 }
Jason Sams768bc022009-09-21 19:41:04 -070067 if((len) < dataSize) {
68 throw new IllegalArgumentException("Array too small for allocation type.");
69 }
Jason Samsb8c5a842009-07-31 20:40:47 -070070 }
71
72 public void subData1D(int off, int count, int[] d) {
Jason Sams768bc022009-09-21 19:41:04 -070073 int dataSize = mType.mElement.getSizeBytes() * count;
74 data1DChecks(off, count, d.length * 4, dataSize);
75 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
76 }
77 public void subData1D(int off, int count, short[] d) {
78 int dataSize = mType.mElement.getSizeBytes() * count;
79 data1DChecks(off, count, d.length * 2, dataSize);
80 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
81 }
82 public void subData1D(int off, int count, byte[] d) {
83 int dataSize = mType.mElement.getSizeBytes() * count;
84 data1DChecks(off, count, d.length, dataSize);
85 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
86 }
87 public void subData1D(int off, int count, float[] d) {
88 int dataSize = mType.mElement.getSizeBytes() * count;
89 data1DChecks(off, count, d.length * 4, dataSize);
90 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
Jason Samsb8c5a842009-07-31 20:40:47 -070091 }
92
Jason Sams768bc022009-09-21 19:41:04 -070093
Jason Samsb8c5a842009-07-31 20:40:47 -070094
95 public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams07ae4062009-08-27 20:23:34 -070096 mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -070097 }
98
99 public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams07ae4062009-08-27 20:23:34 -0700100 mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700101 }
102
Jason Sams40a29e82009-08-10 14:55:26 -0700103 public void readData(int[] d) {
104 mRS.nAllocationRead(mID, d);
105 }
106
107 public void readData(float[] d) {
108 mRS.nAllocationRead(mID, d);
109 }
110
Jason Sams43ee06852009-08-12 17:54:11 -0700111 public void data(Object o) {
Jason Sams2525a812009-09-03 15:43:13 -0700112 mRS.nAllocationSubDataFromObject(mID, mType, 0, o);
Jason Sams43ee06852009-08-12 17:54:11 -0700113 }
114
Jason Sams5f43fd22009-09-15 12:39:22 -0700115 public void read(Object o) {
116 mRS.nAllocationSubReadFromObject(mID, mType, 0, o);
117 }
118
Jason Sams2525a812009-09-03 15:43:13 -0700119 public void subData(int offset, Object o) {
120 mRS.nAllocationSubDataFromObject(mID, mType, offset, o);
121 }
Jason Sams40a29e82009-08-10 14:55:26 -0700122
Jason Samsb8c5a842009-07-31 20:40:47 -0700123 public class Adapter1D extends BaseObj {
124 Adapter1D(int id, RenderScript rs) {
125 super(rs);
126 mID = id;
127 }
128
Jason Samsb8c5a842009-07-31 20:40:47 -0700129 public void setConstraint(Dimension dim, int value) {
130 mRS.nAdapter1DSetConstraint(mID, dim.mID, value);
131 }
132
133 public void data(int[] d) {
134 mRS.nAdapter1DData(mID, d);
135 }
136
Jason Samsb8c5a842009-07-31 20:40:47 -0700137 public void data(float[] d) {
138 mRS.nAdapter1DData(mID, d);
139 }
140
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700141 public void subData(int off, int count, int[] d) {
142 mRS.nAdapter1DSubData(mID, off, count, d);
143 }
144
Jason Samsb8c5a842009-07-31 20:40:47 -0700145 public void subData(int off, int count, float[] d) {
146 mRS.nAdapter1DSubData(mID, off, count, d);
147 }
148 }
149
150 public Adapter1D createAdapter1D() {
151 int id = mRS.nAdapter1DCreate();
152 if (id != 0) {
153 mRS.nAdapter1DBindAllocation(id, mID);
154 }
155 return new Adapter1D(id, mRS);
156 }
157
158
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700159 public class Adapter2D extends BaseObj {
160 Adapter2D(int id, RenderScript rs) {
161 super(rs);
162 mID = id;
163 }
164
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700165 public void setConstraint(Dimension dim, int value) {
166 mRS.nAdapter2DSetConstraint(mID, dim.mID, value);
167 }
168
169 public void data(int[] d) {
170 mRS.nAdapter2DData(mID, d);
171 }
172
173 public void data(float[] d) {
174 mRS.nAdapter2DData(mID, d);
175 }
176
177 public void subData(int xoff, int yoff, int w, int h, int[] d) {
178 mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d);
179 }
180
181 public void subData(int xoff, int yoff, int w, int h, float[] d) {
182 mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d);
183 }
184 }
185
186 public Adapter2D createAdapter2D() {
187 int id = mRS.nAdapter2DCreate();
188 if (id != 0) {
189 mRS.nAdapter2DBindAllocation(id, mID);
190 }
191 return new Adapter2D(id, mRS);
192 }
193
Jason Samsb8c5a842009-07-31 20:40:47 -0700194
195 // creation
196
197 private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
198 static {
199 mBitmapOptions.inScaled = false;
200 }
201
Jason Sams1bada8c2009-08-09 17:01:55 -0700202 static public Allocation createTyped(RenderScript rs, Type type)
203 throws IllegalArgumentException {
204
205 if(type.mID == 0) {
206 throw new IllegalStateException("Bad Type");
207 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700208 int id = rs.nAllocationCreateTyped(type.mID);
Jason Sams43ee06852009-08-12 17:54:11 -0700209 return new Allocation(id, rs, type);
Jason Samsb8c5a842009-07-31 20:40:47 -0700210 }
211
Jason Sams1bada8c2009-08-09 17:01:55 -0700212 static public Allocation createSized(RenderScript rs, Element e, int count)
213 throws IllegalArgumentException {
214
Jason Sams768bc022009-09-21 19:41:04 -0700215 Type.Builder b = new Type.Builder(rs, e);
216 b.add(Dimension.X, count);
217 Type t = b.create();
218
219 int id = rs.nAllocationCreateTyped(t.mID);
Jason Samsea84a7c2009-09-04 14:42:41 -0700220 if(id == 0) {
221 throw new IllegalStateException("Bad element.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700222 }
Jason Sams768bc022009-09-21 19:41:04 -0700223 return new Allocation(id, rs, t);
Jason Samsb8c5a842009-07-31 20:40:47 -0700224 }
225
226 static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
227 throws IllegalArgumentException {
Jason Samsb8c5a842009-07-31 20:40:47 -0700228
Jason Samsea84a7c2009-09-04 14:42:41 -0700229 int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b);
Jason Sams43ee06852009-08-12 17:54:11 -0700230 return new Allocation(id, rs, null);
Jason Samsb8c5a842009-07-31 20:40:47 -0700231 }
232
233 static public Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
234 throws IllegalArgumentException {
Jason Samsb8c5a842009-07-31 20:40:47 -0700235
Jason Samsea84a7c2009-09-04 14:42:41 -0700236 int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b);
Jason Sams43ee06852009-08-12 17:54:11 -0700237 return new Allocation(id, rs, null);
Jason Samsb8c5a842009-07-31 20:40:47 -0700238 }
239
240 static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
241 throws IllegalArgumentException {
242
Romain Guy650a3eb2009-08-31 14:06:43 -0700243 InputStream is = null;
244 try {
245 final TypedValue value = new TypedValue();
246 is = res.openRawResource(id, value);
247
248 int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
Jason Samsea84a7c2009-09-04 14:42:41 -0700249 int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips,
Romain Guy650a3eb2009-08-31 14:06:43 -0700250 asset);
251
Jason Samsea84a7c2009-09-04 14:42:41 -0700252 return new Allocation(allocationId, rs, null);
Romain Guy650a3eb2009-08-31 14:06:43 -0700253 } catch (Exception e) {
254 // Ignore
255 } finally {
256 if (is != null) {
257 try {
258 is.close();
259 } catch (IOException e) {
260 // Ignore
261 }
262 }
263 }
264
265 return null;
Jason Samsb8c5a842009-07-31 20:40:47 -0700266 }
267
268 static public Allocation createFromBitmapResourceBoxed(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
269 throws IllegalArgumentException {
270
271 Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions);
272 return createFromBitmapBoxed(rs, b, dstFmt, genMips);
273 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700274}
275
276