Type.java revision 5a722cf8b2dc7c6b4acc937a6d68bc88e1702d78
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.renderscript; 18 19 20import java.lang.reflect.Field; 21 22import android.graphics.ImageFormat; 23import android.util.Log; 24 25/** 26 * <p>Type is an allocation template. It consists of an Element and one or more 27 * dimensions. It describes only the layout of memory but does not allocate any 28 * storage for the data that is described.</p> 29 * 30 * <p>A Type consists of several dimensions. Those are X, Y, Z, LOD (level of 31 * detail), Faces (faces of a cube map). The X,Y,Z dimensions can be assigned 32 * any positive integral value within the constraints of available memory. A 33 * single dimension allocation would have an X dimension of greater than zero 34 * while the Y and Z dimensions would be zero to indicate not present. In this 35 * regard an allocation of x=10, y=1 would be considered 2 dimensionsal while 36 * x=10, y=0 would be considered 1 dimensional.</p> 37 * 38 * <p>The LOD and Faces dimensions are booleans to indicate present or not present.</p> 39 * 40 * <div class="special reference"> 41 * <h3>Developer Guides</h3> 42 * <p>For more information about creating an application that uses Renderscript, read the 43 * <a href="{@docRoot}guide/topics/renderscript/index.html">Renderscript</a> developer guide.</p> 44 * </div> 45 **/ 46public class Type extends BaseObj { 47 int mDimX; 48 int mDimY; 49 int mDimZ; 50 boolean mDimMipmaps; 51 boolean mDimFaces; 52 int mDimYuv; 53 int mElementCount; 54 Element mElement; 55 56 public enum CubemapFace { 57 POSITIVE_X (0), 58 NEGATIVE_X (1), 59 POSITIVE_Y (2), 60 NEGATIVE_Y (3), 61 POSITIVE_Z (4), 62 NEGATIVE_Z (5), 63 @Deprecated 64 POSITVE_X (0), 65 @Deprecated 66 POSITVE_Y (2), 67 @Deprecated 68 POSITVE_Z (4); 69 70 int mID; 71 CubemapFace(int id) { 72 mID = id; 73 } 74 } 75 76 /** 77 * Return the element associated with this Type. 78 * 79 * @return Element 80 */ 81 public Element getElement() { 82 return mElement; 83 } 84 85 /** 86 * Return the value of the X dimension. 87 * 88 * @return int 89 */ 90 public int getX() { 91 return mDimX; 92 } 93 94 /** 95 * Return the value of the Y dimension or 0 for a 1D allocation. 96 * 97 * @return int 98 */ 99 public int getY() { 100 return mDimY; 101 } 102 103 /** 104 * Return the value of the Z dimension or 0 for a 1D or 2D allocation. 105 * 106 * @return int 107 */ 108 public int getZ() { 109 return mDimZ; 110 } 111 112 /** 113 * Get the YUV format 114 * 115 * @hide 116 * @return int 117 */ 118 public int getYuv() { 119 return mDimYuv; 120 } 121 122 /** 123 * Return if the Type has a mipmap chain. 124 * 125 * @return boolean 126 */ 127 public boolean hasMipmaps() { 128 return mDimMipmaps; 129 } 130 131 /** 132 * Return if the Type is a cube map. 133 * 134 * @return boolean 135 */ 136 public boolean hasFaces() { 137 return mDimFaces; 138 } 139 140 /** 141 * Return the total number of accessable cells in the Type. 142 * 143 * @return int 144 */ 145 public int getCount() { 146 return mElementCount; 147 } 148 149 void calcElementCount() { 150 boolean hasLod = hasMipmaps(); 151 int x = getX(); 152 int y = getY(); 153 int z = getZ(); 154 int faces = 1; 155 if (hasFaces()) { 156 faces = 6; 157 } 158 if (x == 0) { 159 x = 1; 160 } 161 if (y == 0) { 162 y = 1; 163 } 164 if (z == 0) { 165 z = 1; 166 } 167 168 int count = x * y * z * faces; 169 170 while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { 171 if(x > 1) { 172 x >>= 1; 173 } 174 if(y > 1) { 175 y >>= 1; 176 } 177 if(z > 1) { 178 z >>= 1; 179 } 180 181 count += x * y * z * faces; 182 } 183 mElementCount = count; 184 } 185 186 187 Type(int id, RenderScript rs) { 188 super(id, rs); 189 } 190 191 @Override 192 void updateFromNative() { 193 // We have 6 integer to obtain mDimX; mDimY; mDimZ; 194 // mDimLOD; mDimFaces; mElement; 195 int[] dataBuffer = new int[6]; 196 mRS.nTypeGetNativeData(getID(mRS), dataBuffer); 197 198 mDimX = dataBuffer[0]; 199 mDimY = dataBuffer[1]; 200 mDimZ = dataBuffer[2]; 201 mDimMipmaps = dataBuffer[3] == 1 ? true : false; 202 mDimFaces = dataBuffer[4] == 1 ? true : false; 203 204 int elementID = dataBuffer[5]; 205 if(elementID != 0) { 206 mElement = new Element(elementID, mRS); 207 mElement.updateFromNative(); 208 } 209 calcElementCount(); 210 } 211 212 /** 213 * Builder class for Type. 214 * 215 */ 216 public static class Builder { 217 RenderScript mRS; 218 int mDimX = 1; 219 int mDimY; 220 int mDimZ; 221 boolean mDimMipmaps; 222 boolean mDimFaces; 223 int mYuv; 224 225 Element mElement; 226 227 /** 228 * Create a new builder object. 229 * 230 * @param rs 231 * @param e The element for the type to be created. 232 */ 233 public Builder(RenderScript rs, Element e) { 234 e.checkValid(); 235 mRS = rs; 236 mElement = e; 237 } 238 239 /** 240 * Add a dimension to the Type. 241 * 242 * 243 * @param value 244 */ 245 public Builder setX(int value) { 246 if(value < 1) { 247 throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid."); 248 } 249 mDimX = value; 250 return this; 251 } 252 253 public Builder setY(int value) { 254 if(value < 1) { 255 throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid."); 256 } 257 mDimY = value; 258 return this; 259 } 260 261 public Builder setZ(int value) { 262 if(value < 1) { 263 throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid."); 264 } 265 mDimZ = value; 266 return this; 267 } 268 269 public Builder setMipmaps(boolean value) { 270 mDimMipmaps = value; 271 return this; 272 } 273 274 public Builder setFaces(boolean value) { 275 mDimFaces = value; 276 return this; 277 } 278 279 /** 280 * @hide 281 * 282 * only NV21, YV12. Enums from ImageFormat 283 */ 284 public Builder setYuvFormat(int yuvFormat) { 285 switch (yuvFormat) { 286 case android.graphics.ImageFormat.NV21: 287 case android.graphics.ImageFormat.YV12: 288 break; 289 290 default: 291 throw new RSIllegalArgumentException("Only NV21 and YV12 are supported.."); 292 } 293 294 mYuv = yuvFormat; 295 return this; 296 } 297 298 299 /** 300 * Validate structure and create a new type. 301 * 302 * @return Type 303 */ 304 public Type create() { 305 if (mDimZ > 0) { 306 if ((mDimX < 1) || (mDimY < 1)) { 307 throw new RSInvalidStateException("Both X and Y dimension required when Z is present."); 308 } 309 if (mDimFaces) { 310 throw new RSInvalidStateException("Cube maps not supported with 3D types."); 311 } 312 } 313 if (mDimY > 0) { 314 if (mDimX < 1) { 315 throw new RSInvalidStateException("X dimension required when Y is present."); 316 } 317 } 318 if (mDimFaces) { 319 if (mDimY < 1) { 320 throw new RSInvalidStateException("Cube maps require 2D Types."); 321 } 322 } 323 324 if (mYuv != 0) { 325 if ((mDimZ != 0) || mDimFaces || mDimMipmaps) { 326 throw new RSInvalidStateException("YUV only supports basic 2D."); 327 } 328 } 329 330 int id = mRS.nTypeCreate(mElement.getID(mRS), 331 mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv); 332 Type t = new Type(id, mRS); 333 t.mElement = mElement; 334 t.mDimX = mDimX; 335 t.mDimY = mDimY; 336 t.mDimZ = mDimZ; 337 t.mDimMipmaps = mDimMipmaps; 338 t.mDimFaces = mDimFaces; 339 t.mDimYuv = mYuv; 340 341 t.calcElementCount(); 342 return t; 343 } 344 } 345 346} 347