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