Allocation.java revision dfac814c18f73dd7289f9927edca3e3b6ec6bc00
1b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/* 2b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Copyright (C) 2008 The Android Open Source Project 3b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 4b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * you may not use this file except in compliance with the License. 6b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * You may obtain a copy of the License at 7b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 8b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 10b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Unless required by applicable law or agreed to in writing, software 11b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * See the License for the specific language governing permissions and 14b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * limitations under the License. 15b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams */ 16b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 17b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspackage android.renderscript; 18b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 19b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport java.io.IOException; 20b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport java.io.InputStream; 21b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 22b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.content.res.Resources; 23650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.content.res.AssetManager; 24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.Bitmap; 25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.BitmapFactory; 26b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.util.Log; 27650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.util.TypedValue; 28b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 29b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/** 30b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * @hide 31b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 32b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/ 33b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Allocation extends BaseObj { 3443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams Type mType; 358a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Bitmap mBitmap; 3643ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 3743ee06857bb7f99446d1d84f8789016c5d105558Jason Sams Allocation(int id, RenderScript rs, Type t) { 38b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams super(rs); 39b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mID = id; 4043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams mType = t; 41b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 42b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 4380a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk Allocation(int id, RenderScript rs) { 4480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk super(rs); 4580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk mID = id; 4680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk } 4780a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk 48dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk @Override 49dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk void updateFromNative() { 50dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mRS.validate(); 51dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk int typeID = mRS.nAllocationGetType(mID); 52dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk if(typeID != 0) { 53dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType = new Type(typeID, mRS); 54dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType.updateFromNative(); 55dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 56dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 57dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 58ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public Type getType() { 59ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mType; 60ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams } 61ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams 62b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void uploadToTexture(int baseMipLevel) { 63771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 64c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.nAllocationUploadToTexture(mID, false, baseMipLevel); 65c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams } 66c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams 67c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams public void uploadToTexture(boolean genMips, int baseMipLevel) { 68c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.validate(); 69c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.nAllocationUploadToTexture(mID, genMips, baseMipLevel); 70b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 71b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 7207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams public void uploadToBufferObject() { 73771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 7407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams mRS.nAllocationUploadToBufferObject(mID); 7507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 7607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams 77b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(int[] d) { 78771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 79768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 80768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 81768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void data(short[] d) { 82771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 84768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 85768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void data(byte[] d) { 86771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 87768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 88b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 89b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(float[] d) { 90771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 91768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 92b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 93b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 94a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams public void subData(int off, FieldPacker fp) { 95a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int eSize = mType.mElement.getSizeBytes(); 96a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams final byte[] data = fp.getData(); 97a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 98a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int count = data.length / eSize; 99a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if ((eSize * count) != data.length) { 100a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Field packer length " + data.length + 101a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams " not divisible by element size " + eSize + "."); 102a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 103a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams data1DChecks(off, count, data.length, data.length); 104a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams mRS.nAllocationSubData1D(mID, off, count, data, data.length); 105a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 106a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 107768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams private void data1DChecks(int off, int count, int len, int dataSize) { 108771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 109a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(off < 0) { 110a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Offset must be >= 0."); 111a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 112a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(count < 1) { 113a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Count must be >= 1."); 114a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 115a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if((off + count) > mType.getElementCount()) { 116a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Overflow, Available count " + mType.getElementCount() + 117a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams ", got " + count + " at offset " + off + "."); 118768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 119768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if((len) < dataSize) { 120768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams throw new IllegalArgumentException("Array too small for allocation type."); 121768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 122b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 123b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 124768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, int[] d) { 125768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 126768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 127768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 128768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 129768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, short[] d) { 130768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 131768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 2, dataSize); 132768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 133768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 134768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, byte[] d) { 135768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 136768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length, dataSize); 137768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 138768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 139b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData1D(int off, int count, float[] d) { 140768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 141768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 142768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 143b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 144b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 145768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 146768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 147b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData2D(int xoff, int yoff, int w, int h, int[] d) { 148771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 14907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4); 150b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 151b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 152b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData2D(int xoff, int yoff, int w, int h, float[] d) { 153771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 15407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4); 155b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 156b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 15740a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams public void readData(int[] d) { 158771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 15940a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams mRS.nAllocationRead(mID, d); 16040a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 16140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 16240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams public void readData(float[] d) { 163771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 16440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams mRS.nAllocationRead(mID, d); 16540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 16640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 16743ee06857bb7f99446d1d84f8789016c5d105558Jason Sams public void data(Object o) { 168771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 1692525a815220652b37e2e390fe8c62394a6d0e574Jason Sams mRS.nAllocationSubDataFromObject(mID, mType, 0, o); 17043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams } 17143ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 1725f43fd289abbd5380b6068766daf721b555d0053Jason Sams public void read(Object o) { 173771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 1745f43fd289abbd5380b6068766daf721b555d0053Jason Sams mRS.nAllocationSubReadFromObject(mID, mType, 0, o); 1755f43fd289abbd5380b6068766daf721b555d0053Jason Sams } 1765f43fd289abbd5380b6068766daf721b555d0053Jason Sams 1772525a815220652b37e2e390fe8c62394a6d0e574Jason Sams public void subData(int offset, Object o) { 178771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 1792525a815220652b37e2e390fe8c62394a6d0e574Jason Sams mRS.nAllocationSubDataFromObject(mID, mType, offset, o); 1802525a815220652b37e2e390fe8c62394a6d0e574Jason Sams } 18140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 182b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public class Adapter1D extends BaseObj { 183b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams Adapter1D(int id, RenderScript rs) { 184b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams super(rs); 185b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mID = id; 186b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 187b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 188b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void setConstraint(Dimension dim, int value) { 189771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 190b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DSetConstraint(mID, dim.mID, value); 191b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 192b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 193b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(int[] d) { 194771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 195b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DData(mID, d); 196b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 197b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 198b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(float[] d) { 199771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 200b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DData(mID, d); 201b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 202b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 203bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int off, int count, int[] d) { 204771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 205bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter1DSubData(mID, off, count, d); 206bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 207bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 208b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData(int off, int count, float[] d) { 209771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 210b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DSubData(mID, off, count, d); 211b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 212b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 213b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 214b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public Adapter1D createAdapter1D() { 215771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 216b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams int id = mRS.nAdapter1DCreate(); 217718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 218718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("allocation failed."); 219b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 220718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mRS.nAdapter1DBindAllocation(id, mID); 221b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams return new Adapter1D(id, mRS); 222b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 223b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 224b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 225bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public class Adapter2D extends BaseObj { 226bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams Adapter2D(int id, RenderScript rs) { 227bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams super(rs); 228bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mID = id; 229bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 230bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 231bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void setConstraint(Dimension dim, int value) { 232771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 233bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DSetConstraint(mID, dim.mID, value); 234bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 235bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 236bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void data(int[] d) { 237771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 238bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DData(mID, d); 239bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 240bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 241bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void data(float[] d) { 242771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 243bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DData(mID, d); 244bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 245bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 246bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int xoff, int yoff, int w, int h, int[] d) { 247771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 248bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d); 249bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 250bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 251bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int xoff, int yoff, int w, int h, float[] d) { 252771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 253bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d); 254bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 255bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 256bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 257bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public Adapter2D createAdapter2D() { 258771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 259bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams int id = mRS.nAdapter2DCreate(); 260718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 261718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("allocation failed."); 262bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 263718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mRS.nAdapter2DBindAllocation(id, mID); 264bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams return new Adapter2D(id, mRS); 265bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 266bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 267b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 268b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams // creation 269b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 270b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); 271b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static { 272b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mBitmapOptions.inScaled = false; 273b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 274b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 2751bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams static public Allocation createTyped(RenderScript rs, Type type) 2761bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throws IllegalArgumentException { 2771bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 278771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 2791bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams if(type.mID == 0) { 2801bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throw new IllegalStateException("Bad Type"); 2811bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 282b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams int id = rs.nAllocationCreateTyped(type.mID); 28343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams return new Allocation(id, rs, type); 284b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 285b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 2861bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams static public Allocation createSized(RenderScript rs, Element e, int count) 2871bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throws IllegalArgumentException { 2881bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 289771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 290768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type.Builder b = new Type.Builder(rs, e); 291768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams b.add(Dimension.X, count); 292768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type t = b.create(); 293768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 294768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int id = rs.nAllocationCreateTyped(t.mID); 295ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams if(id == 0) { 296ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams throw new IllegalStateException("Bad element."); 297b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 298768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return new Allocation(id, rs, t); 299b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 300b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3018a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static private Element elementFromBitmap(RenderScript rs, Bitmap b) { 3028a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams final Bitmap.Config bc = b.getConfig(); 3038a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ALPHA_8) { 3048a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.A_8(rs); 3058a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3068a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_4444) { 3078a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_4444(rs); 3088a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3098a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_8888) { 3108a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_8888(rs); 3118a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3128a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.RGB_565) { 3138a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGB_565(rs); 3148a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3158a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams throw new IllegalStateException("Bad bitmap type."); 3168a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3178a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3188a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static private Type typeFromBitmap(RenderScript rs, Bitmap b) { 3198a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Element e = elementFromBitmap(rs, b); 3208a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type.Builder tb = new Type.Builder(rs, e); 3218a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams tb.add(Dimension.X, b.getWidth()); 3228a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams tb.add(Dimension.Y, b.getHeight()); 3238a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return tb.create(); 3248a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3258a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 326b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips) 327b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams throws IllegalArgumentException { 328b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 329771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 3308a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type t = typeFromBitmap(rs, b); 3318a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 332ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b); 333718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 334718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("Load failed."); 335718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 3368a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return new Allocation(id, rs, t); 3378a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3388a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3398a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static public Allocation createBitmapRef(RenderScript rs, Bitmap b) 3408a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams throws IllegalArgumentException { 3418a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3428a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams rs.validate(); 3438a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type t = typeFromBitmap(rs, b); 3448a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3458a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams int id = rs.nAllocationCreateBitmapRef(t.getID(), b); 3468a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if(id == 0) { 3478a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams throw new IllegalStateException("Load failed."); 3488a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3498a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3508a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Allocation a = new Allocation(id, rs, t); 3518a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams a.mBitmap = b; 3528a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return a; 353b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 354b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 35574e02ef2000ff2783e526d6916e2f0b5d517593eJason Sams static Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips) 356b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams throws IllegalArgumentException { 357b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 358771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 359ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b); 360718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 361718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("Load failed."); 362718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 36343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams return new Allocation(id, rs, null); 364b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 365b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 366b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips) 367b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams throws IllegalArgumentException { 368b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 369771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 370650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy InputStream is = null; 371650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 372650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy final TypedValue value = new TypedValue(); 373650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is = res.openRawResource(id, value); 374650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 375650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy int asset = ((AssetManager.AssetInputStream) is).getAssetInt(); 376ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips, 377650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy asset); 378650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 379718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(allocationId == 0) { 380718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("Load failed."); 381718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 382ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams return new Allocation(allocationId, rs, null); 383650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (Exception e) { 384650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy // Ignore 385650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } finally { 386650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy if (is != null) { 387650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 388650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is.close(); 389650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (IOException e) { 390650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy // Ignore 391650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 392650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 393650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 394650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 395650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy return null; 396b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 397b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 398b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static public Allocation createFromBitmapResourceBoxed(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips) 399b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams throws IllegalArgumentException { 400b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 401b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams Bitmap b = BitmapFactory.decodeResource(res, id, mBitmapOptions); 402b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams return createFromBitmapBoxed(rs, b, dstFmt, genMips); 403b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 4049b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk 4059b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk static public Allocation createFromString(RenderScript rs, String str) 4069b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk throws IllegalArgumentException { 4079b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk byte[] allocArray = null; 4089b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk try { 4099b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk allocArray = str.getBytes("UTF-8"); 4109b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length); 4119b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk alloc.data(allocArray); 4129b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk return alloc; 4139b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 4149b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk catch (Exception e) { 4159b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk Log.e("rs", "could not convert string to utf-8"); 4169b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 4179b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk return null; 4189b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 419b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams} 420b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 421b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 422