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