1b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/* 2dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams * Copyright (C) 2013 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 199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 20c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>A Type describes the {@link android.renderscript.Element} and dimensions used for an {@link 21c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation} or a parallel operation. Types are created through {@link 22c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Type.Builder}.</p> 23a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 24c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>A Type always includes an {@link android.renderscript.Element} and an X 25c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * dimension. A Type may be multidimensional, up to three dimensions. A nonzero 26c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * value in the Y or Z dimensions indicates that the dimension is present. Note 27c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * that a Type with only a given X dimension and a Type with the same X 28c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * dimension but Y = 1 are not equivalent.</p> 29a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 30c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>A Type also supports inclusion of level of detail (LOD) or cube map 31c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * faces. LOD and cube map faces are booleans to indicate present or not 32c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * present. </p> 33c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * 34ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * <p>A Type also supports YUV format information to support an 35ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * {@link android.renderscript.Allocation} in a YUV format. The YUV formats 36ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * supported are {@link android.graphics.ImageFormat#YV12}, 37ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * {@link android.graphics.ImageFormat#NV21}, and 38ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * {@link android.graphics.ImageFormat#YUV_420_888}</p> 39a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 403aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 413aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 42c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>For more information about creating an application that uses RenderScript, read the 43c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p> 443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 45b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/ 46b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Type extends BaseObj { 47768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mDimX; 48768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mDimY; 49768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mDimZ; 50bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams boolean mDimMipmaps; 51768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams boolean mDimFaces; 528140d7b0f62a6e5b54e318c959f2d501f7ee6784Jason Sams int mDimYuv; 53768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mElementCount; 541bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams Element mElement; 55768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 5649a05d7b82956009f03acbb92a064eed054eb031Jason Sams public enum CubemapFace { 5720fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines POSITIVE_X (0), 5849a05d7b82956009f03acbb92a064eed054eb031Jason Sams NEGATIVE_X (1), 5920fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines POSITIVE_Y (2), 6049a05d7b82956009f03acbb92a064eed054eb031Jason Sams NEGATIVE_Y (3), 6120fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines POSITIVE_Z (4), 6220fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines NEGATIVE_Z (5), 6320fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines @Deprecated 6420fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines POSITVE_X (0), 6520fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines @Deprecated 6620fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines POSITVE_Y (2), 6720fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines @Deprecated 6820fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines POSITVE_Z (4); 6949a05d7b82956009f03acbb92a064eed054eb031Jason Sams 7049a05d7b82956009f03acbb92a064eed054eb031Jason Sams int mID; 7149a05d7b82956009f03acbb92a064eed054eb031Jason Sams CubemapFace(int id) { 7249a05d7b82956009f03acbb92a064eed054eb031Jason Sams mID = id; 7349a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 7449a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 7549a05d7b82956009f03acbb92a064eed054eb031Jason Sams 769c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 77a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return the element associated with this Type. 78a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 79a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return Element 80a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 81e17964e150e459bacced5658ae36fe1c56082e37Jason Sams public Element getElement() { 82e17964e150e459bacced5658ae36fe1c56082e37Jason Sams return mElement; 83e17964e150e459bacced5658ae36fe1c56082e37Jason Sams } 841bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 859c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 86a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return the value of the X dimension. 87a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 88a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return int 89a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 90768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getX() { 91768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimX; 92768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 93a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams 949c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 95a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return the value of the Y dimension or 0 for a 1D allocation. 96a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 97a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return int 98a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 99768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getY() { 100768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimY; 101768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 102a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams 1039c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 104a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return the value of the Z dimension or 0 for a 1D or 2D allocation. 105a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 106a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return int 107a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 108768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getZ() { 109768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimZ; 110768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 111a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams 1129c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 1135a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams * Get the YUV format 1145a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams * 11502d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams * 1165a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams * @return int 1175a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams */ 1185a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams public int getYuv() { 1195a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams return mDimYuv; 1205a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams } 1215a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams 1225a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams /** 123a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return if the Type has a mipmap chain. 124a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 125a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return boolean 126a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 127bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public boolean hasMipmaps() { 128bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams return mDimMipmaps; 129768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 130a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams 1319c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 132a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return if the Type is a cube map. 133a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 134a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return boolean 135a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 136bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public boolean hasFaces() { 137768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimFaces; 138768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 139a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams 1409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 141a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Return the total number of accessable cells in the Type. 142a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 143a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return int 144a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 145bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public int getCount() { 146768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mElementCount; 147768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 148768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 149768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams void calcElementCount() { 150bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams boolean hasLod = hasMipmaps(); 151768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int x = getX(); 152768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int y = getY(); 153768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int z = getZ(); 154768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int faces = 1; 155bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (hasFaces()) { 156768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams faces = 6; 157768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 158bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (x == 0) { 159768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams x = 1; 160768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 161bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (y == 0) { 162768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams y = 1; 163768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 164bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (z == 0) { 165768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams z = 1; 166768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 167768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 168768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int count = x * y * z * faces; 1699ea30a69d5c1d5b137b0186116eb74261b3b5a5eAlex Sakhartchouk 1709ea30a69d5c1d5b137b0186116eb74261b3b5a5eAlex Sakhartchouk while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { 171768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(x > 1) { 172768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams x >>= 1; 173768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 174768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(y > 1) { 175768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams y >>= 1; 176768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 177768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(z > 1) { 178768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams z >>= 1; 179768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 180768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 181768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams count += x * y * z * faces; 182768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 183768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mElementCount = count; 184768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 185768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 186768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 187460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray Type(long id, RenderScript rs) { 1880de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 18943ee06857bb7f99446d1d84f8789016c5d105558Jason Sams } 19043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 191dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk @Override 192dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk void updateFromNative() { 1939807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat // We have 6 integer/long to obtain mDimX; mDimY; mDimZ; 194dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk // mDimLOD; mDimFaces; mElement; 1959807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat long[] dataBuffer = new long[6]; 1969807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat mRS.nTypeGetNativeData(getID(mRS), dataBuffer); 197dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 1989807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat mDimX = (int)dataBuffer[0]; 1999807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat mDimY = (int)dataBuffer[1]; 2009807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat mDimZ = (int)dataBuffer[2]; 201bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mDimMipmaps = dataBuffer[3] == 1 ? true : false; 202dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mDimFaces = dataBuffer[4] == 1 ? true : false; 203dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 2049807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat long elementID = dataBuffer[5]; 205dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk if(elementID != 0) { 2060de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk mElement = new Element(elementID, mRS); 207dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mElement.updateFromNative(); 208dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 209dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk calcElementCount(); 210dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 211dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 2129c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 213ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * Utility function for creating basic 1D types. The type is 214ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * created without mipmaps enabled. 215ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * 216ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param rs The RenderScript context 217ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param e The Element for the Type 218ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param dimX The X dimension, must be > 0 219ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * 220ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @return Type 221ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams */ 222ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams static public Type createX(RenderScript rs, Element e, int dimX) { 223ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams if (dimX < 1) { 224ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams throw new RSInvalidStateException("Dimension must be >= 1."); 225ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams } 226ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams 227460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0); 228ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams Type t = new Type(id, rs); 229ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mElement = e; 230ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mDimX = dimX; 231ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.calcElementCount(); 232ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams return t; 233ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams } 234ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams 235ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams /** 236ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * Utility function for creating basic 2D types. The type is 237ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * created without mipmaps or cubemaps. 238ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * 239ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param rs The RenderScript context 240ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param e The Element for the Type 241ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param dimX The X dimension, must be > 0 242ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param dimY The Y dimension, must be > 0 243ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * 244ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @return Type 245ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams */ 246ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) { 247ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams if ((dimX < 1) || (dimY < 1)) { 248ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams throw new RSInvalidStateException("Dimension must be >= 1."); 249ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams } 250ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams 251460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0); 252ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams Type t = new Type(id, rs); 253ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mElement = e; 254ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mDimX = dimX; 255ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mDimY = dimY; 256ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.calcElementCount(); 257ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams return t; 258ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams } 259ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams 260ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams /** 261ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * Utility function for creating basic 3D types. The type is 262ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * created without mipmaps. 263ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * 264ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param rs The RenderScript context 265ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param e The Element for the Type 266ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param dimX The X dimension, must be > 0 267ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param dimY The Y dimension, must be > 0 268ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @param dimZ The Z dimension, must be > 0 269ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * 270ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams * @return Type 271ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams */ 272ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) { 273ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) { 274ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams throw new RSInvalidStateException("Dimension must be >= 1."); 275ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams } 276ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams 277460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0); 278ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams Type t = new Type(id, rs); 279ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mElement = e; 280ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mDimX = dimX; 281ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mDimY = dimY; 282ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.mDimZ = dimZ; 283ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams t.calcElementCount(); 284ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams return t; 285ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams } 286ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams 287ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams /** 288a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Builder class for Type. 289a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 290a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 291b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public static class Builder { 292b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams RenderScript mRS; 293bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams int mDimX = 1; 294bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams int mDimY; 295bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams int mDimZ; 296bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams boolean mDimMipmaps; 297bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams boolean mDimFaces; 298b109cc78616abee7291eb42094cd156b5db3355dJason Sams int mYuv; 299b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 300bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams Element mElement; 301b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 303a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Create a new builder object. 304a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 305a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @param rs 306a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @param e The element for the type to be created. 307a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 30822534176fb5c1257130ef4ee589739ca42766a32Jason Sams public Builder(RenderScript rs, Element e) { 309bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams e.checkValid(); 31022534176fb5c1257130ef4ee589739ca42766a32Jason Sams mRS = rs; 31122534176fb5c1257130ef4ee589739ca42766a32Jason Sams mElement = e; 312b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 313b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 3149c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 315a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Add a dimension to the Type. 316a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 317a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 318a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @param value 319a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 320bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public Builder setX(int value) { 3213c0dfbab807a459622aeade4940daddf482dec66Jason Sams if(value < 1) { 322bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid."); 3233c0dfbab807a459622aeade4940daddf482dec66Jason Sams } 324bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mDimX = value; 325bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams return this; 326bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams } 3273b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams 328bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public Builder setY(int value) { 329bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if(value < 1) { 330bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid."); 33122534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 332bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mDimY = value; 333bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams return this; 334bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams } 335bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams 336d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams public Builder setZ(int value) { 337d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams if(value < 1) { 338d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid."); 339d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams } 340d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams mDimZ = value; 341d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams return this; 342d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams } 343d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams 344bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public Builder setMipmaps(boolean value) { 345bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mDimMipmaps = value; 346bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams return this; 34722534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 34822534176fb5c1257130ef4ee589739ca42766a32Jason Sams 349bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public Builder setFaces(boolean value) { 350bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mDimFaces = value; 351bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams return this; 352bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams } 353bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams 354b109cc78616abee7291eb42094cd156b5db3355dJason Sams /** 355c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Set the YUV layout for a Type. 356b109cc78616abee7291eb42094cd156b5db3355dJason Sams * 357ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * @param yuvFormat {@link android.graphics.ImageFormat#YV12}, {@link android.graphics.ImageFormat#NV21}, or 358ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala * {@link android.graphics.ImageFormat#YUV_420_888}. 359b109cc78616abee7291eb42094cd156b5db3355dJason Sams */ 360b109cc78616abee7291eb42094cd156b5db3355dJason Sams public Builder setYuvFormat(int yuvFormat) { 361b109cc78616abee7291eb42094cd156b5db3355dJason Sams switch (yuvFormat) { 362b109cc78616abee7291eb42094cd156b5db3355dJason Sams case android.graphics.ImageFormat.NV21: 363b109cc78616abee7291eb42094cd156b5db3355dJason Sams case android.graphics.ImageFormat.YV12: 364ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala case android.graphics.ImageFormat.YUV_420_888: 365b109cc78616abee7291eb42094cd156b5db3355dJason Sams break; 366b109cc78616abee7291eb42094cd156b5db3355dJason Sams 367b109cc78616abee7291eb42094cd156b5db3355dJason Sams default: 368ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala throw new RSIllegalArgumentException( 369ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala "Only ImageFormat.NV21, .YV12, and .YUV_420_888 are supported.."); 370b109cc78616abee7291eb42094cd156b5db3355dJason Sams } 371b109cc78616abee7291eb42094cd156b5db3355dJason Sams 372b109cc78616abee7291eb42094cd156b5db3355dJason Sams mYuv = yuvFormat; 373b109cc78616abee7291eb42094cd156b5db3355dJason Sams return this; 374b109cc78616abee7291eb42094cd156b5db3355dJason Sams } 375b109cc78616abee7291eb42094cd156b5db3355dJason Sams 376bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams 3779c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 378c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Validate structure and create a new Type. 379a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * 380a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * @return Type 381a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams */ 3823b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams public Type create() { 383bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (mDimZ > 0) { 384bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if ((mDimX < 1) || (mDimY < 1)) { 385a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams throw new RSInvalidStateException("Both X and Y dimension required when Z is present."); 386a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 387bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (mDimFaces) { 388a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams throw new RSInvalidStateException("Cube maps not supported with 3D types."); 389a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 390a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 391bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (mDimY > 0) { 392bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (mDimX < 1) { 393a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams throw new RSInvalidStateException("X dimension required when Y is present."); 394a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 395a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 396bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (mDimFaces) { 397bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (mDimY < 1) { 398a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams throw new RSInvalidStateException("Cube maps require 2D Types."); 399a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 400a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams } 401a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams 402b109cc78616abee7291eb42094cd156b5db3355dJason Sams if (mYuv != 0) { 403b109cc78616abee7291eb42094cd156b5db3355dJason Sams if ((mDimZ != 0) || mDimFaces || mDimMipmaps) { 404b109cc78616abee7291eb42094cd156b5db3355dJason Sams throw new RSInvalidStateException("YUV only supports basic 2D."); 405b109cc78616abee7291eb42094cd156b5db3355dJason Sams } 406b109cc78616abee7291eb42094cd156b5db3355dJason Sams } 407b109cc78616abee7291eb42094cd156b5db3355dJason Sams 408460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = mRS.nTypeCreate(mElement.getID(mRS), 409b109cc78616abee7291eb42094cd156b5db3355dJason Sams mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv); 410bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams Type t = new Type(id, mRS); 411bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams t.mElement = mElement; 412bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams t.mDimX = mDimX; 413bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams t.mDimY = mDimY; 414bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams t.mDimZ = mDimZ; 415bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams t.mDimMipmaps = mDimMipmaps; 416bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams t.mDimFaces = mDimFaces; 417b109cc78616abee7291eb42094cd156b5db3355dJason Sams t.mDimYuv = mYuv; 418bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams 419768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.calcElementCount(); 4201bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams return t; 421b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 422b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 423b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 424b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams} 425