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