145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/* 238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams * Copyright (C) 2013 The Android Open Source Project 345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License. 645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at 745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software 1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and 1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License. 1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript; 1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Field; 215d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams 225d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Samsimport android.graphics.ImageFormat; 2345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log; 2445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/** 262192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>A Type describes the {@link android.support.v8.renderscript.Element} and 272192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * dimensions used for an {@link android.support.v8.renderscript.Allocation} or 282192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * a parallel operation. Types are created through 292192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * {@link android.support.v8.renderscript.Type.Builder}.</p> 3045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 312192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>A Type always includes an {@link android.support.v8.renderscript.Element} 322192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * and an X dimension. A Type may be multidimensional, up to three dimensions. 332192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * A nonzero value in the Y or Z dimensions indicates that the dimension is 342192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * present. Note that a Type with only a given X dimension and a Type with the 352192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * same X dimension but Y = 1 are not equivalent.</p> 3645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 37032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>A Type also supports inclusion of level of detail (LOD) or cube map 38032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * faces. LOD and cube map faces are booleans to indicate present or not 39032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * present. </p> 40032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * 41032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>A Type also supports YUV format information to support an {@link 422192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * android.support.v8.renderscript.Allocation} in a YUV format. The YUV formats 432192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * supported are {@link android.graphics.ImageFormat#YV12} and {@link 44032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * android.graphics.ImageFormat#NV21}.</p> 4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <div class="special reference"> 4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <h3>Developer Guides</h3> 482192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>For more information about creating an application that uses RenderScript, 492192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * read the 502192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> 512192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * developer guide.</p> 5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * </div> 5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/ 5445d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class Type extends BaseObj { 5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mDimX; 5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mDimY; 5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mDimZ; 5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams boolean mDimMipmaps; 5945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams boolean mDimFaces; 608fafeb11cf19fdada0add886e99ab0af5d3ddabeJason Sams int mDimYuv; 6145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mElementCount; 6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Element mElement; 6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public enum CubemapFace { 6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams POSITIVE_X (0), 6645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams NEGATIVE_X (1), 6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams POSITIVE_Y (2), 6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams NEGATIVE_Y (3), 6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams POSITIVE_Z (4), 7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams NEGATIVE_Z (5); 7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mID; 7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams CubemapFace(int id) { 7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mID = id; 7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return the element associated with this Type. 8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return Element 8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Element getElement() { 8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mElement; 8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return the value of the X dimension. 8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return int 9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public int getX() { 9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mDimX; 9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return the value of the Y dimension or 0 for a 1D allocation. 9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return int 10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public int getY() { 10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mDimY; 10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return the value of the Z dimension or 0 for a 1D or 2D allocation. 10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return int 10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public int getZ() { 11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mDimZ; 11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 115032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Get the YUV format 116032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * 117032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * @return int 118032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines */ 119032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines public int getYuv() { 120032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines return mDimYuv; 121032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines } 122032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines 123032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines /** 12445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return if the Type has a mipmap chain. 12545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 12645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return boolean 12745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 12845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public boolean hasMipmaps() { 12945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mDimMipmaps; 13045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 13245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 13345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return if the Type is a cube map. 13445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 13545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return boolean 13645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 13745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public boolean hasFaces() { 13845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mDimFaces; 13945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 14045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 14145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 14245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Return the total number of accessable cells in the Type. 14345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 14445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return int 14545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 14645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public int getCount() { 14745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return mElementCount; 14845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 14945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams void calcElementCount() { 15145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams boolean hasLod = hasMipmaps(); 15245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int x = getX(); 15345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int y = getY(); 15445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int z = getZ(); 15545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int faces = 1; 15645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (hasFaces()) { 15745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams faces = 6; 15845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (x == 0) { 16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams x = 1; 16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 16245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (y == 0) { 16345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams y = 1; 16445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 16545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (z == 0) { 16645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams z = 1; 16745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 16845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 16945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int count = x * y * z * faces; 17045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 17145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams while (hasLod && ((x > 1) || (y > 1) || (z > 1))) { 17245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if(x > 1) { 17345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams x >>= 1; 17445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 17545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if(y > 1) { 17645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams y >>= 1; 17745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 17845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if(z > 1) { 17945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams z >>= 1; 18045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 18145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 18245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams count += x * y * z * faces; 18345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 18445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mElementCount = count; 18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 18745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 188bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang Type(long id, RenderScript rs) { 18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams super(id, rs); 19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /* 1936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Get an identical dummy Type for Compat Context 1946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 1956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 1966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public long getDummyType(RenderScript mRS, long eid) { 1976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang return mRS.nIncTypeCreate(eid, mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mDimYuv); 1986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 1996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 201b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * Utility function for creating basic 1D types. The type is 202b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * created without mipmaps enabled. 203b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * 204b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param rs The RenderScript context 205b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param e The Element for the Type 206b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param dimX The X dimension, must be > 0 207b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * 208b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @return Type 209b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang */ 210b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang static public Type createX(RenderScript rs, Element e, int dimX) { 211b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang if (dimX < 1) { 212b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang throw new RSInvalidStateException("Dimension must be >= 1."); 213b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang } 214b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang 215b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0); 216b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang Type t = new Type(id, rs); 217b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mElement = e; 218b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mDimX = dimX; 219b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.calcElementCount(); 220b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang return t; 221b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang } 222b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang 223b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang /** 224b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * Utility function for creating basic 2D types. The type is 225b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * created without mipmaps or cubemaps. 226b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * 227b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param rs The RenderScript context 228b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param e The Element for the Type 229b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param dimX The X dimension, must be > 0 230b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param dimY The Y dimension, must be > 0 231b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * 232b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @return Type 233b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang */ 234b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) { 235b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang if ((dimX < 1) || (dimY < 1)) { 236b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang throw new RSInvalidStateException("Dimension must be >= 1."); 237b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang } 238b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang 239b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0); 240b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang Type t = new Type(id, rs); 241b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mElement = e; 242b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mDimX = dimX; 243b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mDimY = dimY; 244b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.calcElementCount(); 245b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang return t; 246b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang } 247b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang 248b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang /** 249b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * Utility function for creating basic 3D types. The type is 250b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * created without mipmaps. 251b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * 252b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param rs The RenderScript context 253b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param e The Element for the Type 254b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param dimX The X dimension, must be > 0 255b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param dimY The Y dimension, must be > 0 256b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @param dimZ The Z dimension, must be > 0 257b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * 258b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang * @return Type 259b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang */ 260b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) { 261b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) { 262b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang throw new RSInvalidStateException("Dimension must be >= 1."); 263b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang } 264b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang 265b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0); 266b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang Type t = new Type(id, rs); 267b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mElement = e; 268b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mDimX = dimX; 269b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mDimY = dimY; 270b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.mDimZ = dimZ; 271b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang t.calcElementCount(); 272b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang return t; 273b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang } 274b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang 275b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang /** 27645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Builder class for Type. 27745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 27845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 27945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public static class Builder { 28045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams RenderScript mRS; 28145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mDimX = 1; 28245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mDimY; 28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int mDimZ; 28445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams boolean mDimMipmaps; 28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams boolean mDimFaces; 2865d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams int mYuv; 28745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 28845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams Element mElement; 28945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 29045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Create a new builder object. 29245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rs 29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param e The element for the type to be created. 29545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 29645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Builder(RenderScript rs, Element e) { 29745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams e.checkValid(); 29845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mRS = rs; 29945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mElement = e; 30045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 30145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 30245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 30345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Add a dimension to the Type. 30445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 30545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 30645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param value 30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 30845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Builder setX(int value) { 30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if(value < 1) { 31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid."); 31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mDimX = value; 31345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return this; 31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Builder setY(int value) { 31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if(value < 1) { 31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid."); 31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mDimY = value; 32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return this; 32245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 32345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3249c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray public Builder setZ(int value) { 3259c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray if(value < 1) { 3269c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid."); 3279c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray } 3289c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray mDimZ = value; 3299c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray return this; 3309c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray } 3319c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray 33245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Builder setMipmaps(boolean value) { 33345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mDimMipmaps = value; 33445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return this; 33545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 33645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 33745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Builder setFaces(boolean value) { 33845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams mDimFaces = value; 33945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return this; 34045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 34145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3425d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams /** 343032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Set the YUV layout for a Type. 344032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * 345032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * @param yuvFormat {@link android.graphics.ImageFormat#YV12} or {@link android.graphics.ImageFormat#NV21} 3465d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams */ 3475d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams public Builder setYuvFormat(int yuvFormat) { 3485d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams switch (yuvFormat) { 3495d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams case android.graphics.ImageFormat.NV21: 3505d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams case android.graphics.ImageFormat.YV12: 3515d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams break; 3525d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams 3535d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams default: 3545d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams throw new RSIllegalArgumentException("Only NV21 and YV12 are supported.."); 3555d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams } 3565d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams 3575d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams mYuv = yuvFormat; 3585d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams return this; 3595d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams } 3605d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams 36145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 36245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 363032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Validate structure and create a new Type. 36445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 36545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @return Type 36645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 36745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams public Type create() { 36845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (mDimZ > 0) { 36945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if ((mDimX < 1) || (mDimY < 1)) { 37045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSInvalidStateException("Both X and Y dimension required when Z is present."); 37145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 37245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (mDimFaces) { 37345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSInvalidStateException("Cube maps not supported with 3D types."); 37445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 37545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 37645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (mDimY > 0) { 37745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (mDimX < 1) { 37845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSInvalidStateException("X dimension required when Y is present."); 37945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 38045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 38145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (mDimFaces) { 38245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (mDimY < 1) { 38345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSInvalidStateException("Cube maps require 2D Types."); 38445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 38545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 38645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3875d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams if (mYuv != 0) { 3885d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams if ((mDimZ != 0) || mDimFaces || mDimMipmaps) { 3895d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams throw new RSInvalidStateException("YUV only supports basic 2D."); 3905d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams } 3915d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams } 3925d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams 393baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray Type t; 394bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang long id = mRS.nTypeCreate(mElement.getID(mRS), 395470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv); 396470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang t = new Type(id, mRS); 397470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang 39845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.mElement = mElement; 39945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.mDimX = mDimX; 40045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.mDimY = mDimY; 40145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.mDimZ = mDimZ; 40245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.mDimMipmaps = mDimMipmaps; 40345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.mDimFaces = mDimFaces; 4045d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams t.mDimYuv = mYuv; 40545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 40645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams t.calcElementCount(); 40745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return t; 40845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 40945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 41045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 41145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams} 412