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.graphics.Bitmap; 2149a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.graphics.BitmapFactory; 2249a05d7b82956009f03acbb92a064eed054eb031Jason Samsimport android.util.TypedValue; 2349a05d7b82956009f03acbb92a064eed054eb031Jason Sams 249c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 2549a05d7b82956009f03acbb92a064eed054eb031Jason Sams * 2649a05d7b82956009f03acbb92a064eed054eb031Jason Sams **/ 2749a05d7b82956009f03acbb92a064eed054eb031Jason Samspublic class AllocationAdapter extends Allocation { 2849a05d7b82956009f03acbb92a064eed054eb031Jason Sams AllocationAdapter(int id, RenderScript rs, Allocation alloc) { 29ba862d1544a06528151550be1784a926ee986580Jason Sams super(id, rs, alloc.mType, alloc.mUsage); 30ba862d1544a06528151550be1784a926ee986580Jason Sams mAdaptedAllocation = alloc; 3149a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 3249a05d7b82956009f03acbb92a064eed054eb031Jason Sams 33e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams int getID(RenderScript rs) { 3448fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams throw new RSInvalidStateException( 3548fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams "This operation is not supported with adapters at this time."); 36ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 37ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 38ba862d1544a06528151550be1784a926ee986580Jason Sams /** 39ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 40ba862d1544a06528151550be1784a926ee986580Jason Sams */ 4149a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData(int xoff, FieldPacker fp) { 42ba862d1544a06528151550be1784a926ee986580Jason Sams super.setFromFieldPacker(xoff, fp); 4349a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 44ba862d1544a06528151550be1784a926ee986580Jason Sams /** 45ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 46ba862d1544a06528151550be1784a926ee986580Jason Sams */ 4749a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subElementData(int xoff, int component_number, FieldPacker fp) { 48ba862d1544a06528151550be1784a926ee986580Jason Sams super.setFromFieldPacker(xoff, component_number, fp); 4949a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 50ba862d1544a06528151550be1784a926ee986580Jason Sams /** 51ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 52ba862d1544a06528151550be1784a926ee986580Jason Sams */ 5349a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, int[] d) { 54ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 5549a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 56ba862d1544a06528151550be1784a926ee986580Jason Sams /** 57ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 58ba862d1544a06528151550be1784a926ee986580Jason Sams */ 5949a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, short[] d) { 60ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 6149a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 62ba862d1544a06528151550be1784a926ee986580Jason Sams /** 63ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 64ba862d1544a06528151550be1784a926ee986580Jason Sams */ 6549a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, byte[] d) { 66ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 6749a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 68ba862d1544a06528151550be1784a926ee986580Jason Sams /** 69ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 70ba862d1544a06528151550be1784a926ee986580Jason Sams */ 7149a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, float[] d) { 72ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 7349a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 74304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk /** 75ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 76304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk */ 7749a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData2D(int xoff, int yoff, int w, int h, int[] d) { 78ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy2DRangeFrom(xoff, yoff, w, h, d); 7949a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 80ba862d1544a06528151550be1784a926ee986580Jason Sams /** 81ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 82ba862d1544a06528151550be1784a926ee986580Jason Sams */ 8349a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData2D(int xoff, int yoff, int w, int h, float[] d) { 84ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy2DRangeFrom(xoff, yoff, w, h, d); 85304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk } 86304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk /** 87ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 88304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk */ 8949a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void readData(int[] d) { 90ba862d1544a06528151550be1784a926ee986580Jason Sams super.copyTo(d); 9149a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 92ba862d1544a06528151550be1784a926ee986580Jason Sams /** 93ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 94ba862d1544a06528151550be1784a926ee986580Jason Sams */ 9549a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void readData(float[] d) { 96ba862d1544a06528151550be1784a926ee986580Jason Sams super.copyTo(d); 9749a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 9849a05d7b82956009f03acbb92a064eed054eb031Jason Sams 99ba862d1544a06528151550be1784a926ee986580Jason Sams void initLOD(int lod) { 100ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (lod < 0) { 101ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSIllegalArgumentException("Attempting to set negative lod (" + lod + ")."); 102ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 103ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 104ba862d1544a06528151550be1784a926ee986580Jason Sams int tx = mAdaptedAllocation.mType.getX(); 105ba862d1544a06528151550be1784a926ee986580Jason Sams int ty = mAdaptedAllocation.mType.getY(); 106ba862d1544a06528151550be1784a926ee986580Jason Sams int tz = mAdaptedAllocation.mType.getZ(); 107ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 108ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams for (int ct=0; ct < lod; ct++) { 109ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if ((tx==1) && (ty == 1) && (tz == 1)) { 110ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSIllegalArgumentException("Attempting to set lod (" + lod + ") out of range."); 111ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 112ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 113ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (tx > 1) tx >>= 1; 114ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (ty > 1) ty >>= 1; 115ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (tz > 1) tz >>= 1; 116ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 117ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 118ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentDimX = tx; 119ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentDimY = ty; 120ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentDimZ = tz; 121ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentCount = mCurrentDimX; 122ba862d1544a06528151550be1784a926ee986580Jason Sams if (mCurrentDimY > 1) { 123ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentCount *= mCurrentDimY; 124ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 125ba862d1544a06528151550be1784a926ee986580Jason Sams if (mCurrentDimZ > 1) { 126ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentCount *= mCurrentDimZ; 127ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 128ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedY = 0; 129ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedZ = 0; 130ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 131ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 1329c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 133ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams * Set the active LOD. The LOD must be within the range for the 134ba862d1544a06528151550be1784a926ee986580Jason Sams * type being adapted. The base allocation must have mipmaps. 135ba862d1544a06528151550be1784a926ee986580Jason Sams * 136ba862d1544a06528151550be1784a926ee986580Jason Sams * Because this changes the dimensions of the adapter the 137ba862d1544a06528151550be1784a926ee986580Jason Sams * current Y and Z will be reset. 138ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams * 139ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams * @param lod The LOD to make active. 140ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams */ 14149a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setLOD(int lod) { 142ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mAdaptedAllocation.getType().hasMipmaps()) { 143ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSInvalidStateException("Cannot set LOD when the allocation type does not include mipmaps."); 144ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 145ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (!mConstrainedLOD) { 146ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps."); 147ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 148ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 149ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams initLOD(lod); 15049a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 15149a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1529c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 153ba862d1544a06528151550be1784a926ee986580Jason Sams * Set the active Face. The base allocation must be of a type 154ba862d1544a06528151550be1784a926ee986580Jason Sams * that includes faces. 155ba862d1544a06528151550be1784a926ee986580Jason Sams * 156ba862d1544a06528151550be1784a926ee986580Jason Sams * @param cf The face to make active. 157ba862d1544a06528151550be1784a926ee986580Jason Sams */ 15849a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setFace(Type.CubemapFace cf) { 159ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mAdaptedAllocation.getType().hasFaces()) { 160ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Face when the allocation type does not include faces."); 161ba862d1544a06528151550be1784a926ee986580Jason Sams } 162ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mConstrainedFace) { 163ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps."); 164ba862d1544a06528151550be1784a926ee986580Jason Sams } 165ba862d1544a06528151550be1784a926ee986580Jason Sams if (cf == null) { 166ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSIllegalArgumentException("Cannot set null face."); 167ba862d1544a06528151550be1784a926ee986580Jason Sams } 168ba862d1544a06528151550be1784a926ee986580Jason Sams 169304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk mSelectedFace = cf; 17049a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 17149a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1729c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 173ba862d1544a06528151550be1784a926ee986580Jason Sams * Set the active Y. The y value must be within the range for 174ba862d1544a06528151550be1784a926ee986580Jason Sams * the allocation being adapted. The base allocation must 175ba862d1544a06528151550be1784a926ee986580Jason Sams * contain the Y dimension. 176ba862d1544a06528151550be1784a926ee986580Jason Sams * 177ba862d1544a06528151550be1784a926ee986580Jason Sams * @param y The y to make active. 178ba862d1544a06528151550be1784a926ee986580Jason Sams */ 17949a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setY(int y) { 180ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getY() == 0) { 181ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Y when the allocation type does not include Y dim."); 182ba862d1544a06528151550be1784a926ee986580Jason Sams } 183ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getY() <= y) { 184ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Y greater than dimension of allocation."); 185ba862d1544a06528151550be1784a926ee986580Jason Sams } 186ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mConstrainedY) { 187ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Y when the adapter includes Y."); 188ba862d1544a06528151550be1784a926ee986580Jason Sams } 189ba862d1544a06528151550be1784a926ee986580Jason Sams 190ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedY = y; 19149a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 19249a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1939c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 194ba862d1544a06528151550be1784a926ee986580Jason Sams * Set the active Z. The z value must be within the range for 195ba862d1544a06528151550be1784a926ee986580Jason Sams * the allocation being adapted. The base allocation must 196ba862d1544a06528151550be1784a926ee986580Jason Sams * contain the Z dimension. 197ba862d1544a06528151550be1784a926ee986580Jason Sams * 198ba862d1544a06528151550be1784a926ee986580Jason Sams * @param z The z to make active. 199ba862d1544a06528151550be1784a926ee986580Jason Sams */ 20049a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setZ(int z) { 201ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getZ() == 0) { 202ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Z when the allocation type does not include Z dim."); 203ba862d1544a06528151550be1784a926ee986580Jason Sams } 204ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getZ() <= z) { 205ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Z greater than dimension of allocation."); 206ba862d1544a06528151550be1784a926ee986580Jason Sams } 207ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mConstrainedZ) { 208ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Z when the adapter includes Z."); 209ba862d1544a06528151550be1784a926ee986580Jason Sams } 210ba862d1544a06528151550be1784a926ee986580Jason Sams 211ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedZ = z; 21249a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 21349a05d7b82956009f03acbb92a064eed054eb031Jason Sams 214ba862d1544a06528151550be1784a926ee986580Jason Sams static public AllocationAdapter create1D(RenderScript rs, Allocation a) { 215ba862d1544a06528151550be1784a926ee986580Jason Sams rs.validate(); 216ba862d1544a06528151550be1784a926ee986580Jason Sams AllocationAdapter aa = new AllocationAdapter(0, rs, a); 217ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedLOD = true; 218ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedFace = true; 219ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedY = true; 220ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedZ = true; 221ba862d1544a06528151550be1784a926ee986580Jason Sams aa.initLOD(0); 222ba862d1544a06528151550be1784a926ee986580Jason Sams return aa; 223ba862d1544a06528151550be1784a926ee986580Jason Sams } 22449a05d7b82956009f03acbb92a064eed054eb031Jason Sams 22549a05d7b82956009f03acbb92a064eed054eb031Jason Sams static public AllocationAdapter create2D(RenderScript rs, Allocation a) { 226ba862d1544a06528151550be1784a926ee986580Jason Sams android.util.Log.e("rs", "create2d " + a); 22749a05d7b82956009f03acbb92a064eed054eb031Jason Sams rs.validate(); 22849a05d7b82956009f03acbb92a064eed054eb031Jason Sams AllocationAdapter aa = new AllocationAdapter(0, rs, a); 229ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedLOD = true; 230ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedFace = true; 231ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedY = false; 232ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedZ = true; 233ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.initLOD(0); 23449a05d7b82956009f03acbb92a064eed054eb031Jason Sams return aa; 23549a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 23649a05d7b82956009f03acbb92a064eed054eb031Jason Sams 23749a05d7b82956009f03acbb92a064eed054eb031Jason Sams 2389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 239ba862d1544a06528151550be1784a926ee986580Jason Sams * Override the Allocation resize. Resizing adapters is not 240ba862d1544a06528151550be1784a926ee986580Jason Sams * allowed and will throw a RSInvalidStateException. 241ba862d1544a06528151550be1784a926ee986580Jason Sams * 242ba862d1544a06528151550be1784a926ee986580Jason Sams * @param dimX ignored. 243ba862d1544a06528151550be1784a926ee986580Jason Sams */ 244ba862d1544a06528151550be1784a926ee986580Jason Sams public synchronized void resize(int dimX) { 245ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Resize not allowed for Adapters."); 246ba862d1544a06528151550be1784a926ee986580Jason Sams } 247ba862d1544a06528151550be1784a926ee986580Jason Sams 24849a05d7b82956009f03acbb92a064eed054eb031Jason Sams} 24949a05d7b82956009f03acbb92a064eed054eb031Jason Sams 25049a05d7b82956009f03acbb92a064eed054eb031Jason Sams 251