Type.java revision bf6ef8d78fffbce6c1849a4a28fb3f4401ad039e
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/**
24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * @hide
25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
26a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * Type is an allocation template.  It consists of an Element and one or more
27a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * dimensions.  It describes only the layout of memory but does not allocate and
28a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * storage for the data thus described.
29a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
30a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * A Type consists of several dimensions.  Those are X, Y, Z, LOD (level of
31a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * detail), Faces (faces of a cube map).  The X,Y,Z dimensions can be assigned
32a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * any positive integral value within the constraints of available memory.  A
33a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * single dimension allocation would have an X dimension of greater than zero
34a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * while the Y and Z dimensions would be zero to indicate not present.  In this
35a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * regard an allocation of x=10, y=1 would be considered 2 dimensionsal while
36a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * x=10, y=0 would be considered 1 dimensional.
37a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
38a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * The LOD and Faces dimensions are booleans to indicate present or not present.
39a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
40b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/
41b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Type extends BaseObj {
42768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimX;
43768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimY;
44768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimZ;
45bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    boolean mDimMipmaps;
46768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    boolean mDimFaces;
47768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mElementCount;
481bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    Element mElement;
49768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
50a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
51a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the element associated with this Type.
52a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
53a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
54a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
55e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    public Element getElement() {
56e17964e150e459bacced5658ae36fe1c56082e37Jason Sams        return mElement;
57e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    }
581bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
59a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
60a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the X dimension.
61a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
62a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
63a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
64768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getX() {
65768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimX;
66768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
67a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
68a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
69a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the Y dimension or 0 for a 1D allocation.
70a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
71a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
72a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
73768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getY() {
74768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimY;
75768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
76a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
77a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
78a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
79a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
80a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
81a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
82768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getZ() {
83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimZ;
84768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
85a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
86a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
87a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if the Type has a mipmap chain.
88a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
89a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
90a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
91bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public boolean hasMipmaps() {
92bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        return mDimMipmaps;
93768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
94a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
95a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
96a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if the Type is a cube map.
97a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
98a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
99a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
100bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public boolean hasFaces() {
101768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimFaces;
102768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
103a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
104a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
105a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return the total number of accessable cells in the Type.
106a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
107a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return int
108a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
109bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    public int getCount() {
110768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mElementCount;
111768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
112768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
113768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    void calcElementCount() {
114bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean hasLod = hasMipmaps();
115768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int x = getX();
116768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int y = getY();
117768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int z = getZ();
118768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int faces = 1;
119bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (hasFaces()) {
120768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            faces = 6;
121768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
122bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (x == 0) {
123768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            x = 1;
124768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
125bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (y == 0) {
126768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            y = 1;
127768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
128bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (z == 0) {
129768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            z = 1;
130768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
131768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
132768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int count = x * y * z * faces;
133bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        if (hasLod && (x > 1) && (y > 1) && (z > 1)) {
134768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(x > 1) {
135768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                x >>= 1;
136768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
137768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(y > 1) {
138768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                y >>= 1;
139768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
140768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(z > 1) {
141768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                z >>= 1;
142768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
143768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
144768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            count += x * y * z * faces;
145768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
146768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        mElementCount = count;
147768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
148768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
149768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
150b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    Type(int id, RenderScript rs) {
1510de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
15243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
15343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
154dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
155dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
156dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // We have 6 integer to obtain mDimX; mDimY; mDimZ;
157dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // mDimLOD; mDimFaces; mElement;
158dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int[] dataBuffer = new int[6];
15906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        mRS.nTypeGetNativeData(getID(), dataBuffer);
160dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
161dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimX = dataBuffer[0];
162dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimY = dataBuffer[1];
163dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimZ = dataBuffer[2];
164bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        mDimMipmaps = dataBuffer[3] == 1 ? true : false;
165dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimFaces = dataBuffer[4] == 1 ? true : false;
166dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
167dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int elementID = dataBuffer[5];
168dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(elementID != 0) {
1690de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            mElement = new Element(elementID, mRS);
170dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElement.updateFromNative();
171dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
172dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        calcElementCount();
173dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
174dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
175a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
176a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Builder class for Type.
177a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
178a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
179b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    public static class Builder {
180b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        RenderScript mRS;
181bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimX = 1;
182bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimY;
183bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        int mDimZ;
184bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean mDimMipmaps;
185bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        boolean mDimFaces;
186b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
187bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        Element mElement;
188b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
189a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
190a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create a new builder object.
191a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
192a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param rs
193a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param e The element for the type to be created.
194a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
19522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Builder(RenderScript rs, Element e) {
196bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            e.checkValid();
19722534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mRS = rs;
19822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mElement = e;
199b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
200b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
201a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
202a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add a dimension to the Type.
203a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
204a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
205a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param d
206a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param value
207a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
208bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setX(int value) {
2093c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(value < 1) {
210bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
2113c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
212bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimX = value;
213bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
214bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
2153b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
216bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setY(int value) {
217bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if(value < 1) {
218bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
21922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
220bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimY = value;
221bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
222bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
223bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
224bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setMipmaps(boolean value) {
225bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimMipmaps = value;
226bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
22722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
22822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
229bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder setFaces(boolean value) {
230bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            mDimFaces = value;
231bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
232bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        }
233bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
234bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
235a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
236a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Validate structure and create a new type.
237a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
238a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @return Type
239a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
2403b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        public Type create() {
241bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimZ > 0) {
242bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if ((mDimX < 1) || (mDimY < 1)) {
243a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
244a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
245bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimFaces) {
246a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Cube maps not supported with 3D types.");
247a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
248a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
249bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimY > 0) {
250bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimX < 1) {
251a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("X dimension required when Y is present.");
252a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
253a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
254bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            if (mDimFaces) {
255bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams                if (mDimY < 1) {
256a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                    throw new RSInvalidStateException("Cube maps require 2D Types.");
257a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams                }
258a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams            }
259a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
260bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            int id = mRS.nTypeCreate(mElement.getID(), mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces);
261bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            Type t = new Type(id, mRS);
262bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mElement = mElement;
263bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimX = mDimX;
264bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimY = mDimY;
265bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimZ = mDimZ;
266bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimMipmaps = mDimMipmaps;
267bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            t.mDimFaces = mDimFaces;
268bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams
269768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            t.calcElementCount();
2701bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            return t;
271b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
272b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
273b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
274b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams}
275