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