blob: 9dc291b1650e9247d855c1815ed97d03d8343119 [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) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -070038 super(id, rs);
Jason Sams43ee06852009-08-12 17:54:11 -070039 mType = t;
Jason Samsb8c5a842009-07-31 20:40:47 -070040 }
41
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -070042 Allocation(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -070043 super(id, rs);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -070044 }
45
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -070046 @Override
47 void updateFromNative() {
Jason Sams06d69de2010-11-09 17:11:40 -080048 super.updateFromNative();
49 int typeID = mRS.nAllocationGetType(getID());
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -070050 if(typeID != 0) {
51 mType = new Type(typeID, mRS);
52 mType.updateFromNative();
53 }
54 }
55
Jason Samsea87e962010-01-12 12:12:28 -080056 public Type getType() {
57 return mType;
58 }
59
Jason Samsb8c5a842009-07-31 20:40:47 -070060 public void uploadToTexture(int baseMipLevel) {
Jason Sams771bebb2009-12-07 12:40:12 -080061 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -080062 mRS.nAllocationUploadToTexture(getID(), false, baseMipLevel);
Jason Samsc2908e62010-02-23 17:44:28 -080063 }
64
65 public void uploadToTexture(boolean genMips, int baseMipLevel) {
66 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -080067 mRS.nAllocationUploadToTexture(getID(), genMips, baseMipLevel);
Jason Samsb8c5a842009-07-31 20:40:47 -070068 }
69
Jason Sams07ae4062009-08-27 20:23:34 -070070 public void uploadToBufferObject() {
Jason Sams771bebb2009-12-07 12:40:12 -080071 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -080072 mRS.nAllocationUploadToBufferObject(getID());
Jason Sams07ae4062009-08-27 20:23:34 -070073 }
74
Jason Samsb8c5a842009-07-31 20:40:47 -070075 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080076 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070077 subData1D(0, mType.getElementCount(), d);
78 }
79 public void data(short[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080080 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070081 subData1D(0, mType.getElementCount(), d);
82 }
83 public void data(byte[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080084 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070085 subData1D(0, mType.getElementCount(), d);
86 }
87 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080088 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070089 subData1D(0, mType.getElementCount(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -070090 }
91
Jason Sams06d69de2010-11-09 17:11:40 -080092 public void updateFromBitmap(Bitmap b) {
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -070093
94 mRS.validate();
95 if(mType.getX() != b.getWidth() ||
96 mType.getY() != b.getHeight()) {
Jason Sams06d69de2010-11-09 17:11:40 -080097 throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -070098 }
99
Jason Sams06d69de2010-11-09 17:11:40 -0800100 mRS.nAllocationUpdateFromBitmap(getID(), b);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700101 }
102
Jason Sams49bdaf02010-08-31 13:50:42 -0700103 public void subData(int xoff, FieldPacker fp) {
Jason Samsa70f4162010-03-26 15:33:42 -0700104 int eSize = mType.mElement.getSizeBytes();
105 final byte[] data = fp.getData();
106
107 int count = data.length / eSize;
108 if ((eSize * count) != data.length) {
Jason Sams06d69de2010-11-09 17:11:40 -0800109 throw new RSIllegalArgumentException("Field packer length " + data.length +
Jason Samsa70f4162010-03-26 15:33:42 -0700110 " not divisible by element size " + eSize + ".");
111 }
Jason Sams49bdaf02010-08-31 13:50:42 -0700112 data1DChecks(xoff, count, data.length, data.length);
Jason Sams06d69de2010-11-09 17:11:40 -0800113 mRS.nAllocationSubData1D(getID(), xoff, count, data, data.length);
Jason Sams49bdaf02010-08-31 13:50:42 -0700114 }
115
116
117 public void subElementData(int xoff, int component_number, FieldPacker fp) {
118 if (component_number >= mType.mElement.mElements.length) {
Jason Sams06d69de2010-11-09 17:11:40 -0800119 throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
Jason Sams49bdaf02010-08-31 13:50:42 -0700120 }
121 if(xoff < 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800122 throw new RSIllegalArgumentException("Offset must be >= 0.");
Jason Sams49bdaf02010-08-31 13:50:42 -0700123 }
124
125 final byte[] data = fp.getData();
126 int eSize = mType.mElement.mElements[component_number].getSizeBytes();
127
128 if (data.length != eSize) {
Jason Sams06d69de2010-11-09 17:11:40 -0800129 throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
Jason Sams49bdaf02010-08-31 13:50:42 -0700130 " does not match component size " + eSize + ".");
131 }
132
Jason Sams06d69de2010-11-09 17:11:40 -0800133 mRS.nAllocationSubElementData1D(getID(), xoff, component_number, data, data.length);
Jason Samsa70f4162010-03-26 15:33:42 -0700134 }
135
Jason Sams768bc022009-09-21 19:41:04 -0700136 private void data1DChecks(int off, int count, int len, int dataSize) {
Jason Sams771bebb2009-12-07 12:40:12 -0800137 mRS.validate();
Jason Samsa70f4162010-03-26 15:33:42 -0700138 if(off < 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800139 throw new RSIllegalArgumentException("Offset must be >= 0.");
Jason Samsa70f4162010-03-26 15:33:42 -0700140 }
141 if(count < 1) {
Jason Sams06d69de2010-11-09 17:11:40 -0800142 throw new RSIllegalArgumentException("Count must be >= 1.");
Jason Samsa70f4162010-03-26 15:33:42 -0700143 }
144 if((off + count) > mType.getElementCount()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800145 throw new RSIllegalArgumentException("Overflow, Available count " + mType.getElementCount() +
Jason Samsa70f4162010-03-26 15:33:42 -0700146 ", got " + count + " at offset " + off + ".");
Jason Sams07ae4062009-08-27 20:23:34 -0700147 }
Jason Sams768bc022009-09-21 19:41:04 -0700148 if((len) < dataSize) {
Jason Sams06d69de2010-11-09 17:11:40 -0800149 throw new RSIllegalArgumentException("Array too small for allocation type.");
Jason Sams768bc022009-09-21 19:41:04 -0700150 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700151 }
152
153 public void subData1D(int off, int count, int[] d) {
Jason Sams768bc022009-09-21 19:41:04 -0700154 int dataSize = mType.mElement.getSizeBytes() * count;
155 data1DChecks(off, count, d.length * 4, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800156 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Sams768bc022009-09-21 19:41:04 -0700157 }
158 public void subData1D(int off, int count, short[] d) {
159 int dataSize = mType.mElement.getSizeBytes() * count;
160 data1DChecks(off, count, d.length * 2, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800161 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Sams768bc022009-09-21 19:41:04 -0700162 }
163 public void subData1D(int off, int count, byte[] d) {
164 int dataSize = mType.mElement.getSizeBytes() * count;
165 data1DChecks(off, count, d.length, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800166 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Sams768bc022009-09-21 19:41:04 -0700167 }
168 public void subData1D(int off, int count, float[] d) {
169 int dataSize = mType.mElement.getSizeBytes() * count;
170 data1DChecks(off, count, d.length * 4, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800171 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Samsb8c5a842009-07-31 20:40:47 -0700172 }
173
Jason Sams768bc022009-09-21 19:41:04 -0700174
Jason Samsb8c5a842009-07-31 20:40:47 -0700175 public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800176 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800177 mRS.nAllocationSubData2D(getID(), xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700178 }
179
180 public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800181 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800182 mRS.nAllocationSubData2D(getID(), xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700183 }
184
Jason Sams40a29e82009-08-10 14:55:26 -0700185 public void readData(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800186 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800187 mRS.nAllocationRead(getID(), d);
Jason Sams40a29e82009-08-10 14:55:26 -0700188 }
189
190 public void readData(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800191 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800192 mRS.nAllocationRead(getID(), d);
Jason Sams40a29e82009-08-10 14:55:26 -0700193 }
194
Jason Sams31a7e422010-10-26 13:09:17 -0700195 public synchronized void resize(int dimX) {
Jason Sams5edc6082010-10-05 13:32:49 -0700196 if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800197 throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
Jason Sams5edc6082010-10-05 13:32:49 -0700198 }
Jason Sams06d69de2010-11-09 17:11:40 -0800199 mRS.nAllocationResize1D(getID(), dimX);
Jason Samsd26297f2010-11-01 16:08:59 -0700200 mRS.finish(); // Necessary because resize is fifoed and update is async.
Jason Sams31a7e422010-10-26 13:09:17 -0700201
Jason Sams06d69de2010-11-09 17:11:40 -0800202 int typeID = mRS.nAllocationGetType(getID());
Jason Sams31a7e422010-10-26 13:09:17 -0700203 mType = new Type(typeID, mRS);
204 mType.updateFromNative();
Jason Sams5edc6082010-10-05 13:32:49 -0700205 }
206
207 /*
208 public void resize(int dimX, int dimY) {
209 if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800210 throw new RSIllegalStateException("Resize only support for 2D allocations at this time.");
Jason Sams5edc6082010-10-05 13:32:49 -0700211 }
212 if (mType.getY() == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800213 throw new RSIllegalStateException("Resize only support for 2D allocations at this time.");
Jason Sams5edc6082010-10-05 13:32:49 -0700214 }
Jason Sams06d69de2010-11-09 17:11:40 -0800215 mRS.nAllocationResize2D(getID(), dimX, dimY);
Jason Sams5edc6082010-10-05 13:32:49 -0700216 }
217 */
Jason Sams40a29e82009-08-10 14:55:26 -0700218
Jason Samsb8c5a842009-07-31 20:40:47 -0700219 public class Adapter1D extends BaseObj {
220 Adapter1D(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700221 super(id, rs);
Jason Samsb8c5a842009-07-31 20:40:47 -0700222 }
223
Jason Samsb8c5a842009-07-31 20:40:47 -0700224 public void setConstraint(Dimension dim, int value) {
Jason Sams771bebb2009-12-07 12:40:12 -0800225 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800226 mRS.nAdapter1DSetConstraint(getID(), dim.mID, value);
Jason Samsb8c5a842009-07-31 20:40:47 -0700227 }
228
229 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800230 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800231 mRS.nAdapter1DData(getID(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700232 }
233
Jason Samsb8c5a842009-07-31 20:40:47 -0700234 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800235 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800236 mRS.nAdapter1DData(getID(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700237 }
238
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700239 public void subData(int off, int count, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800240 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800241 mRS.nAdapter1DSubData(getID(), off, count, d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700242 }
243
Jason Samsb8c5a842009-07-31 20:40:47 -0700244 public void subData(int off, int count, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800245 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800246 mRS.nAdapter1DSubData(getID(), off, count, d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700247 }
248 }
249
250 public Adapter1D createAdapter1D() {
Jason Sams771bebb2009-12-07 12:40:12 -0800251 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700252 int id = mRS.nAdapter1DCreate();
Jason Sams718cd1f2009-12-23 14:35:29 -0800253 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800254 throw new RSRuntimeException("Adapter creation failed.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700255 }
Jason Sams06d69de2010-11-09 17:11:40 -0800256 mRS.nAdapter1DBindAllocation(id, getID());
Jason Samsb8c5a842009-07-31 20:40:47 -0700257 return new Adapter1D(id, mRS);
258 }
259
260
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700261 public class Adapter2D extends BaseObj {
262 Adapter2D(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700263 super(id, rs);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700264 }
265
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700266 public void setConstraint(Dimension dim, int value) {
Jason Sams771bebb2009-12-07 12:40:12 -0800267 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800268 mRS.nAdapter2DSetConstraint(getID(), dim.mID, value);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700269 }
270
271 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800272 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800273 mRS.nAdapter2DData(getID(), d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700274 }
275
276 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800277 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800278 mRS.nAdapter2DData(getID(), d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700279 }
280
281 public void subData(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800282 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800283 mRS.nAdapter2DSubData(getID(), xoff, yoff, w, h, d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700284 }
285
286 public void subData(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800287 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800288 mRS.nAdapter2DSubData(getID(), xoff, yoff, w, h, d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700289 }
290 }
291
292 public Adapter2D createAdapter2D() {
Jason Sams771bebb2009-12-07 12:40:12 -0800293 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700294 int id = mRS.nAdapter2DCreate();
Jason Sams718cd1f2009-12-23 14:35:29 -0800295 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800296 throw new RSRuntimeException("allocation failed.");
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700297 }
Jason Sams06d69de2010-11-09 17:11:40 -0800298 mRS.nAdapter2DBindAllocation(id, getID());
299 if(id == 0) {
300 throw new RSRuntimeException("Adapter creation failed.");
301 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700302 return new Adapter2D(id, mRS);
303 }
304
Jason Samsb8c5a842009-07-31 20:40:47 -0700305
306 // creation
307
308 private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
309 static {
310 mBitmapOptions.inScaled = false;
311 }
312
Jason Sams06d69de2010-11-09 17:11:40 -0800313 static public Allocation createTyped(RenderScript rs, Type type) {
Jason Sams1bada8c2009-08-09 17:01:55 -0700314
Jason Sams771bebb2009-12-07 12:40:12 -0800315 rs.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800316 if(type.getID() == 0) {
317 throw new RSInvalidStateException("Bad Type");
Jason Sams1bada8c2009-08-09 17:01:55 -0700318 }
Jason Sams06d69de2010-11-09 17:11:40 -0800319 int id = rs.nAllocationCreateTyped(type.getID());
320 if(id == 0) {
321 throw new RSRuntimeException("Allocation creation failed.");
322 }
Jason Sams43ee06852009-08-12 17:54:11 -0700323 return new Allocation(id, rs, type);
Jason Samsb8c5a842009-07-31 20:40:47 -0700324 }
325
Jason Sams1bada8c2009-08-09 17:01:55 -0700326 static public Allocation createSized(RenderScript rs, Element e, int count)
327 throws IllegalArgumentException {
328
Jason Sams771bebb2009-12-07 12:40:12 -0800329 rs.validate();
Jason Sams768bc022009-09-21 19:41:04 -0700330 Type.Builder b = new Type.Builder(rs, e);
331 b.add(Dimension.X, count);
332 Type t = b.create();
333
Jason Sams06d69de2010-11-09 17:11:40 -0800334 int id = rs.nAllocationCreateTyped(t.getID());
Jason Samsea84a7c2009-09-04 14:42:41 -0700335 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800336 throw new RSRuntimeException("Allocation creation failed.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700337 }
Jason Sams768bc022009-09-21 19:41:04 -0700338 return new Allocation(id, rs, t);
Jason Samsb8c5a842009-07-31 20:40:47 -0700339 }
340
Jason Sams8a647432010-03-01 15:31:04 -0800341 static private Element elementFromBitmap(RenderScript rs, Bitmap b) {
342 final Bitmap.Config bc = b.getConfig();
343 if (bc == Bitmap.Config.ALPHA_8) {
344 return Element.A_8(rs);
345 }
346 if (bc == Bitmap.Config.ARGB_4444) {
347 return Element.RGBA_4444(rs);
348 }
349 if (bc == Bitmap.Config.ARGB_8888) {
350 return Element.RGBA_8888(rs);
351 }
352 if (bc == Bitmap.Config.RGB_565) {
353 return Element.RGB_565(rs);
354 }
Jason Sams06d69de2010-11-09 17:11:40 -0800355 throw new RSInvalidStateException("Bad bitmap type.");
Jason Sams8a647432010-03-01 15:31:04 -0800356 }
357
358 static private Type typeFromBitmap(RenderScript rs, Bitmap b) {
359 Element e = elementFromBitmap(rs, b);
360 Type.Builder tb = new Type.Builder(rs, e);
361 tb.add(Dimension.X, b.getWidth());
362 tb.add(Dimension.Y, b.getHeight());
363 return tb.create();
364 }
365
Jason Sams06d69de2010-11-09 17:11:40 -0800366 static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips) {
Jason Samsb8c5a842009-07-31 20:40:47 -0700367
Jason Sams771bebb2009-12-07 12:40:12 -0800368 rs.validate();
Jason Sams8a647432010-03-01 15:31:04 -0800369 Type t = typeFromBitmap(rs, b);
370
Jason Sams06d69de2010-11-09 17:11:40 -0800371 int id = rs.nAllocationCreateFromBitmap(dstFmt.getID(), genMips, b);
Jason Sams718cd1f2009-12-23 14:35:29 -0800372 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800373 throw new RSRuntimeException("Load failed.");
Jason Sams718cd1f2009-12-23 14:35:29 -0800374 }
Jason Sams8a647432010-03-01 15:31:04 -0800375 return new Allocation(id, rs, t);
376 }
377
Jason Sams06d69de2010-11-09 17:11:40 -0800378 static public Allocation createBitmapRef(RenderScript rs, Bitmap b) {
Jason Sams8a647432010-03-01 15:31:04 -0800379
380 rs.validate();
381 Type t = typeFromBitmap(rs, b);
382
383 int id = rs.nAllocationCreateBitmapRef(t.getID(), b);
384 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800385 throw new RSRuntimeException("Load failed.");
Jason Sams8a647432010-03-01 15:31:04 -0800386 }
387
388 Allocation a = new Allocation(id, rs, t);
389 a.mBitmap = b;
390 return a;
Jason Samsb8c5a842009-07-31 20:40:47 -0700391 }
392
Jason Sams06d69de2010-11-09 17:11:40 -0800393 static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips) {
Jason Samsb8c5a842009-07-31 20:40:47 -0700394
Jason Sams771bebb2009-12-07 12:40:12 -0800395 rs.validate();
Romain Guy650a3eb2009-08-31 14:06:43 -0700396 InputStream is = null;
397 try {
398 final TypedValue value = new TypedValue();
399 is = res.openRawResource(id, value);
400
401 int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
Jason Sams06d69de2010-11-09 17:11:40 -0800402 int aId = rs.nAllocationCreateFromAssetStream(dstFmt.getID(), genMips, asset);
Romain Guy650a3eb2009-08-31 14:06:43 -0700403
Jason Sams06d69de2010-11-09 17:11:40 -0800404 if (aId == 0) {
405 throw new RSRuntimeException("Load failed.");
Jason Sams718cd1f2009-12-23 14:35:29 -0800406 }
Jason Sams06d69de2010-11-09 17:11:40 -0800407 return new Allocation(aId, rs, null);
Romain Guy650a3eb2009-08-31 14:06:43 -0700408 } finally {
409 if (is != null) {
410 try {
411 is.close();
412 } catch (IOException e) {
413 // Ignore
414 }
415 }
416 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700417 }
418
Jason Sams06d69de2010-11-09 17:11:40 -0800419 static public Allocation createFromString(RenderScript rs, String str) {
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700420 byte[] allocArray = null;
421 try {
422 allocArray = str.getBytes("UTF-8");
423 Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length);
424 alloc.data(allocArray);
425 return alloc;
426 }
427 catch (Exception e) {
Jason Sams06d69de2010-11-09 17:11:40 -0800428 throw new RSRuntimeException("Could not convert string to utf-8.");
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700429 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700430 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700431}
432
433