Allocation.java revision 4bd1a3dbcad2ae424293e276434b45ebee97248d
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() { 4806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams super.updateFromNative(); 4906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int typeID = mRS.nAllocationGetType(getID()); 50dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk if(typeID != 0) { 51dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType = new Type(typeID, mRS); 52dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType.updateFromNative(); 53dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 54dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 55dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 56ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public Type getType() { 57ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mType; 58ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams } 59ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams 60b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void uploadToTexture(int baseMipLevel) { 61771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 6206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationUploadToTexture(getID(), false, baseMipLevel); 63c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams } 64c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams 65c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams public void uploadToTexture(boolean genMips, int baseMipLevel) { 66c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams mRS.validate(); 6706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationUploadToTexture(getID(), genMips, baseMipLevel); 68b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 69b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 7007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams public void uploadToBufferObject() { 71771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 7206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationUploadToBufferObject(getID()); 7307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 7407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams 75b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(int[] d) { 76771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 77768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 78768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 79768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void data(short[] d) { 80771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 81768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 82768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void data(byte[] d) { 84771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 85768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 86b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 87b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(float[] d) { 88771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 89768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams subData1D(0, mType.getElementCount(), d); 90b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 91b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 9206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams public void updateFromBitmap(Bitmap b) { 9326ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 9426ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk mRS.validate(); 9526ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk if(mType.getX() != b.getWidth() || 9626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk mType.getY() != b.getHeight()) { 9706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch"); 9826ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk } 9926ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 10006d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationUpdateFromBitmap(getID(), b); 10126ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk } 10226ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 10349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams public void subData(int xoff, FieldPacker fp) { 104a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int eSize = mType.mElement.getSizeBytes(); 105a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams final byte[] data = fp.getData(); 106a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 107a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int count = data.length / eSize; 108a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if ((eSize * count) != data.length) { 10906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Field packer length " + data.length + 110a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams " not divisible by element size " + eSize + "."); 111a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 11249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams data1DChecks(xoff, count, data.length, data.length); 11306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData1D(getID(), xoff, count, data, data.length); 11449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 11549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 11649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 11749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams public void subElementData(int xoff, int component_number, FieldPacker fp) { 11849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if (component_number >= mType.mElement.mElements.length) { 11906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Component_number " + component_number + " out of range."); 12049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 12149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if(xoff < 0) { 12206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Offset must be >= 0."); 12349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 12449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 12549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams final byte[] data = fp.getData(); 12649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams int eSize = mType.mElement.mElements[component_number].getSizeBytes(); 12749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 12849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if (data.length != eSize) { 12906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Field packer sizelength " + data.length + 13049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams " does not match component size " + eSize + "."); 13149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 13249bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 13306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubElementData1D(getID(), xoff, component_number, data, data.length); 134a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 135a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 136768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams private void data1DChecks(int off, int count, int len, int dataSize) { 137771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 138a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(off < 0) { 13906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Offset must be >= 0."); 140a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 141a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(count < 1) { 14206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Count must be >= 1."); 143a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 144a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if((off + count) > mType.getElementCount()) { 14506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Overflow, Available count " + mType.getElementCount() + 146a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams ", got " + count + " at offset " + off + "."); 147768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 148768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if((len) < dataSize) { 14906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Array too small for allocation type."); 150768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 151b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 152b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 153768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, int[] d) { 154768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 155768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 15606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData1D(getID(), off, count, d, dataSize); 157768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 158768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, short[] d) { 159768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 160768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 2, dataSize); 16106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData1D(getID(), off, count, d, dataSize); 162768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 163768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public void subData1D(int off, int count, byte[] d) { 164768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 165768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length, dataSize); 16606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData1D(getID(), off, count, d, dataSize); 167768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 168b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData1D(int off, int count, float[] d) { 169768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 170768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 17106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData1D(getID(), off, count, d, dataSize); 172b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 173b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 174768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 175b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData2D(int xoff, int yoff, int w, int h, int[] d) { 176771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 17706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData2D(getID(), xoff, yoff, w, h, d, d.length * 4); 178b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 179b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 180b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData2D(int xoff, int yoff, int w, int h, float[] d) { 181771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 18206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationSubData2D(getID(), xoff, yoff, w, h, d, d.length * 4); 183b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 184b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 18540a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams public void readData(int[] d) { 186771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 18706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationRead(getID(), d); 18840a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 18940a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 19040a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams public void readData(float[] d) { 191771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 19206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationRead(getID(), d); 19340a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 19440a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 19531a7e42f4baa059352f0db119de38428e655eab2Jason Sams public synchronized void resize(int dimX) { 1965edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) { 19706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSInvalidStateException("Resize only support for 1D allocations at this time."); 1985edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 19906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationResize1D(getID(), dimX); 200d26297fa562d8bb203df1bb5e6ded7f62c56cdb7Jason Sams mRS.finish(); // Necessary because resize is fifoed and update is async. 20131a7e42f4baa059352f0db119de38428e655eab2Jason Sams 20206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int typeID = mRS.nAllocationGetType(getID()); 20331a7e42f4baa059352f0db119de38428e655eab2Jason Sams mType = new Type(typeID, mRS); 20431a7e42f4baa059352f0db119de38428e655eab2Jason Sams mType.updateFromNative(); 2055edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2065edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 2075edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams /* 2085edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams public void resize(int dimX, int dimY) { 2095edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) { 21006d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalStateException("Resize only support for 2D allocations at this time."); 2115edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2125edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if (mType.getY() == 0) { 21306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalStateException("Resize only support for 2D allocations at this time."); 2145edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 21506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationResize2D(getID(), dimX, dimY); 2165edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 2175edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams */ 21840a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 219b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public class Adapter1D extends BaseObj { 220b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams Adapter1D(int id, RenderScript rs) { 2210de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 222b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 223b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 224b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void setConstraint(Dimension dim, int value) { 225771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 22606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter1DSetConstraint(getID(), dim.mID, value); 227b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 228b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 229b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(int[] d) { 230771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 23106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter1DData(getID(), d); 232b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 233b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 234b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void data(float[] d) { 235771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 23606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter1DData(getID(), d); 237b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 238b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 239bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int off, int count, int[] d) { 240771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 24106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter1DSubData(getID(), off, count, d); 242bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 243bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 244b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void subData(int off, int count, float[] d) { 245771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 24606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter1DSubData(getID(), off, count, d); 247b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 248b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 249b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 250b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public Adapter1D createAdapter1D() { 251771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 252b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams int id = mRS.nAdapter1DCreate(); 253718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 25406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Adapter creation failed."); 255b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 25606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter1DBindAllocation(id, getID()); 257b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams return new Adapter1D(id, mRS); 258b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 259b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 260b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 261bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public class Adapter2D extends BaseObj { 262bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams Adapter2D(int id, RenderScript rs) { 2630de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 264bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 265bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 266bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void setConstraint(Dimension dim, int value) { 267771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 26806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter2DSetConstraint(getID(), dim.mID, value); 269bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 270bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 271bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void data(int[] d) { 272771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 27306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter2DData(getID(), d); 274bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 275bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 276bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void data(float[] d) { 277771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 27806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter2DData(getID(), d); 279bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 280bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 281bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int xoff, int yoff, int w, int h, int[] d) { 282771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 28306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter2DSubData(getID(), xoff, yoff, w, h, d); 284bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 285bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 286bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public void subData(int xoff, int yoff, int w, int h, float[] d) { 287771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 28806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter2DSubData(getID(), xoff, yoff, w, h, d); 289bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 290bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 291bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 292bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams public Adapter2D createAdapter2D() { 293771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 294bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams int id = mRS.nAdapter2DCreate(); 295718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 29606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("allocation failed."); 29706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams } 29806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAdapter2DBindAllocation(id, getID()); 29906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams if(id == 0) { 30006d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Adapter creation failed."); 301bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 302bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams return new Adapter2D(id, mRS); 303bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams } 304bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 305b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 306b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams // creation 307b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 308b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams private static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); 309b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static { 310b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mBitmapOptions.inScaled = false; 311b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 312b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 31306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams static public Allocation createTyped(RenderScript rs, Type type) { 3141bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 315771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 31606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams if(type.getID() == 0) { 31706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSInvalidStateException("Bad Type"); 31806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams } 31906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int id = rs.nAllocationCreateTyped(type.getID()); 32006d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams if(id == 0) { 32106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Allocation creation failed."); 3221bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 32343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams return new Allocation(id, rs, type); 324b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 325b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3261bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams static public Allocation createSized(RenderScript rs, Element e, int count) 3271bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams throws IllegalArgumentException { 3281bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 329771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 330768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type.Builder b = new Type.Builder(rs, e); 331768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams b.add(Dimension.X, count); 332768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type t = b.create(); 333768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 33406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int id = rs.nAllocationCreateTyped(t.getID()); 335ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams if(id == 0) { 33606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Allocation creation failed."); 337b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 338768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return new Allocation(id, rs, t); 339b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 340b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3418a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static private Element elementFromBitmap(RenderScript rs, Bitmap b) { 3428a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams final Bitmap.Config bc = b.getConfig(); 3438a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ALPHA_8) { 3448a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.A_8(rs); 3458a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3468a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_4444) { 3478a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_4444(rs); 3488a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3498a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_8888) { 3508a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_8888(rs); 3518a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3528a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.RGB_565) { 3538a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGB_565(rs); 3548a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3554bd1a3dbcad2ae424293e276434b45ebee97248dJeff Sharkey throw new RSInvalidStateException("Bad bitmap type: " + bc); 3568a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3578a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3588a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams static private Type typeFromBitmap(RenderScript rs, Bitmap b) { 3598a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Element e = elementFromBitmap(rs, b); 3608a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type.Builder tb = new Type.Builder(rs, e); 3618a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams tb.add(Dimension.X, b.getWidth()); 3628a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams tb.add(Dimension.Y, b.getHeight()); 3638a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return tb.create(); 3648a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3658a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 36606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips) { 367b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 368771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 3698a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type t = typeFromBitmap(rs, b); 3708a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 37106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int id = rs.nAllocationCreateFromBitmap(dstFmt.getID(), genMips, b); 372718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams if(id == 0) { 37306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Load failed."); 374718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 3758a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return new Allocation(id, rs, t); 3768a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3778a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 37806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams static public Allocation createBitmapRef(RenderScript rs, Bitmap b) { 3798a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3808a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams rs.validate(); 3818a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type t = typeFromBitmap(rs, b); 3828a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3838a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams int id = rs.nAllocationCreateBitmapRef(t.getID(), b); 3848a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if(id == 0) { 38506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Load failed."); 3868a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3878a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3888a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Allocation a = new Allocation(id, rs, t); 3898a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams a.mBitmap = b; 3908a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return a; 391b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 392b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 39306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips) { 394b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 395771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 396650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy InputStream is = null; 397650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 398650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy final TypedValue value = new TypedValue(); 399650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is = res.openRawResource(id, value); 400650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 401650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy int asset = ((AssetManager.AssetInputStream) is).getAssetInt(); 40206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int aId = rs.nAllocationCreateFromAssetStream(dstFmt.getID(), genMips, asset); 403650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 40406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams if (aId == 0) { 40506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Load failed."); 406718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 40706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams return new Allocation(aId, rs, null); 408650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } finally { 409650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy if (is != null) { 410650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 411650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is.close(); 412650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (IOException e) { 413650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy // Ignore 414650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 415650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 416650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 417b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 418b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 41906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams static public Allocation createFromString(RenderScript rs, String str) { 4209b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk byte[] allocArray = null; 4219b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk try { 4229b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk allocArray = str.getBytes("UTF-8"); 4239b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length); 4249b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk alloc.data(allocArray); 4259b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk return alloc; 4269b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 4279b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk catch (Exception e) { 42806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Could not convert string to utf-8."); 4299b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 4309b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 431b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams} 432b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 433b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 434