[go: nahoru, domu]

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;
5546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    int mArrays[];
5646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
5746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    static final int mMaxArrays = 4;
58768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
5949a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public enum CubemapFace {
6020fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        POSITIVE_X (0),
6149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        NEGATIVE_X (1),
6220fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        POSITIVE_Y (2),
6349a05d7b82956009f03acbb92a064eed054eb031Jason Sams        NEGATIVE_Y (3),
6420fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        POSITIVE_Z (4),
6520fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        NEGATIVE_Z (5),
6620fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        @Deprecated
6720fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        POSITVE_X (0),
6820fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        @Deprecated
6920fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        POSITVE_Y (2),
7020fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        @Deprecated
7120fbd01335f3a41ab78e0bb9f70124665afb1e3bStephen Hines        POSITVE_Z (4);
7249a05d7b82956009f03acbb92a064eed054eb031Jason Sams
7349a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int mID;
7449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        CubemapFace(int id) {
7549a05d7b82956009f03acbb92a064eed054eb031Jason Sams            mID = id;
7649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
7749a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
7849a05d7b82956009f03acbb92a064eed054eb031Jason Sams
799c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
80a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the element associated with this Type.
81a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
82a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
83a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
84e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    public Element getElement() {
85e17964e150e459bacced5658ae36fe1c56082e37Jason Sams        return mElement;
86e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    }
871bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
889c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
89a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the X dimension.
90a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
91a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
92a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
93768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getX() {
94768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimX;
95768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
96a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
979c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
98a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the Y dimension or 0 for a 1D allocation.
99a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
100a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
101a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
102768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getY() {
103768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimY;
104768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
105a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
1069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
107a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
108a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
109a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
110a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
111768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getZ() {
112768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimZ;
113768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
114a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
1159c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1165a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams     * Get the YUV format
1175a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams     *
11802d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams     *
1195a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams     * @return int
1205a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams     */
1215a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams    public int getYuv() {
1225a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams        return mDimYuv;
1235a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams    }
1245a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams
1255a722cf8b2dc7c6b4acc937a6d68bc88e1702d78Jason Sams    /**
126a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if the Type has a mipmap chain.
127a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
128a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
129a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
130bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public boolean hasMipmaps() {
131bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        return mDimMipmaps;
132768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
133a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
1349c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
135a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if the Type is a cube map.
136a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
137a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
138a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
139bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public boolean hasFaces() {
140768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimFaces;
141768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
142a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
1439c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
144a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the total number of accessable cells in the Type.
145a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
146a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
147a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
148bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public int getCount() {
149768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mElementCount;
150768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
151768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
15246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    /**
153d016266de2cefe12853dbf4a81292b96bb4150b1Jason Sams     * @hide
1546a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      * Return the dimension of the specified array.
1556a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      *
1566a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      * @param arrayNum  The array dimension to query
1576a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      * @return int
1586a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      */
1596a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams    public int getArray(int arrayNum) {
1606a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        if ((arrayNum < 0) || (arrayNum >= mMaxArrays)) {
16146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            throw new RSIllegalArgumentException("Array dimension out of range.");
16246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        }
16346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1646a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        if (mArrays == null || arrayNum >= mArrays.length) {
16546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            // Dimension in range but no array for that dimension allocated
16646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            return 0;
16746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        }
16846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
1696a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        return mArrays[arrayNum];
17046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
17146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
17246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    /**
173d016266de2cefe12853dbf4a81292b96bb4150b1Jason Sams     * @hide
1746a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      * Return the number of array dimensions.
1756a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      *
1766a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      * @return int
1776a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams      */
17846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    public int getArrayCount() {
17946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        if (mArrays != null) return mArrays.length;
18046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        return 0;
18146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams    }
18246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
183768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    void calcElementCount() {
184bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean hasLod = hasMipmaps();
185768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int x = getX();
186768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int y = getY();
187768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int z = getZ();
188768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int faces = 1;
189bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (hasFaces()) {
190768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            faces = 6;
191768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
192bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (x == 0) {
193768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            x = 1;
194768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
195bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (y == 0) {
196768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            y = 1;
197768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
198bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (z == 0) {
199768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            z = 1;
200768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
201768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
202768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int count = x * y * z * faces;
2039ea30a69d5c1d5b137b0186116eb74261b3b5a5eAlex Sakhartchouk
2049ea30a69d5c1d5b137b0186116eb74261b3b5a5eAlex Sakhartchouk        while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
205768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(x > 1) {
206768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                x >>= 1;
207768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
208768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(y > 1) {
209768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                y >>= 1;
210768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
211768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(z > 1) {
212768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                z >>= 1;
213768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
214768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
215768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            count += x * y * z * faces;
216768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
21746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
21846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        if (mArrays != null) {
21946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            for (int ct = 0; ct < mArrays.length; ct++) {
22046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                count *= mArrays[ct];
22146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            }
22246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        }
22346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
224768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        mElementCount = count;
225768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
226768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
227768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
228460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    Type(long id, RenderScript rs) {
2290de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
2306484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        guard.open("destroy");
23143ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
23243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
233dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
234dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
2359807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        // We have 6 integer/long to obtain mDimX; mDimY; mDimZ;
236dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // mDimLOD; mDimFaces; mElement;
2379807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        long[] dataBuffer = new long[6];
2389807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        mRS.nTypeGetNativeData(getID(mRS), dataBuffer);
239dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
2409807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        mDimX = (int)dataBuffer[0];
2419807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        mDimY = (int)dataBuffer[1];
2429807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        mDimZ = (int)dataBuffer[2];
243bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        mDimMipmaps = dataBuffer[3] == 1 ? true : false;
244dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimFaces = dataBuffer[4] == 1 ? true : false;
245dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
2469807155b11a25fb6068edc9b1cd82928ac2f05deAshok Bhat        long elementID = dataBuffer[5];
247dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(elementID != 0) {
2480de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            mElement = new Element(elementID, mRS);
249dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElement.updateFromNative();
250dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
251dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        calcElementCount();
252dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
253dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
2549c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
255ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * Utility function for creating basic 1D types. The type is
256ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * created without mipmaps enabled.
257ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     *
258ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param rs The RenderScript context
259ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param e The Element for the Type
260ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param dimX The X dimension, must be > 0
261ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     *
262ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @return Type
263ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     */
264ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    static public Type createX(RenderScript rs, Element e, int dimX) {
265ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        if (dimX < 1) {
266ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams            throw new RSInvalidStateException("Dimension must be >= 1.");
267ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        }
268ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams
269460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0);
270ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        Type t = new Type(id, rs);
271ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mElement = e;
272ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mDimX = dimX;
273ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.calcElementCount();
274ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        return t;
275ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    }
276ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams
277ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    /**
278ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * Utility function for creating basic 2D types. The type is
279ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * created without mipmaps or cubemaps.
280ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     *
281ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param rs The RenderScript context
282ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param e The Element for the Type
283ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param dimX The X dimension, must be > 0
284ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param dimY The Y dimension, must be > 0
285ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     *
286ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @return Type
287ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     */
288ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) {
289ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        if ((dimX < 1) || (dimY < 1)) {
290ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams            throw new RSInvalidStateException("Dimension must be >= 1.");
291ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        }
292ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams
293460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0);
294ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        Type t = new Type(id, rs);
295ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mElement = e;
296ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mDimX = dimX;
297ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mDimY = dimY;
298ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.calcElementCount();
299ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        return t;
300ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    }
301ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams
302ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    /**
303ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * Utility function for creating basic 3D types. The type is
304ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * created without mipmaps.
305ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     *
306ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param rs The RenderScript context
307ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param e The Element for the Type
308ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param dimX The X dimension, must be > 0
309ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param dimY The Y dimension, must be > 0
310ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @param dimZ The Z dimension, must be > 0
311ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     *
312ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     * @return Type
313ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams     */
314ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) {
315ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) {
316ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams            throw new RSInvalidStateException("Dimension must be >= 1.");
317ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        }
318ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams
319460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0);
320ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        Type t = new Type(id, rs);
321ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mElement = e;
322ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mDimX = dimX;
323ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mDimY = dimY;
324ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.mDimZ = dimZ;
325ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        t.calcElementCount();
326ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams        return t;
327ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    }
328ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams
329ec44e5dc2f961c4f728babdd17bc4f2b7742750fJason Sams    /**
330a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Builder class for Type.
331a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
332a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
333b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    public static class Builder {
334b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        RenderScript mRS;
335bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimX = 1;
336bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimY;
337bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimZ;
338bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean mDimMipmaps;
339bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean mDimFaces;
340b109cc78616abee7291eb42094cd156b5db3355dJason Sams        int mYuv;
34146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        int[] mArray = new int[mMaxArrays];
342b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
343bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        Element mElement;
344b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
3459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
346a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create a new builder object.
347a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
348a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param rs
349a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param e The element for the type to be created.
350a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
35122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Builder(RenderScript rs, Element e) {
352bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            e.checkValid();
35322534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mRS = rs;
35422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mElement = e;
355b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
356b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
3579c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
358a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add a dimension to the Type.
359a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
360a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
361a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param value
362a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
363bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setX(int value) {
3643c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(value < 1) {
365bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
3663c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
367bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimX = value;
368bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
369bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
3703b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
371bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setY(int value) {
372bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if(value < 1) {
373bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
37422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
375bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimY = value;
376bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
377bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
378bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
379d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams        public Builder setZ(int value) {
380d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams            if(value < 1) {
381d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid.");
382d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams            }
383d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams            mDimZ = value;
384d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams            return this;
385d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams        }
386d1c306a9e66f8e541f866a6f3740959ed8cc70a6Jason Sams
38746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        /**
388d016266de2cefe12853dbf4a81292b96bb4150b1Jason Sams         * @hide
3896a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams         * Adds an array dimension to the builder
39046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams         *
39146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams         * @param dim
39246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams         * @param value
39346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams         *
39446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams         * @return Builder
39546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams         */
39646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        public Builder setArray(int dim, int value) {
39746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            if(dim < 0 || dim >= mMaxArrays) {
39846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                throw new RSIllegalArgumentException("Array dimension out of range.");
39946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            }
40046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            mArray[dim] = value;
40146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            return this;
40246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams        }
40346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
404bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setMipmaps(boolean value) {
405bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimMipmaps = value;
406bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
40722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
40822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
409bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setFaces(boolean value) {
410bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimFaces = value;
411bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
412bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
413bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
414b109cc78616abee7291eb42094cd156b5db3355dJason Sams        /**
415c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * Set the YUV layout for a Type.
416b109cc78616abee7291eb42094cd156b5db3355dJason Sams         *
417ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala         * @param yuvFormat {@link android.graphics.ImageFormat#YV12}, {@link android.graphics.ImageFormat#NV21}, or
418ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala         * {@link android.graphics.ImageFormat#YUV_420_888}.
419b109cc78616abee7291eb42094cd156b5db3355dJason Sams         */
420b109cc78616abee7291eb42094cd156b5db3355dJason Sams        public Builder setYuvFormat(int yuvFormat) {
421b109cc78616abee7291eb42094cd156b5db3355dJason Sams            switch (yuvFormat) {
422b109cc78616abee7291eb42094cd156b5db3355dJason Sams            case android.graphics.ImageFormat.NV21:
423b109cc78616abee7291eb42094cd156b5db3355dJason Sams            case android.graphics.ImageFormat.YV12:
424ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala            case android.graphics.ImageFormat.YUV_420_888:
425b109cc78616abee7291eb42094cd156b5db3355dJason Sams                break;
426b109cc78616abee7291eb42094cd156b5db3355dJason Sams
427b109cc78616abee7291eb42094cd156b5db3355dJason Sams            default:
428ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala                throw new RSIllegalArgumentException(
429ccadaf1eb48c70a3eb5722ecbd0144d165bcd963Eino-Ville Talvala                    "Only ImageFormat.NV21, .YV12, and .YUV_420_888 are supported..");
430b109cc78616abee7291eb42094cd156b5db3355dJason Sams            }
431b109cc78616abee7291eb42094cd156b5db3355dJason Sams
432b109cc78616abee7291eb42094cd156b5db3355dJason Sams            mYuv = yuvFormat;
433b109cc78616abee7291eb42094cd156b5db3355dJason Sams            return this;
434b109cc78616abee7291eb42094cd156b5db3355dJason Sams        }
435b109cc78616abee7291eb42094cd156b5db3355dJason Sams
436bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
4379c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
438c11e25c4e653124def1fb18e203b894f42106cbeTim Murray         * Validate structure and create a new Type.
439a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
440a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @return Type
441a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
4423b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        public Type create() {
443bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimZ > 0) {
444bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if ((mDimX < 1) || (mDimY < 1)) {
445a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
446a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
447bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimFaces) {
448a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Cube maps not supported with 3D types.");
449a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
450a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
451bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimY > 0) {
452bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimX < 1) {
453a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("X dimension required when Y is present.");
454a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
455a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
456bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimFaces) {
457bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimY < 1) {
458a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Cube maps require 2D Types.");
459a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
460a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
461a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
462b109cc78616abee7291eb42094cd156b5db3355dJason Sams            if (mYuv != 0) {
463b109cc78616abee7291eb42094cd156b5db3355dJason Sams                if ((mDimZ != 0) || mDimFaces || mDimMipmaps) {
464b109cc78616abee7291eb42094cd156b5db3355dJason Sams                    throw new RSInvalidStateException("YUV only supports basic 2D.");
465b109cc78616abee7291eb42094cd156b5db3355dJason Sams                }
466b109cc78616abee7291eb42094cd156b5db3355dJason Sams            }
467b109cc78616abee7291eb42094cd156b5db3355dJason Sams
46846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            int[] arrays = null;
46946ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            for (int ct = mMaxArrays - 1; ct >= 0; ct--) {
47046ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                if (mArray[ct] != 0 && arrays == null) {
47146ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                    arrays = new int[ct];
47246ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                }
47346ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                if ((mArray[ct] == 0) && (arrays != null)) {
47446ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                    throw new RSInvalidStateException("Array dimensions must be contigous from 0.");
47546ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams                }
47646ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            }
47746ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams
478460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray            long id = mRS.nTypeCreate(mElement.getID(mRS),
479b109cc78616abee7291eb42094cd156b5db3355dJason Sams                                     mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);
480bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            Type t = new Type(id, mRS);
481bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mElement = mElement;
482bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimX = mDimX;
483bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimY = mDimY;
484bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimZ = mDimZ;
485bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimMipmaps = mDimMipmaps;
486bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimFaces = mDimFaces;
487b109cc78616abee7291eb42094cd156b5db3355dJason Sams            t.mDimYuv = mYuv;
48846ba27e3fdcf1ce3b940e8b2ec90fcd2c9b7fe43Jason Sams            t.mArrays = arrays;
489bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
490768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            t.calcElementCount();
4911bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            return t;
492b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
493b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
494b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
495b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams}
496