blob: bad1208e6483cb361218131824478966f1e46cb5 [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
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -080037 public enum CubemapLayout {
38 VERTICAL_FACE_LIST (0),
39 HORIZONTAL_FACE_LIST (1),
40 VERTICAL_CROSS (2),
41 HORIZONTAL_CROSS (3);
42
43 int mID;
44 CubemapLayout(int id) {
45 mID = id;
46 }
47 }
48
Jason Sams43ee06852009-08-12 17:54:11 -070049 Allocation(int id, RenderScript rs, Type t) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -070050 super(id, rs);
Jason Sams43ee06852009-08-12 17:54:11 -070051 mType = t;
Jason Samsb8c5a842009-07-31 20:40:47 -070052 }
53
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -070054 Allocation(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -070055 super(id, rs);
Alex Sakhartchouk80a4c2c2010-07-12 15:50:32 -070056 }
57
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -070058 @Override
59 void updateFromNative() {
Jason Sams06d69de2010-11-09 17:11:40 -080060 super.updateFromNative();
61 int typeID = mRS.nAllocationGetType(getID());
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -070062 if(typeID != 0) {
63 mType = new Type(typeID, mRS);
64 mType.updateFromNative();
65 }
66 }
67
Jason Samsea87e962010-01-12 12:12:28 -080068 public Type getType() {
69 return mType;
70 }
71
Jason Samsb8c5a842009-07-31 20:40:47 -070072 public void uploadToTexture(int baseMipLevel) {
Jason Sams771bebb2009-12-07 12:40:12 -080073 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -080074 mRS.nAllocationUploadToTexture(getID(), false, baseMipLevel);
Jason Samsc2908e62010-02-23 17:44:28 -080075 }
76
77 public void uploadToTexture(boolean genMips, int baseMipLevel) {
78 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -080079 mRS.nAllocationUploadToTexture(getID(), genMips, baseMipLevel);
Jason Samsb8c5a842009-07-31 20:40:47 -070080 }
81
Jason Sams07ae4062009-08-27 20:23:34 -070082 public void uploadToBufferObject() {
Jason Sams771bebb2009-12-07 12:40:12 -080083 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -080084 mRS.nAllocationUploadToBufferObject(getID());
Jason Sams07ae4062009-08-27 20:23:34 -070085 }
86
Jason Samsb8c5a842009-07-31 20:40:47 -070087 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080088 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070089 subData1D(0, mType.getElementCount(), d);
90 }
91 public void data(short[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080092 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070093 subData1D(0, mType.getElementCount(), d);
94 }
95 public void data(byte[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -080096 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -070097 subData1D(0, mType.getElementCount(), d);
98 }
99 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800100 mRS.validate();
Jason Sams768bc022009-09-21 19:41:04 -0700101 subData1D(0, mType.getElementCount(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700102 }
103
Jason Sams06d69de2010-11-09 17:11:40 -0800104 public void updateFromBitmap(Bitmap b) {
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700105
106 mRS.validate();
107 if(mType.getX() != b.getWidth() ||
108 mType.getY() != b.getHeight()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800109 throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700110 }
111
Jason Sams06d69de2010-11-09 17:11:40 -0800112 mRS.nAllocationUpdateFromBitmap(getID(), b);
Alex Sakhartchouk26ae3902010-10-11 12:35:15 -0700113 }
114
Jason Sams49bdaf02010-08-31 13:50:42 -0700115 public void subData(int xoff, FieldPacker fp) {
Jason Samsa70f4162010-03-26 15:33:42 -0700116 int eSize = mType.mElement.getSizeBytes();
117 final byte[] data = fp.getData();
118
119 int count = data.length / eSize;
120 if ((eSize * count) != data.length) {
Jason Sams06d69de2010-11-09 17:11:40 -0800121 throw new RSIllegalArgumentException("Field packer length " + data.length +
Jason Samsa70f4162010-03-26 15:33:42 -0700122 " not divisible by element size " + eSize + ".");
123 }
Jason Sams49bdaf02010-08-31 13:50:42 -0700124 data1DChecks(xoff, count, data.length, data.length);
Jason Sams06d69de2010-11-09 17:11:40 -0800125 mRS.nAllocationSubData1D(getID(), xoff, count, data, data.length);
Jason Sams49bdaf02010-08-31 13:50:42 -0700126 }
127
128
129 public void subElementData(int xoff, int component_number, FieldPacker fp) {
130 if (component_number >= mType.mElement.mElements.length) {
Jason Sams06d69de2010-11-09 17:11:40 -0800131 throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
Jason Sams49bdaf02010-08-31 13:50:42 -0700132 }
133 if(xoff < 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800134 throw new RSIllegalArgumentException("Offset must be >= 0.");
Jason Sams49bdaf02010-08-31 13:50:42 -0700135 }
136
137 final byte[] data = fp.getData();
138 int eSize = mType.mElement.mElements[component_number].getSizeBytes();
139
140 if (data.length != eSize) {
Jason Sams06d69de2010-11-09 17:11:40 -0800141 throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
Jason Sams49bdaf02010-08-31 13:50:42 -0700142 " does not match component size " + eSize + ".");
143 }
144
Jason Sams06d69de2010-11-09 17:11:40 -0800145 mRS.nAllocationSubElementData1D(getID(), xoff, component_number, data, data.length);
Jason Samsa70f4162010-03-26 15:33:42 -0700146 }
147
Jason Sams768bc022009-09-21 19:41:04 -0700148 private void data1DChecks(int off, int count, int len, int dataSize) {
Jason Sams771bebb2009-12-07 12:40:12 -0800149 mRS.validate();
Jason Samsa70f4162010-03-26 15:33:42 -0700150 if(off < 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800151 throw new RSIllegalArgumentException("Offset must be >= 0.");
Jason Samsa70f4162010-03-26 15:33:42 -0700152 }
153 if(count < 1) {
Jason Sams06d69de2010-11-09 17:11:40 -0800154 throw new RSIllegalArgumentException("Count must be >= 1.");
Jason Samsa70f4162010-03-26 15:33:42 -0700155 }
156 if((off + count) > mType.getElementCount()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800157 throw new RSIllegalArgumentException("Overflow, Available count " + mType.getElementCount() +
Jason Samsa70f4162010-03-26 15:33:42 -0700158 ", got " + count + " at offset " + off + ".");
Jason Sams07ae4062009-08-27 20:23:34 -0700159 }
Jason Sams768bc022009-09-21 19:41:04 -0700160 if((len) < dataSize) {
Jason Sams06d69de2010-11-09 17:11:40 -0800161 throw new RSIllegalArgumentException("Array too small for allocation type.");
Jason Sams768bc022009-09-21 19:41:04 -0700162 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700163 }
164
165 public void subData1D(int off, int count, int[] d) {
Jason Sams768bc022009-09-21 19:41:04 -0700166 int dataSize = mType.mElement.getSizeBytes() * count;
167 data1DChecks(off, count, d.length * 4, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800168 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Sams768bc022009-09-21 19:41:04 -0700169 }
170 public void subData1D(int off, int count, short[] d) {
171 int dataSize = mType.mElement.getSizeBytes() * count;
172 data1DChecks(off, count, d.length * 2, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800173 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Sams768bc022009-09-21 19:41:04 -0700174 }
175 public void subData1D(int off, int count, byte[] d) {
176 int dataSize = mType.mElement.getSizeBytes() * count;
177 data1DChecks(off, count, d.length, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800178 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Sams768bc022009-09-21 19:41:04 -0700179 }
180 public void subData1D(int off, int count, float[] d) {
181 int dataSize = mType.mElement.getSizeBytes() * count;
182 data1DChecks(off, count, d.length * 4, dataSize);
Jason Sams06d69de2010-11-09 17:11:40 -0800183 mRS.nAllocationSubData1D(getID(), off, count, d, dataSize);
Jason Samsb8c5a842009-07-31 20:40:47 -0700184 }
185
Jason Sams768bc022009-09-21 19:41:04 -0700186
Jason Samsb8c5a842009-07-31 20:40:47 -0700187 public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800188 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800189 mRS.nAllocationSubData2D(getID(), xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700190 }
191
192 public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800193 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800194 mRS.nAllocationSubData2D(getID(), xoff, yoff, w, h, d, d.length * 4);
Jason Samsb8c5a842009-07-31 20:40:47 -0700195 }
196
Jason Sams40a29e82009-08-10 14:55:26 -0700197 public void readData(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800198 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800199 mRS.nAllocationRead(getID(), d);
Jason Sams40a29e82009-08-10 14:55:26 -0700200 }
201
202 public void readData(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800203 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800204 mRS.nAllocationRead(getID(), d);
Jason Sams40a29e82009-08-10 14:55:26 -0700205 }
206
Jason Sams31a7e422010-10-26 13:09:17 -0700207 public synchronized void resize(int dimX) {
Jason Sams5edc6082010-10-05 13:32:49 -0700208 if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800209 throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
Jason Sams5edc6082010-10-05 13:32:49 -0700210 }
Jason Sams06d69de2010-11-09 17:11:40 -0800211 mRS.nAllocationResize1D(getID(), dimX);
Jason Samsd26297f2010-11-01 16:08:59 -0700212 mRS.finish(); // Necessary because resize is fifoed and update is async.
Jason Sams31a7e422010-10-26 13:09:17 -0700213
Jason Sams06d69de2010-11-09 17:11:40 -0800214 int typeID = mRS.nAllocationGetType(getID());
Jason Sams31a7e422010-10-26 13:09:17 -0700215 mType = new Type(typeID, mRS);
216 mType.updateFromNative();
Jason Sams5edc6082010-10-05 13:32:49 -0700217 }
218
219 /*
220 public void resize(int dimX, int dimY) {
221 if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) {
Jason Sams06d69de2010-11-09 17:11:40 -0800222 throw new RSIllegalStateException("Resize only support for 2D allocations at this time.");
Jason Sams5edc6082010-10-05 13:32:49 -0700223 }
224 if (mType.getY() == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800225 throw new RSIllegalStateException("Resize only support for 2D allocations at this time.");
Jason Sams5edc6082010-10-05 13:32:49 -0700226 }
Jason Sams06d69de2010-11-09 17:11:40 -0800227 mRS.nAllocationResize2D(getID(), dimX, dimY);
Jason Sams5edc6082010-10-05 13:32:49 -0700228 }
229 */
Jason Sams40a29e82009-08-10 14:55:26 -0700230
Jason Samsb8c5a842009-07-31 20:40:47 -0700231 public class Adapter1D extends BaseObj {
232 Adapter1D(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700233 super(id, rs);
Jason Samsb8c5a842009-07-31 20:40:47 -0700234 }
235
Jason Samsb8c5a842009-07-31 20:40:47 -0700236 public void setConstraint(Dimension dim, int value) {
Jason Sams771bebb2009-12-07 12:40:12 -0800237 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800238 mRS.nAdapter1DSetConstraint(getID(), dim.mID, value);
Jason Samsb8c5a842009-07-31 20:40:47 -0700239 }
240
241 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800242 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800243 mRS.nAdapter1DData(getID(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700244 }
245
Jason Samsb8c5a842009-07-31 20:40:47 -0700246 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800247 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800248 mRS.nAdapter1DData(getID(), d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700249 }
250
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700251 public void subData(int off, int count, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800252 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800253 mRS.nAdapter1DSubData(getID(), off, count, d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700254 }
255
Jason Samsb8c5a842009-07-31 20:40:47 -0700256 public void subData(int off, int count, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800257 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800258 mRS.nAdapter1DSubData(getID(), off, count, d);
Jason Samsb8c5a842009-07-31 20:40:47 -0700259 }
260 }
261
262 public Adapter1D createAdapter1D() {
Jason Sams771bebb2009-12-07 12:40:12 -0800263 mRS.validate();
Jason Samsb8c5a842009-07-31 20:40:47 -0700264 int id = mRS.nAdapter1DCreate();
Jason Sams718cd1f2009-12-23 14:35:29 -0800265 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800266 throw new RSRuntimeException("Adapter creation failed.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700267 }
Jason Sams06d69de2010-11-09 17:11:40 -0800268 mRS.nAdapter1DBindAllocation(id, getID());
Jason Samsb8c5a842009-07-31 20:40:47 -0700269 return new Adapter1D(id, mRS);
270 }
271
272
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700273 public class Adapter2D extends BaseObj {
274 Adapter2D(int id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700275 super(id, rs);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700276 }
277
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700278 public void setConstraint(Dimension dim, int value) {
Jason Sams771bebb2009-12-07 12:40:12 -0800279 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800280 mRS.nAdapter2DSetConstraint(getID(), dim.mID, value);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700281 }
282
283 public void data(int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800284 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800285 mRS.nAdapter2DData(getID(), d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700286 }
287
288 public void data(float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800289 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800290 mRS.nAdapter2DData(getID(), d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700291 }
292
293 public void subData(int xoff, int yoff, int w, int h, int[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800294 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800295 mRS.nAdapter2DSubData(getID(), xoff, yoff, w, h, d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700296 }
297
298 public void subData(int xoff, int yoff, int w, int h, float[] d) {
Jason Sams771bebb2009-12-07 12:40:12 -0800299 mRS.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800300 mRS.nAdapter2DSubData(getID(), xoff, yoff, w, h, d);
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700301 }
302 }
303
304 public Adapter2D createAdapter2D() {
Jason Sams771bebb2009-12-07 12:40:12 -0800305 mRS.validate();
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700306 int id = mRS.nAdapter2DCreate();
Jason Sams718cd1f2009-12-23 14:35:29 -0800307 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800308 throw new RSRuntimeException("allocation failed.");
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700309 }
Jason Sams06d69de2010-11-09 17:11:40 -0800310 mRS.nAdapter2DBindAllocation(id, getID());
311 if(id == 0) {
312 throw new RSRuntimeException("Adapter creation failed.");
313 }
Jason Samsbd1c3ad2009-08-03 16:03:08 -0700314 return new Adapter2D(id, mRS);
315 }
316
Jason Samsb8c5a842009-07-31 20:40:47 -0700317
318 // creation
319
320 private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
321 static {
322 mBitmapOptions.inScaled = false;
323 }
324
Jason Sams06d69de2010-11-09 17:11:40 -0800325 static public Allocation createTyped(RenderScript rs, Type type) {
Jason Sams1bada8c2009-08-09 17:01:55 -0700326
Jason Sams771bebb2009-12-07 12:40:12 -0800327 rs.validate();
Jason Sams06d69de2010-11-09 17:11:40 -0800328 if(type.getID() == 0) {
329 throw new RSInvalidStateException("Bad Type");
Jason Sams1bada8c2009-08-09 17:01:55 -0700330 }
Jason Sams06d69de2010-11-09 17:11:40 -0800331 int id = rs.nAllocationCreateTyped(type.getID());
332 if(id == 0) {
333 throw new RSRuntimeException("Allocation creation failed.");
334 }
Jason Sams43ee06852009-08-12 17:54:11 -0700335 return new Allocation(id, rs, type);
Jason Samsb8c5a842009-07-31 20:40:47 -0700336 }
337
Jason Sams1bada8c2009-08-09 17:01:55 -0700338 static public Allocation createSized(RenderScript rs, Element e, int count)
339 throws IllegalArgumentException {
340
Jason Sams771bebb2009-12-07 12:40:12 -0800341 rs.validate();
Jason Sams768bc022009-09-21 19:41:04 -0700342 Type.Builder b = new Type.Builder(rs, e);
343 b.add(Dimension.X, count);
344 Type t = b.create();
345
Jason Sams06d69de2010-11-09 17:11:40 -0800346 int id = rs.nAllocationCreateTyped(t.getID());
Jason Samsea84a7c2009-09-04 14:42:41 -0700347 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800348 throw new RSRuntimeException("Allocation creation failed.");
Jason Samsb8c5a842009-07-31 20:40:47 -0700349 }
Jason Sams768bc022009-09-21 19:41:04 -0700350 return new Allocation(id, rs, t);
Jason Samsb8c5a842009-07-31 20:40:47 -0700351 }
352
Jason Sams8a647432010-03-01 15:31:04 -0800353 static private Element elementFromBitmap(RenderScript rs, Bitmap b) {
354 final Bitmap.Config bc = b.getConfig();
355 if (bc == Bitmap.Config.ALPHA_8) {
356 return Element.A_8(rs);
357 }
358 if (bc == Bitmap.Config.ARGB_4444) {
359 return Element.RGBA_4444(rs);
360 }
361 if (bc == Bitmap.Config.ARGB_8888) {
362 return Element.RGBA_8888(rs);
363 }
364 if (bc == Bitmap.Config.RGB_565) {
365 return Element.RGB_565(rs);
366 }
Jeff Sharkey4bd1a3d2010-11-16 13:46:34 -0800367 throw new RSInvalidStateException("Bad bitmap type: " + bc);
Jason Sams8a647432010-03-01 15:31:04 -0800368 }
369
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800370 static private Type typeFromBitmap(RenderScript rs, Bitmap b, boolean mip) {
Jason Sams8a647432010-03-01 15:31:04 -0800371 Element e = elementFromBitmap(rs, b);
372 Type.Builder tb = new Type.Builder(rs, e);
373 tb.add(Dimension.X, b.getWidth());
374 tb.add(Dimension.Y, b.getHeight());
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800375 if (mip) {
376 tb.add(Dimension.LOD, 1);
377 }
Jason Sams8a647432010-03-01 15:31:04 -0800378 return tb.create();
379 }
380
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800381 static public Allocation createFromBitmap(RenderScript rs, Bitmap b,
382 Element dstFmt, boolean genMips) {
Jason Sams771bebb2009-12-07 12:40:12 -0800383 rs.validate();
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800384 Type t = typeFromBitmap(rs, b, genMips);
Jason Sams8a647432010-03-01 15:31:04 -0800385
Jason Sams06d69de2010-11-09 17:11:40 -0800386 int id = rs.nAllocationCreateFromBitmap(dstFmt.getID(), genMips, b);
Jason Sams718cd1f2009-12-23 14:35:29 -0800387 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800388 throw new RSRuntimeException("Load failed.");
Jason Sams718cd1f2009-12-23 14:35:29 -0800389 }
Jason Sams8a647432010-03-01 15:31:04 -0800390 return new Allocation(id, rs, t);
391 }
392
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800393 static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b,
394 Element dstFmt,
395 boolean genMips,
396 CubemapLayout layout) {
397 rs.validate();
398 int height = b.getHeight();
399 int width = b.getWidth();
400
401 if (layout != CubemapLayout.VERTICAL_FACE_LIST) {
402 throw new RSIllegalArgumentException("Only vertical face list supported");
403 }
404 if (height % 6 != 0) {
405 throw new RSIllegalArgumentException("Cubemap height must be multiple of 6");
406 }
407 if (height / 6 != width) {
408 throw new RSIllegalArgumentException("Only square cobe map faces supported");
409 }
410 boolean isPow2 = (width & (width - 1)) == 0;
411 if (!isPow2) {
412 throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
413 }
414
415 Element e = elementFromBitmap(rs, b);
416 Type.Builder tb = new Type.Builder(rs, e);
417 tb.add(Dimension.X, width);
418 tb.add(Dimension.Y, width);
419 tb.add(Dimension.FACE, 1);
420 if (genMips) {
421 tb.add(Dimension.LOD, 1);
422 }
423 Type t = tb.create();
424
425 int id = rs.nAllocationCubeCreateFromBitmap(dstFmt.getID(), genMips, b);
426 if(id == 0) {
427 throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
428 }
429 return new Allocation(id, rs, t);
430 }
431
Jason Sams06d69de2010-11-09 17:11:40 -0800432 static public Allocation createBitmapRef(RenderScript rs, Bitmap b) {
Jason Sams8a647432010-03-01 15:31:04 -0800433
434 rs.validate();
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800435 Type t = typeFromBitmap(rs, b, false);
Jason Sams8a647432010-03-01 15:31:04 -0800436
437 int id = rs.nAllocationCreateBitmapRef(t.getID(), b);
438 if(id == 0) {
Jason Sams06d69de2010-11-09 17:11:40 -0800439 throw new RSRuntimeException("Load failed.");
Jason Sams8a647432010-03-01 15:31:04 -0800440 }
441
442 Allocation a = new Allocation(id, rs, t);
443 a.mBitmap = b;
444 return a;
Jason Samsb8c5a842009-07-31 20:40:47 -0700445 }
446
Jason Sams06d69de2010-11-09 17:11:40 -0800447 static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips) {
Jason Samsb8c5a842009-07-31 20:40:47 -0700448
Jason Sams771bebb2009-12-07 12:40:12 -0800449 rs.validate();
Romain Guy650a3eb2009-08-31 14:06:43 -0700450 InputStream is = null;
451 try {
452 final TypedValue value = new TypedValue();
453 is = res.openRawResource(id, value);
454
455 int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
Jason Sams06d69de2010-11-09 17:11:40 -0800456 int aId = rs.nAllocationCreateFromAssetStream(dstFmt.getID(), genMips, asset);
Romain Guy650a3eb2009-08-31 14:06:43 -0700457
Jason Sams06d69de2010-11-09 17:11:40 -0800458 if (aId == 0) {
459 throw new RSRuntimeException("Load failed.");
Jason Sams718cd1f2009-12-23 14:35:29 -0800460 }
Alex Sakhartchouk67f2e442010-11-18 15:22:43 -0800461 Allocation alloc = new Allocation(aId, rs, null);
462 alloc.updateFromNative();
463 return alloc;
Romain Guy650a3eb2009-08-31 14:06:43 -0700464 } finally {
465 if (is != null) {
466 try {
467 is.close();
468 } catch (IOException e) {
469 // Ignore
470 }
471 }
472 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700473 }
474
Jason Sams06d69de2010-11-09 17:11:40 -0800475 static public Allocation createFromString(RenderScript rs, String str) {
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700476 byte[] allocArray = null;
477 try {
478 allocArray = str.getBytes("UTF-8");
479 Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length);
480 alloc.data(allocArray);
481 return alloc;
482 }
483 catch (Exception e) {
Jason Sams06d69de2010-11-09 17:11:40 -0800484 throw new RSRuntimeException("Could not convert string to utf-8.");
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700485 }
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700486 }
Jason Samsb8c5a842009-07-31 20:40:47 -0700487}
488
489