Allocation.java revision 31a7e42f4baa059352f0db119de38428e655eab2
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) { 380de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 3943ee06857bb7f99446d1d84f8789016c5d105558Jason Sams mType = t; 40b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 41b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 4280a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk Allocation(int id, RenderScript rs) { 430de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 4480a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk } 4580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk 46dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk @Override 47dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk void updateFromNative() { 48dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mRS.validate(); 49fb10c16a0528a418053e4b8e75eebe57476b86efAlex Sakhartchouk mName = mRS.nGetName(mID); 50dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk int typeID = mRS.nAllocationGetType(mID); 51dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk if(typeID != 0) { 52dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType = new Type(typeID, mRS); 53dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType.updateFromNative(); 54dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 55dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 56dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 57ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public Type getType() { 58ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mType; 59ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams } 60ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams 61b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void uploadToTexture(int baseMipLevel) { 62771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 63c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.nAllocationUploadToTexture(mID, false, baseMipLevel); 64c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams } 65c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams 66c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams public void uploadToTexture(boolean genMips, int baseMipLevel) { 67c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.validate(); 68c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.nAllocationUploadToTexture(mID, genMips, baseMipLevel); 69b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 70b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 7107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams public void uploadToBufferObject() { 72771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 7307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams mRS.nAllocationUploadToBufferObject(mID); 7407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 7507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams 76b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(int[] d) { 77771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 78768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 79768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 80768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void data(short[] d) { 81771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 82768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 84768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void data(byte[] d) { 85771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 86768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 87b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 88b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(float[] d) { 89771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 90768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 91b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 92b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 9326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk public void updateFromBitmap(Bitmap b) 9426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk throws IllegalArgumentException { 9526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 9626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk mRS.validate(); 9726ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk if(mType.getX() != b.getWidth() || 9826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk mType.getY() != b.getHeight()) { 9926ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk throw new IllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch"); 10026ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk } 10126ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 10226ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk mRS.nAllocationUpdateFromBitmap(mID, b); 10326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk } 10426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 10549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams public void subData(int xoff, FieldPacker fp) { 106a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int eSize = mType.mElement.getSizeBytes(); 107a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams final byte[] data = fp.getData(); 108a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 109a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int count = data.length / eSize; 110a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if ((eSize * count) != data.length) { 111a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Field packer length " + data.length + 112a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams " not divisible by element size " + eSize + "."); 113a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 11449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams data1DChecks(xoff, count, data.length, data.length); 11549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams mRS.nAllocationSubData1D(mID, xoff, count, data, data.length); 11649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 11749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 11849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 11949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams public void subElementData(int xoff, int component_number, FieldPacker fp) { 12049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if (component_number >= mType.mElement.mElements.length) { 12149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams throw new IllegalArgumentException("Component_number " + component_number + " out of range."); 12249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 12349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if(xoff < 0) { 12449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams throw new IllegalArgumentException("Offset must be >= 0."); 12549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 12649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 12749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams final byte[] data = fp.getData(); 12849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams int eSize = mType.mElement.mElements[component_number].getSizeBytes(); 12949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 13049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if (data.length != eSize) { 13149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams throw new IllegalArgumentException("Field packer sizelength " + data.length + 13249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams " does not match component size " + eSize + "."); 13349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 13449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 13549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams mRS.nAllocationSubElementData1D(mID, xoff, component_number, data, data.length); 136a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 137a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 138768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams private void data1DChecks(int off, int count, int len, int dataSize) { 139771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 140a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(off < 0) { 141a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Offset must be >= 0."); 142a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 143a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(count < 1) { 144a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Count must be >= 1."); 145a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 146a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if((off + count) > mType.getElementCount()) { 147a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams throw new IllegalArgumentException("Overflow, Available count " + mType.getElementCount() + 148a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams ", got " + count + " at offset " + off + "."); 149768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 150768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if((len) < dataSize) { 151768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams throw new IllegalArgumentException("Array too small for allocation type."); 152768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 153b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 154b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 155768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, int[] d) { 156768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 157768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 158768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 159768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 160768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, short[] d) { 161768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 162768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 2, dataSize); 163768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 164768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 165768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, byte[] d) { 166768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 167768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length, dataSize); 168768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 169768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 170b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData1D(int off, int count, float[] d) { 171768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 172768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 173768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mRS.nAllocationSubData1D(mID, off, count, d, dataSize); 174b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 175b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 176768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 177b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData2D(int xoff, int yoff, int w, int h, int[] d) { 178771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 17907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4); 180b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 181b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 182b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData2D(int xoff, int yoff, int w, int h, float[] d) { 183771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 18407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4); 185b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 186b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 18740a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams public void readData(int[] d) { 188771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 18940a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams mRS.nAllocationRead(mID, d); 19040a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 19140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 19240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams public void readData(float[] d) { 193771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 19440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams mRS.nAllocationRead(mID, d); 19540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 19640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 19731a7e42f4baa059352f0db119de38428e655eab2Jason Sams public synchronized void resize(int dimX) { 1985edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) { 1995edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams throw new IllegalStateException("Resize only support for 1D allocations at this time."); 2005edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2015edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams mRS.nAllocationResize1D(mID, dimX); 20231a7e42f4baa059352f0db119de38428e655eab2Jason Sams 20331a7e42f4baa059352f0db119de38428e655eab2Jason Sams int typeID = mRS.nAllocationGetType(mID); 20431a7e42f4baa059352f0db119de38428e655eab2Jason Sams mType = new Type(typeID, mRS); 20531a7e42f4baa059352f0db119de38428e655eab2Jason Sams mType.updateFromNative(); 2065edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2075edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 2085edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams /* 2095edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams public void resize(int dimX, int dimY) { 2105edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) { 2115edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams throw new IllegalStateException("Resize only support for 2D allocations at this time."); 2125edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2135edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if (mType.getY() == 0) { 2145edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams throw new IllegalStateException("Resize only support for 2D allocations at this time."); 2155edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2165edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams mRS.nAllocationResize2D(mID, dimX, dimY); 2175edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2185edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams */ 21940a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 220b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public class Adapter1D extends BaseObj { 221b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams Adapter1D(int id, RenderScript rs) { 2220de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 223b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 224b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 225b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void setConstraint(Dimension dim, int value) { 226771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 227b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DSetConstraint(mID, dim.mID, value); 228b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 229b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 230b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(int[] d) { 231771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 232b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DData(mID, d); 233b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 234b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 235b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(float[] d) { 236771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 237b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DData(mID, d); 238b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 239b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 240bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int off, int count, int[] d) { 241771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 242bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter1DSubData(mID, off, count, d); 243bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 244bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 245b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData(int off, int count, float[] d) { 246771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 247b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mRS.nAdapter1DSubData(mID, off, count, d); 248b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 249b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 250b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 251b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public Adapter1D createAdapter1D() { 252771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 253b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams int id = mRS.nAdapter1DCreate(); 254718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 255718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("allocation failed."); 256b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 257718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mRS.nAdapter1DBindAllocation(id, mID); 258b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams return new Adapter1D(id, mRS); 259b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 260b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 261b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 262bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public class Adapter2D extends BaseObj { 263bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams Adapter2D(int id, RenderScript rs) { 2640de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 265bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 266bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 267bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void setConstraint(Dimension dim, int value) { 268771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 269bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DSetConstraint(mID, dim.mID, value); 270bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 271bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 272bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void data(int[] d) { 273771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 274bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DData(mID, d); 275bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 276bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 277bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void data(float[] d) { 278771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 279bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DData(mID, d); 280bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 281bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 282bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int xoff, int yoff, int w, int h, int[] d) { 283771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 284bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d); 285bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 286bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 287bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int xoff, int yoff, int w, int h, float[] d) { 288771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 289bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d); 290bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 291bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 292bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 293bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public Adapter2D createAdapter2D() { 294771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 295bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams int id = mRS.nAdapter2DCreate(); 296718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 297718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("allocation failed."); 298bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 299718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mRS.nAdapter2DBindAllocation(id, mID); 300bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams return new Adapter2D(id, mRS); 301bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 302bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 303b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 304b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams // creation 305b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 306b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); 307b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static { 308b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mBitmapOptions.inScaled = false; 309b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 310b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3111bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams static public Allocation createTyped(RenderScript rs, Type type) 3121bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throws IllegalArgumentException { 3131bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 314771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 3151bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams if(type.mID == 0) { 3161bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throw new IllegalStateException("Bad Type"); 3171bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 318b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams int id = rs.nAllocationCreateTyped(type.mID); 31943ee06857bb7f99446d1d84f8789016c5d105558Jason Sams return new Allocation(id, rs, type); 320b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 321b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3221bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams static public Allocation createSized(RenderScript rs, Element e, int count) 3231bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throws IllegalArgumentException { 3241bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 325771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 326768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type.Builder b = new Type.Builder(rs, e); 327768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams b.add(Dimension.X, count); 328768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type t = b.create(); 329768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 330768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int id = rs.nAllocationCreateTyped(t.mID); 331ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams if(id == 0) { 332ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams throw new IllegalStateException("Bad element."); 333b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 334768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return new Allocation(id, rs, t); 335b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 336b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3378a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static private Element elementFromBitmap(RenderScript rs, Bitmap b) { 3388a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams final Bitmap.Config bc = b.getConfig(); 3398a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ALPHA_8) { 3408a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.A_8(rs); 3418a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3428a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_4444) { 3438a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_4444(rs); 3448a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3458a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_8888) { 3468a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_8888(rs); 3478a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3488a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.RGB_565) { 3498a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGB_565(rs); 3508a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3518a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams throw new IllegalStateException("Bad bitmap type."); 3528a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3538a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3548a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static private Type typeFromBitmap(RenderScript rs, Bitmap b) { 3558a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Element e = elementFromBitmap(rs, b); 3568a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type.Builder tb = new Type.Builder(rs, e); 3578a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams tb.add(Dimension.X, b.getWidth()); 3588a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams tb.add(Dimension.Y, b.getHeight()); 3598a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return tb.create(); 3608a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3618a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 362b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips) 363b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams throws IllegalArgumentException { 364b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 365771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 3668a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type t = typeFromBitmap(rs, b); 3678a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 368ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b); 369718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 370718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("Load failed."); 371718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 3728a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return new Allocation(id, rs, t); 3738a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3748a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3758a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static public Allocation createBitmapRef(RenderScript rs, Bitmap b) 3768a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams throws IllegalArgumentException { 3778a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3788a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams rs.validate(); 3798a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type t = typeFromBitmap(rs, b); 3808a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3818a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams int id = rs.nAllocationCreateBitmapRef(t.getID(), b); 3828a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if(id == 0) { 3838a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams throw new IllegalStateException("Load failed."); 3848a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3858a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3868a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Allocation a = new Allocation(id, rs, t); 3878a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams a.mBitmap = b; 3888a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return a; 389b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 390b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 391b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips) 392b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams throws IllegalArgumentException { 393b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 394771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 395650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy InputStream is = null; 396650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 397650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy final TypedValue value = new TypedValue(); 398650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is = res.openRawResource(id, value); 399650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 400650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy int asset = ((AssetManager.AssetInputStream) is).getAssetInt(); 401ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams int allocationId = rs.nAllocationCreateFromAssetStream(dstFmt.mID, genMips, 402650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy asset); 403650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 404718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(allocationId == 0) { 405718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams throw new IllegalStateException("Load failed."); 406718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 407ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams return new Allocation(allocationId, rs, null); 408650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (Exception e) { 409650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy // Ignore 410650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } finally { 411650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy if (is != null) { 412650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 413650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is.close(); 414650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (IOException e) { 415650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy // Ignore 416650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 417650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 418650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 419650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 420650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy return null; 421b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 422b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 4239b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk static public Allocation createFromString(RenderScript rs, String str) 4249b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk throws IllegalArgumentException { 4259b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk byte[] allocArray = null; 4269b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk try { 4279b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk allocArray = str.getBytes("UTF-8"); 4289b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length); 4299b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk alloc.data(allocArray); 4309b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk return alloc; 4319b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 4329b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk catch (Exception e) { 4339b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk Log.e("rs", "could not convert string to utf-8"); 4349b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 4359b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk return null; 4369b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 437b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams} 438b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 439b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 440