AllocationAdapter.java revision ee2d809ab099e67698a37f13a42d22eaa2251f77
149a05d7b82956009f03acbb92a064eed054eb031Jason Sams/*
249a05d7b82956009f03acbb92a064eed054eb031Jason Sams * Copyright (C) 2008 The Android Open Source Project
349a05d7b82956009f03acbb92a064eed054eb031Jason Sams *
449a05d7b82956009f03acbb92a064eed054eb031Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
549a05d7b82956009f03acbb92a064eed054eb031Jason Sams * you may not use this file except in compliance with the License.
649a05d7b82956009f03acbb92a064eed054eb031Jason Sams * You may obtain a copy of the License at
749a05d7b82956009f03acbb92a064eed054eb031Jason Sams *
849a05d7b82956009f03acbb92a064eed054eb031Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
949a05d7b82956009f03acbb92a064eed054eb031Jason Sams *
1049a05d7b82956009f03acbb92a064eed054eb031Jason Sams * Unless required by applicable law or agreed to in writing, software
1149a05d7b82956009f03acbb92a064eed054eb031Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1249a05d7b82956009f03acbb92a064eed054eb031Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349a05d7b82956009f03acbb92a064eed054eb031Jason Sams * See the License for the specific language governing permissions and
1449a05d7b82956009f03acbb92a064eed054eb031Jason Sams * limitations under the License.
1549a05d7b82956009f03acbb92a064eed054eb031Jason Sams */
1649a05d7b82956009f03acbb92a064eed054eb031Jason Sams
1749a05d7b82956009f03acbb92a064eed054eb031Jason Samspackage android.renderscript;
1849a05d7b82956009f03acbb92a064eed054eb031Jason Sams
1949a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.content.res.Resources;
2049a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.content.res.AssetManager;
2149a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.graphics.Bitmap;
2249a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.graphics.BitmapFactory;
2349a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.util.Log;
2449a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.util.TypedValue;
2549a05d7b82956009f03acbb92a064eed054eb031Jason Sams
2649a05d7b82956009f03acbb92a064eed054eb031Jason Sams/**
2749a05d7b82956009f03acbb92a064eed054eb031Jason Sams *
2849a05d7b82956009f03acbb92a064eed054eb031Jason Sams **/
2949a05d7b82956009f03acbb92a064eed054eb031Jason Samspublic class AllocationAdapter extends Allocation {
30ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    private boolean mConstrainedLOD;
31ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    private boolean mConstrainedFace;
32ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    private boolean mConstrainedY;
33ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    private boolean mConstrainedZ;
34ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
3549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    private int mSelectedDimX;
3649a05d7b82956009f03acbb92a064eed054eb031Jason Sams    private int mSelectedDimY;
37ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    private int mSelectedDimZ;
3849a05d7b82956009f03acbb92a064eed054eb031Jason Sams    private int mSelectedCount;
3949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    private Allocation mAlloc;
4049a05d7b82956009f03acbb92a064eed054eb031Jason Sams
4149a05d7b82956009f03acbb92a064eed054eb031Jason Sams    private int mSelectedLOD = 0;
4220fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines    private Type.CubemapFace mSelectedFace = Type.CubemapFace.POSITIVE_X;
4349a05d7b82956009f03acbb92a064eed054eb031Jason Sams
4449a05d7b82956009f03acbb92a064eed054eb031Jason Sams    AllocationAdapter(int id, RenderScript rs, Allocation alloc) {
4549a05d7b82956009f03acbb92a064eed054eb031Jason Sams        super(id, rs, null, alloc.mUsage);
46ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        mAlloc = alloc;
4749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
4849a05d7b82956009f03acbb92a064eed054eb031Jason Sams
4949a05d7b82956009f03acbb92a064eed054eb031Jason Sams
50ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    int getID() {
51ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        return mAlloc.getID();
52ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    }
53ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
5449a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyFrom(BaseObj[] d) {
5549a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
5649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if (d.length != mSelectedCount) {
5749a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Array size mismatch, allocation size = " +
5849a05d7b82956009f03acbb92a064eed054eb031Jason Sams                                                 mSelectedCount + ", array length = " + d.length);
5949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
6049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int i[] = new int[d.length];
6149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        for (int ct=0; ct < d.length; ct++) {
6249a05d7b82956009f03acbb92a064eed054eb031Jason Sams            i[ct] = d[ct].getID();
6349a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
64ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        subData1D(0, mAlloc.mType.getCount(), i);
6549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
6649a05d7b82956009f03acbb92a064eed054eb031Jason Sams
6749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    void validateBitmap(Bitmap b) {
6849a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
6949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if(mSelectedDimX != b.getWidth() ||
7049a05d7b82956009f03acbb92a064eed054eb031Jason Sams           mSelectedDimY != b.getHeight()) {
7149a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
7249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
7349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
7449a05d7b82956009f03acbb92a064eed054eb031Jason Sams
7549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyFrom(int[] d) {
7649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
7749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        subData1D(0, mSelectedCount, d);
7849a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
7949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyFrom(short[] d) {
8049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
8149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        subData1D(0, mSelectedCount, d);
8249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
8349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyFrom(byte[] d) {
8449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
8549a05d7b82956009f03acbb92a064eed054eb031Jason Sams        subData1D(0, mSelectedCount, d);
8649a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
8749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyFrom(float[] d) {
8849a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
8949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        subData1D(0, mSelectedCount, d);
9049a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
9149a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyFrom(Bitmap b) {
9249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        validateBitmap(b);
9349a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationCopyFromBitmap(getID(), b);
9449a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
9549a05d7b82956009f03acbb92a064eed054eb031Jason Sams
9649a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void copyTo(Bitmap b) {
9749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        validateBitmap(b);
9849a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationCopyToBitmap(getID(), b);
9949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
10049a05d7b82956009f03acbb92a064eed054eb031Jason Sams
10149a05d7b82956009f03acbb92a064eed054eb031Jason Sams
10249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData(int xoff, FieldPacker fp) {
103ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        int eSize = mAlloc.mType.mElement.getSizeBytes();
10449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        final byte[] data = fp.getData();
10549a05d7b82956009f03acbb92a064eed054eb031Jason Sams
10649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int count = data.length / eSize;
10749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if ((eSize * count) != data.length) {
10849a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Field packer length " + data.length +
10949a05d7b82956009f03acbb92a064eed054eb031Jason Sams                                               " not divisible by element size " + eSize + ".");
11049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
11149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        data1DChecks(xoff, count, data.length, data.length);
11249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationData1D(getID(), xoff, mSelectedLOD, count, data, data.length);
11349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
11449a05d7b82956009f03acbb92a064eed054eb031Jason Sams
11549a05d7b82956009f03acbb92a064eed054eb031Jason Sams
11649a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subElementData(int xoff, int component_number, FieldPacker fp) {
117ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if (component_number >= mAlloc.mType.mElement.mElements.length) {
11849a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
11949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
12049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if(xoff < 0) {
12149a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Offset must be >= 0.");
12249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
12349a05d7b82956009f03acbb92a064eed054eb031Jason Sams
12449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        final byte[] data = fp.getData();
125ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        int eSize = mAlloc.mType.mElement.mElements[component_number].getSizeBytes();
12649a05d7b82956009f03acbb92a064eed054eb031Jason Sams
12749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if (data.length != eSize) {
12849a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
12949a05d7b82956009f03acbb92a064eed054eb031Jason Sams                                               " does not match component size " + eSize + ".");
13049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
13149a05d7b82956009f03acbb92a064eed054eb031Jason Sams
13249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationElementData1D(getID(), xoff, mSelectedLOD, component_number, data, data.length);
13349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
13449a05d7b82956009f03acbb92a064eed054eb031Jason Sams
13549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    void data1DChecks(int off, int count, int len, int dataSize) {
13649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
13749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if(off < 0) {
13849a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Offset must be >= 0.");
13949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
14049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if(count < 1) {
14149a05d7b82956009f03acbb92a064eed054eb031Jason Sams            throw new RSIllegalArgumentException("Count must be >= 1.");
14249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
143ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if((off + count) > mSelectedCount) {
144ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            throw new RSIllegalArgumentException("Overflow, Available count " + mAlloc.mType.getCount() +
14549a05d7b82956009f03acbb92a064eed054eb031Jason Sams                                               ", got " + count + " at offset " + off + ".");
14649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
14749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        if((len) < dataSize) {
148ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            throw new RSIllegalArgumentException("Array too small for allocation type.  len = " +
149ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams                                                 len + ", dataSize = " + dataSize);
15049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
15149a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
15249a05d7b82956009f03acbb92a064eed054eb031Jason Sams
15349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData1D(int off, int count, int[] d) {
15449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int dataSize = mAlloc.mType.mElement.getSizeBytes() * count;
15549a05d7b82956009f03acbb92a064eed054eb031Jason Sams        data1DChecks(off, count, d.length * 4, dataSize);
15649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationData1D(getID(), off, mSelectedLOD, count, d, dataSize);
15749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
15849a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData1D(int off, int count, short[] d) {
15949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int dataSize = mAlloc.mType.mElement.getSizeBytes() * count;
16049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        data1DChecks(off, count, d.length * 2, dataSize);
16149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationData1D(getID(), off, mSelectedLOD, count, d, dataSize);
16249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
16349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData1D(int off, int count, byte[] d) {
16449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int dataSize = mAlloc.mType.mElement.getSizeBytes() * count;
16549a05d7b82956009f03acbb92a064eed054eb031Jason Sams        data1DChecks(off, count, d.length, dataSize);
16649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationData1D(getID(), off, mSelectedLOD, count, d, dataSize);
16749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
16849a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData1D(int off, int count, float[] d) {
16949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int dataSize = mAlloc.mType.mElement.getSizeBytes() * count;
17049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        data1DChecks(off, count, d.length * 4, dataSize);
17149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationData1D(getID(), off, mSelectedLOD, count, d, dataSize);
17249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
17349a05d7b82956009f03acbb92a064eed054eb031Jason Sams
174304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    /**
175304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * Copy part of an allocation from another allocation.
176304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     *
177304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param off The offset of the first element to be copied.
178304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param count The number of elements to be copied.
179304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param data the source data allocation.
180304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param dataOff off The offset of the first element in data to
181304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     *          be copied.
182304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     */
183304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    public void subData1D(int off, int count, AllocationAdapter data, int dataOff) {
184304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mRS.nAllocationData2D(getID(), off, 0,
185304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              mSelectedLOD, mSelectedFace.mID,
186304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              count, 1, data.getID(), dataOff, 0,
187304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              data.mSelectedLOD, data.mSelectedFace.mID);
188304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    }
189304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
19049a05d7b82956009f03acbb92a064eed054eb031Jason Sams
19149a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
19249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
193304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mRS.nAllocationData2D(getID(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
194304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              w, h, d, d.length * 4);
19549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
19649a05d7b82956009f03acbb92a064eed054eb031Jason Sams
19749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
19849a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
199304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mRS.nAllocationData2D(getID(), xoff, yoff, mSelectedLOD, mSelectedFace.mID,
200304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              w, h, d, d.length * 4);
201304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    }
202304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk
203304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    /**
204304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * Copy a rectangular region into the allocation from another
205304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * allocation.
206304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     *
207304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param xoff X offset of the region to update.
208304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param yoff Y offset of the region to update.
209304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param w Width of the incoming region to update.
210304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param h Height of the incoming region to update.
211304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param data source allocation.
212304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param dataXoff X offset in data of the region to update.
213304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     * @param dataYoff Y offset in data of the region to update.
214304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk     */
215304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk    public void subData2D(int xoff, int yoff, int w, int h,
216304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                          AllocationAdapter data, int dataXoff, int dataYoff) {
217304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mRS.validate();
218304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mRS.nAllocationData2D(getID(), xoff, yoff,
219304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              mSelectedLOD, mSelectedFace.mID,
220304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              w, h, data.getID(), dataXoff, dataYoff,
221304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk                              data.mSelectedLOD, data.mSelectedFace.mID);
22249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
22349a05d7b82956009f03acbb92a064eed054eb031Jason Sams
22449a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void readData(int[] d) {
22549a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
22649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationRead(getID(), d);
22749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
22849a05d7b82956009f03acbb92a064eed054eb031Jason Sams
22949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void readData(float[] d) {
23049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.validate();
23149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        mRS.nAllocationRead(getID(), d);
23249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
23349a05d7b82956009f03acbb92a064eed054eb031Jason Sams
234ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    private void initLOD(int lod) {
235ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if (lod < 0) {
236ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            throw new RSIllegalArgumentException("Attempting to set negative lod (" + lod + ").");
237ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        }
238ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
239ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        int tx = mAlloc.mType.getX();
240ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        int ty = mAlloc.mType.getY();
241ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        int tz = mAlloc.mType.getZ();
242ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
243ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        for (int ct=0; ct < lod; ct++) {
244ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            if ((tx==1) && (ty == 1) && (tz == 1)) {
245ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams                throw new RSIllegalArgumentException("Attempting to set lod (" + lod + ") out of range.");
246ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            }
247ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
248ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            if (tx > 1) tx >>= 1;
249ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            if (ty > 1) ty >>= 1;
250ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            if (tz > 1) tz >>= 1;
251ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        }
252ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
253ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        mSelectedDimX = tx;
254ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        mSelectedDimY = ty;
255ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        mSelectedCount = tx;
256ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if (ty > 1) {
257ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            mSelectedCount *= ty;
258ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        }
259ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if (tz > 1) {
260ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            mSelectedCount *= tz;
261ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        }
262ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    }
263ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
264ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams    /**
265ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams     * Set the active LOD.  The LOD must be within the range for the
266ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams     * type being adapted.
267ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams     *
268ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams     * @param lod The LOD to make active.
269ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams     */
27049a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void setLOD(int lod) {
271ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if (!mAlloc.getType().hasMipmaps()) {
272ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            throw new RSInvalidStateException("Cannot set LOD when the allocation type does not include mipmaps.");
273ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        }
274ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        if (!mConstrainedLOD) {
275ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams            throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps.");
276ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        }
277ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams
278ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        initLOD(lod);
27949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
28049a05d7b82956009f03acbb92a064eed054eb031Jason Sams
28149a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void setFace(Type.CubemapFace cf) {
282304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mSelectedFace = cf;
28349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
28449a05d7b82956009f03acbb92a064eed054eb031Jason Sams
28549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void setY(int y) {
286304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk        mSelectedDimY = y;
28749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
28849a05d7b82956009f03acbb92a064eed054eb031Jason Sams
28949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public void setZ(int z) {
29049a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
29149a05d7b82956009f03acbb92a064eed054eb031Jason Sams
29249a05d7b82956009f03acbb92a064eed054eb031Jason Sams    // creation
29349a05d7b82956009f03acbb92a064eed054eb031Jason Sams    //static public AllocationAdapter create1D(RenderScript rs, Allocation a) {
29449a05d7b82956009f03acbb92a064eed054eb031Jason Sams    //}
29549a05d7b82956009f03acbb92a064eed054eb031Jason Sams
29649a05d7b82956009f03acbb92a064eed054eb031Jason Sams    static public AllocationAdapter create2D(RenderScript rs, Allocation a) {
29749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        rs.validate();
29849a05d7b82956009f03acbb92a064eed054eb031Jason Sams        AllocationAdapter aa = new AllocationAdapter(0, rs, a);
299ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        aa.mConstrainedLOD = true;
300ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        aa.mConstrainedFace = true;
301ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        aa.mConstrainedY = false;
302ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        aa.mConstrainedZ = true;
303ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams        aa.initLOD(0);
30449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        return aa;
30549a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
30649a05d7b82956009f03acbb92a064eed054eb031Jason Sams
30749a05d7b82956009f03acbb92a064eed054eb031Jason Sams
30849a05d7b82956009f03acbb92a064eed054eb031Jason Sams}
30949a05d7b82956009f03acbb92a064eed054eb031Jason Sams
31049a05d7b82956009f03acbb92a064eed054eb031Jason Sams
311