Type.java revision 11518acc8c416023d8c2192b441a1767205676d9
1b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/*
2b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Copyright (C) 2008 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
19dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
2043ee06857bb7f99446d1d84f8789016c5d105558Jason Samsimport java.lang.reflect.Field;
21dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukimport android.util.Log;
2243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
23b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/**
2411518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>Type is an allocation template. It consists of an Element and one or more
2511518acc8c416023d8c2192b441a1767205676d9Robert Ly * dimensions. It describes only the layout of memory but does not allocate any
2611518acc8c416023d8c2192b441a1767205676d9Robert Ly * storage for the data that is described.</p>
27a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
2811518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>A Type consists of several dimensions. Those are X, Y, Z, LOD (level of
29a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * detail), Faces (faces of a cube map).  The X,Y,Z dimensions can be assigned
30a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * any positive integral value within the constraints of available memory.  A
31a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * single dimension allocation would have an X dimension of greater than zero
32a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * while the Y and Z dimensions would be zero to indicate not present.  In this
33a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * regard an allocation of x=10, y=1 would be considered 2 dimensionsal while
3411518acc8c416023d8c2192b441a1767205676d9Robert Ly * x=10, y=0 would be considered 1 dimensional.</p>
35a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
3611518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>The LOD and Faces dimensions are booleans to indicate present or not present.</p>
37a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
38b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/
39b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Type extends BaseObj {
40768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimX;
41768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimY;
42768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimZ;
43bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    boolean mDimMipmaps;
44768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    boolean mDimFaces;
45768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mElementCount;
461bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    Element mElement;
47768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
4849a05d7b82956009f03acbb92a064eed054eb031Jason Sams    public enum CubemapFace {
4949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        POSITVE_X (0),
5049a05d7b82956009f03acbb92a064eed054eb031Jason Sams        NEGATIVE_X (1),
5149a05d7b82956009f03acbb92a064eed054eb031Jason Sams        POSITVE_Y (2),
5249a05d7b82956009f03acbb92a064eed054eb031Jason Sams        NEGATIVE_Y (3),
5349a05d7b82956009f03acbb92a064eed054eb031Jason Sams        POSITVE_Z (4),
5449a05d7b82956009f03acbb92a064eed054eb031Jason Sams        NEGATIVE_Z (5);
5549a05d7b82956009f03acbb92a064eed054eb031Jason Sams
5649a05d7b82956009f03acbb92a064eed054eb031Jason Sams        int mID;
5749a05d7b82956009f03acbb92a064eed054eb031Jason Sams        CubemapFace(int id) {
5849a05d7b82956009f03acbb92a064eed054eb031Jason Sams            mID = id;
5949a05d7b82956009f03acbb92a064eed054eb031Jason Sams        }
6049a05d7b82956009f03acbb92a064eed054eb031Jason Sams    }
6149a05d7b82956009f03acbb92a064eed054eb031Jason Sams
62a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
63a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the element associated with this Type.
64a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
65a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
66a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
67e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    public Element getElement() {
68e17964e150e459bacced5658ae36fe1c56082e37Jason Sams        return mElement;
69e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    }
701bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
71a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
72a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the X dimension.
73a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
74a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
75a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
76768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getX() {
77768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimX;
78768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
79a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
80a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
81a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the Y dimension or 0 for a 1D allocation.
82a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
83a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
84a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
85768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getY() {
86768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimY;
87768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
88a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
89a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
90a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
91a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
92a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
93a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
94768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getZ() {
95768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimZ;
96768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
97a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
98a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
99a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if the Type has a mipmap chain.
100a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
101a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
102a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
103bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public boolean hasMipmaps() {
104bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        return mDimMipmaps;
105768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
106a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
107a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
108a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if the Type is a cube map.
109a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
110a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
111a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
112bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public boolean hasFaces() {
113768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimFaces;
114768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
115a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
116a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
117a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the total number of accessable cells in the Type.
118a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
119a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
120a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
121bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public int getCount() {
122768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mElementCount;
123768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
124768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
125768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    void calcElementCount() {
126bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean hasLod = hasMipmaps();
127768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int x = getX();
128768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int y = getY();
129768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int z = getZ();
130768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int faces = 1;
131bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (hasFaces()) {
132768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            faces = 6;
133768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
134bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (x == 0) {
135768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            x = 1;
136768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
137bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (y == 0) {
138768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            y = 1;
139768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
140bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (z == 0) {
141768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            z = 1;
142768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
143768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
144768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int count = x * y * z * faces;
145bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (hasLod && (x > 1) && (y > 1) && (z > 1)) {
146768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(x > 1) {
147768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                x >>= 1;
148768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
149768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(y > 1) {
150768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                y >>= 1;
151768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
152768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(z > 1) {
153768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                z >>= 1;
154768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
155768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
156768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            count += x * y * z * faces;
157768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
158768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        mElementCount = count;
159768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
160768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
161768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
162b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    Type(int id, RenderScript rs) {
1630de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
16443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
16543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
166dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
167dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
168dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // We have 6 integer to obtain mDimX; mDimY; mDimZ;
169dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // mDimLOD; mDimFaces; mElement;
170dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int[] dataBuffer = new int[6];
17106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        mRS.nTypeGetNativeData(getID(), dataBuffer);
172dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
173dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimX = dataBuffer[0];
174dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimY = dataBuffer[1];
175dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimZ = dataBuffer[2];
176bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        mDimMipmaps = dataBuffer[3] == 1 ? true : false;
177dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimFaces = dataBuffer[4] == 1 ? true : false;
178dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
179dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int elementID = dataBuffer[5];
180dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(elementID != 0) {
1810de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            mElement = new Element(elementID, mRS);
182dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElement.updateFromNative();
183dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
184dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        calcElementCount();
185dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
186dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
187a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
188a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Builder class for Type.
189a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
190a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
191b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    public static class Builder {
192b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        RenderScript mRS;
193bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimX = 1;
194bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimY;
195bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimZ;
196bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean mDimMipmaps;
197bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean mDimFaces;
198b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
199bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        Element mElement;
200b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
201a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
202a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create a new builder object.
203a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
204a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param rs
205a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param e The element for the type to be created.
206a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
20722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Builder(RenderScript rs, Element e) {
208bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            e.checkValid();
20922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mRS = rs;
21022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mElement = e;
211b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
212b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
213a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
214a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add a dimension to the Type.
215a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
216a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
217a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param value
218a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
219bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setX(int value) {
2203c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(value < 1) {
221bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
2223c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
223bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimX = value;
224bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
225bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
2263b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
227bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setY(int value) {
228bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if(value < 1) {
229bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
23022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
231bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimY = value;
232bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
233bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
234bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
235bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setMipmaps(boolean value) {
236bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimMipmaps = value;
237bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
23822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
23922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
240bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setFaces(boolean value) {
241bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimFaces = value;
242bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
243bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
244bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
245bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
246a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
247a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Validate structure and create a new type.
248a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
249a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @return Type
250a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
2513b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        public Type create() {
252bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimZ > 0) {
253bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if ((mDimX < 1) || (mDimY < 1)) {
254a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
255a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
256bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimFaces) {
257a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Cube maps not supported with 3D types.");
258a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
259a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
260bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimY > 0) {
261bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimX < 1) {
262a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("X dimension required when Y is present.");
263a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
264a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
265bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimFaces) {
266bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimY < 1) {
267a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Cube maps require 2D Types.");
268a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
269a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
270a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
271bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            int id = mRS.nTypeCreate(mElement.getID(), mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces);
272bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            Type t = new Type(id, mRS);
273bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mElement = mElement;
274bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimX = mDimX;
275bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimY = mDimY;
276bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimZ = mDimZ;
277bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimMipmaps = mDimMipmaps;
278bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimFaces = mDimFaces;
279bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
280768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            t.calcElementCount();
2811bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            return t;
282b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
283b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
284b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
285b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams}
286