blob: d32a0b5993440d25eba3b8ddc33626b520ae3dcf [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;
Jason Sams8a647432010-03-01 15:31:04 -080035 Bitmap mBitmap;
Jason Sams43ee06852009-08-12 17:54:11 -070036
37 Allocation(int id, RenderScript rs, Type t) {
Jason Samsb8c5a842009-07-31 20:40:47 -070038 super(rs);
39 mID = id;
Jason Sams43ee06852009-08-12 17:54:11 -070040 mType = t;
Jason Samsb8c5a842009-07-31 20:40:47 -070041 }
42
Jason Samsea87e962010-01-12 12:12:28 -080043 public Type getType() {
44 return mType;
45 }
46
Jason Samsb8c5a842009-07-31 20:40:47 -070047 public void uploadToTexture(int baseMipLevel) {
Jason Sams771bebb2009-12-07 12:40:12 -080048 mRS.validate();
Jason Samsc2908e62010-02-23 17:44:28 -080049 mRS.nAllocationUploadToTexture(mID, false, baseMipLevel);
50 }
51
52 public void uploadToTexture(boolean genMips, int baseMipLevel) {
53 mRS.validate();
54 mRS.nAllocationUploadToTexture(mID, genMips, baseMipLevel);
Jason Samsb8c5a842009-07-31 20:40:47 -070055 }
56
Jason Sams07ae4062009-08-27 20:23:34 -070057 public void uploadToBufferObject() {
Jason Sams771bebb2009-12-07 12:40:12 -080058 mRS.validate();
Jason Sams07ae4062009-08-27 20:23:34 -070059 mRS.nAllocationUploadToBufferObject(mID);
60 }
61
Jason Samsb8c5a842009-07-31 20:40:47 -070062 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080063 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070064 subData1D(0, mType.getElementCount(), d);
65 }
66 public void data(short[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080067 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070068 subData1D(0, mType.getElementCount(), d);
69 }
70 public void data(byte[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080071 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070072 subData1D(0, mType.getElementCount(), d);
73 }
74 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080075 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070076 subData1D(0, mType.getElementCount(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -070077 }
78
Jason Samsa70f4162010-03-26 15:33:42 -070079 public void subData(int off, FieldPacker fp) {
80 int eSize = mType.mElement.getSizeBytes();
81 final byte[] data = fp.getData();
82
83 int count = data.length / eSize;
84 if ((eSize * count) != data.length) {
85 throw new IllegalArgumentException("Field packer length " + data.length +
86 " not divisible by element size " + eSize + ".");
87 }
88 data1DChecks(off, count, data.length, data.length);
89 mRS.nAllocationSubData1D(mID, off, count, data, data.length);
90 }
91
Jason Sams768bc022009-09-21 19:41:04 -070092 private void data1DChecks(int off, int count, int len, int dataSize) {
Jason Sams771bebb2009-12-07 12:40:12 -080093 mRS.validate();
Jason Samsa70f4162010-03-26 15:33:42 -070094 if(off < 0) {
95 throw new IllegalArgumentException("Offset must be >= 0.");
96 }
97 if(count < 1) {
98 throw new IllegalArgumentException("Count must be >= 1.");
99 }
100 if((off + count) > mType.getElementCount()) {
101 throw new IllegalArgumentException("Overflow, Available count " + mType.getElementCount() +
102 ", got " + count + " at offset " + off + ".");
Jason Sams07ae4062009-08-27 20:23:34 -0700103 }
Jason Sams768bc022009-09-21 19:41:04 -0700104 if((len) < dataSize) {
105 throw new IllegalArgumentException("Array too small for allocation type.");
106 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700107 }
108
109 public void subData1D(int off, int count, int[] d) {
Jason Sams768bc022009-09-21 19:41:04 -0700110 int dataSize = mType.mElement.getSizeBytes() * count;
111 data1DChecks(off, count, d.length * 4, dataSize);
112 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
113 }
114 public void subData1D(int off, int count, short[] d) {
115 int dataSize = mType.mElement.getSizeBytes() * count;
116 data1DChecks(off, count, d.length * 2, dataSize);
117 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
118 }
119 public void subData1D(int off, int count, byte[] d) {
120 int dataSize = mType.mElement.getSizeBytes() * count;
121 data1DChecks(off, count, d.length, dataSize);
122 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
123 }
124 public void subData1D(int off, int count, float[] d) {
125 int dataSize = mType.mElement.getSizeBytes() * count;
126 data1DChecks(off, count, d.length * 4, dataSize);
127 mRS.nAllocationSubData1D(mID, off, count, d, dataSize);
Jason Samsb8c5a842009-07-31 20:40:47 -0700128 }
129
Jason Sams768bc022009-09-21 19:41:04 -0700130
Jason Samsb8c5a842009-07-31 20:40:47 -0700131
132 public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800133 mRS.validate();
Jason Sams07ae4062009-08-27 20:23:34 -0700134 mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700135 }
136
137 public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800138 mRS.validate();
Jason Sams07ae4062009-08-27 20:23:34 -0700139 mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700140 }
141
Jason Sams40a29e82009-08-10 14:55:26 -0700142 public void readData(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800143 mRS.validate();
Jason Sams40a29e82009-08-10 14:55:26 -0700144 mRS.nAllocationRead(mID, d);
145 }
146
147 public void readData(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800148 mRS.validate();
Jason Sams40a29e82009-08-10 14:55:26 -0700149 mRS.nAllocationRead(mID, d);
150 }
151
Jason Sams43ee06852009-08-12 17:54:11 -0700152 public void data(Object o) {
Jason Sams771bebb2009-12-07 12:40:12 -0800153 mRS.validate();
Jason Sams2525a812009-09-03 15:43:13 -0700154 mRS.nAllocationSubDataFromObject(mID, mType, 0, o);
Jason Sams43ee06852009-08-12 17:54:11 -0700155 }
156
Jason Sams5f43fd22009-09-15 12:39:22 -0700157 public void read(Object o) {
Jason Sams771bebb2009-12-07 12:40:12 -0800158 mRS.validate();
Jason Sams5f43fd22009-09-15 12:39:22 -0700159 mRS.nAllocationSubReadFromObject(mID, mType, 0, o);
160 }
161
Jason Sams2525a812009-09-03 15:43:13 -0700162 public void subData(int offset, Object o) {
Jason Sams771bebb2009-12-07 12:40:12 -0800163 mRS.validate();
Jason Sams2525a812009-09-03 15:43:13 -0700164 mRS.nAllocationSubDataFromObject(mID, mType, offset, o);
165 }
Jason Sams40a29e82009-08-10 14:55:26 -0700166
Jason Samsb8c5a842009-07-31 20:40:47 -0700167 public class Adapter1D extends BaseObj {
168 Adapter1D(int id, RenderScript rs) {
169 super(rs);
170 mID = id;
171 }
172
Jason Samsb8c5a842009-07-31 20:40:47 -0700173 public void setConstraint(Dimension dim, int value) {
Jason Sams771bebb2009-12-07 12:40:12 -0800174 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700175 mRS.nAdapter1DSetConstraint(mID, dim.mID, value);
176 }
177
178 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800179 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700180 mRS.nAdapter1DData(mID, d);
181 }
182
Jason Samsb8c5a842009-07-31 20:40:47 -0700183 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800184 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700185 mRS.nAdapter1DData(mID, d);
186 }
187
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700188 public void subData(int off, int count, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800189 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700190 mRS.nAdapter1DSubData(mID, off, count, d);
191 }
192
Jason Samsb8c5a842009-07-31 20:40:47 -0700193 public void subData(int off, int count, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800194 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700195 mRS.nAdapter1DSubData(mID, off, count, d);
196 }
197 }
198
199 public Adapter1D createAdapter1D() {
Jason Sams771bebb2009-12-07 12:40:12 -0800200 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700201 int id = mRS.nAdapter1DCreate();
Jason Sams718cd1f2009-12-23 14:35:29 -0800202 if(id == 0) {
203 throw new IllegalStateException("allocation failed.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700204 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800205 mRS.nAdapter1DBindAllocation(id, mID);
Jason Samsb8c5a842009-07-31 20:40:47 -0700206 return new Adapter1D(id, mRS);
207 }
208
209
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700210 public class Adapter2D extends BaseObj {
211 Adapter2D(int id, RenderScript rs) {
212 super(rs);
213 mID = id;
214 }
215
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700216 public void setConstraint(Dimension dim, int value) {
Jason Sams771bebb2009-12-07 12:40:12 -0800217 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700218 mRS.nAdapter2DSetConstraint(mID, dim.mID, value);
219 }
220
221 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800222 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700223 mRS.nAdapter2DData(mID, d);
224 }
225
226 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800227 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700228 mRS.nAdapter2DData(mID, d);
229 }
230
231 public void subData(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800232 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700233 mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d);
234 }
235
236 public void subData(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800237 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700238 mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d);
239 }
240 }
241
242 public Adapter2D createAdapter2D() {
Jason Sams771bebb2009-12-07 12:40:12 -0800243 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700244 int id = mRS.nAdapter2DCreate();
Jason Sams718cd1f2009-12-23 14:35:29 -0800245 if(id == 0) {
246 throw new IllegalStateException("allocation failed.");
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700247 }
Jason Sams718cd1f2009-12-23 14:35:29 -0800248 mRS.nAdapter2DBindAllocation(id, mID);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700249 return new Adapter2D(id, mRS);
250 }
251
Jason Samsb8c5a842009-07-31 20:40:47 -0700252
253 // creation
254
255 private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
256 static {
257 mBitmapOptions.inScaled = false;
258 }
259
Jason Sams1bada8c2009-08-09 17:01:55 -0700260 static public Allocation createTyped(RenderScript rs, Type type)
261 throws IllegalArgumentException {
262
Jason Sams771bebb2009-12-07 12:40:12 -0800263 rs.validate();
Jason Sams1bada8c2009-08-09 17:01:55 -0700264 if(type.mID == 0) {
265 throw new IllegalStateException("Bad Type");
266 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700267 int id = rs.nAllocationCreateTyped(type.mID);
Jason Sams43ee06852009-08-12 17:54:11 -0700268 return new Allocation(id, rs, type);
Jason Samsb8c5a842009-07-31 20:40:47 -0700269 }
270
Jason Sams1bada8c2009-08-09 17:01:55 -0700271 static public Allocation createSized(RenderScript rs, Element e, int count)
272 throws IllegalArgumentException {
273
Jason Sams771bebb2009-12-07 12:40:12 -0800274 rs.validate();
Jason Sams768bc022009-09-21 19:41:04 -0700275 Type.Builder b = new Type.Builder(rs, e);
276 b.add(Dimension.X, count);
277 Type t = b.create();
278
279 int id = rs.nAllocationCreateTyped(t.mID);
Jason Samsea84a7c2009-09-04 14:42:41 -0700280 if(id == 0) {
281 throw new IllegalStateException("Bad element.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700282 }
Jason Sams768bc022009-09-21 19:41:04 -0700283 return new Allocation(id, rs, t);
Jason Samsb8c5a842009-07-31 20:40:47 -0700284 }
285
Jason Sams8a647432010-03-01 15:31:04 -0800286 static private Element elementFromBitmap(RenderScript rs, Bitmap b) {
287 final Bitmap.Config bc = b.getConfig();
288 if (bc == Bitmap.Config.ALPHA_8) {
289 return Element.A_8(rs);
290 }
291 if (bc == Bitmap.Config.ARGB_4444) {
292 return Element.RGBA_4444(rs);
293 }
294 if (bc == Bitmap.Config.ARGB_8888) {
295 return Element.RGBA_8888(rs);
296 }
297 if (bc == Bitmap.Config.RGB_565) {
298 return Element.RGB_565(rs);
299 }
300 throw new IllegalStateException("Bad bitmap type.");
301 }
302
303 static private Type typeFromBitmap(RenderScript rs, Bitmap b) {
304 Element e = elementFromBitmap(rs, b);
305 Type.Builder tb = new Type.Builder(rs, e);
306 tb.add(Dimension.X, b.getWidth());
307 tb.add(Dimension.Y, b.getHeight());
308 return tb.create();
309 }
310
Jason Samsb8c5a842009-07-31 20:40:47 -0700311 static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
312 throws IllegalArgumentException {
Jason Samsb8c5a842009-07-31 20:40:47 -0700313
Jason Sams771bebb2009-12-07 12:40:12 -0800314 rs.validate();
Jason Sams8a647432010-03-01 15:31:04 -0800315 Type t = typeFromBitmap(rs, b);
316
Jason Samsea84a7c2009-09-04 14:42:41 -0700317 int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b);
Jason Sams718cd1f2009-12-23 14:35:29 -0800318 if(id == 0) {
319 throw new IllegalStateException("Load failed.");
320 }
Jason Sams8a647432010-03-01 15:31:04 -0800321 return new Allocation(id, rs, t);
322 }
323
324 static public Allocation createBitmapRef(RenderScript rs, Bitmap b)
325 throws IllegalArgumentException {
326
327 rs.validate();
328 Type t = typeFromBitmap(rs, b);
329
330 int id = rs.nAllocationCreateBitmapRef(t.getID(), b);
331 if(id == 0) {
332 throw new IllegalStateException("Load failed.");
333 }
334
335 Allocation a = new Allocation(id, rs, t);
336 a.mBitmap = b;
337 return a;
Jason Samsb8c5a842009-07-31 20:40:47 -0700338 }
339
Jason Sams74e02ef2010-01-06 15:10:29 -0800340 static Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
Jason Samsb8c5a842009-07-31 20:40:47 -0700341 throws IllegalArgumentException {
Jason Samsb8c5a842009-07-31 20:40:47 -0700342
Jason Sams771bebb2009-12-07 12:40:12 -0800343 rs.validate();
Jason Samsea84a7c2009-09-04 14:42:41 -0700344 int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b);
Jason Sams718cd1f2009-12-23 14:35:29 -0800345 if(id == 0) {
346 throw new IllegalStateException("Load failed.");
347 }
Jason Sams43ee06852009-08-12 17:54:11 -0700348 return new Allocation(id, rs, null);
Jason Samsb8c5a842009-07-31 20:40:47 -0700349 }
350
351 static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
352 throws IllegalArgumentException {
353
Jason Sams771bebb2009-12-07 12:40:12 -0800354 rs.validate();
Romain Guy650a3eb2009-08-31 14:06:43 -0700355 InputStream is = null;
356 try {
357 final TypedValue value = new TypedValue();
358 is = res.openRawResource(id, value);
359
360 int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
Jason Samsea84a7c2009-09-04 14:42:41 -0700361 int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips,
Romain Guy650a3eb2009-08-31 14:06:43 -0700362 asset);
363
Jason Sams718cd1f2009-12-23 14:35:29 -0800364 if(allocationId == 0) {
365 throw new IllegalStateException("Load failed.");
366 }
Jason Samsea84a7c2009-09-04 14:42:41 -0700367 return new Allocation(allocationId, rs, null);
Romain Guy650a3eb2009-08-31 14:06:43 -0700368 } catch (Exception e) {
369 // Ignore
370 } finally {
371 if (is != null) {
372 try {
373 is.close();
374 } catch (IOException e) {
375 // Ignore
376 }
377 }
378 }
379
380 return null;
Jason Samsb8c5a842009-07-31 20:40:47 -0700381 }
382
383 static public Allocation createFromBitmapResourceBoxed(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
384 throws IllegalArgumentException {
385
386 Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions);
387 return createFromBitmapBoxed(rs, b, dstFmt, genMips);
388 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700389}
390
391