198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Field;
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>Type is an allocation template. It consists of an Element and one or more
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * dimensions. It describes only the layout of memory but does not allocate any
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * storage for the data that is described.</p>
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>A Type consists of several dimensions. Those are X, Y, Z, LOD (level of
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * detail), Faces (faces of a cube map).  The X,Y,Z dimensions can be assigned
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * any positive integral value within the constraints of available memory.  A
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * single dimension allocation would have an X dimension of greater than zero
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * while the Y and Z dimensions would be zero to indicate not present.  In this
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * regard an allocation of x=10, y=1 would be considered 2 dimensionsal while
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * x=10, y=0 would be considered 1 dimensional.</p>
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>The LOD and Faces dimensions are booleans to indicate present or not present.</p>
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <div class="special reference">
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <h3>Developer Guides</h3>
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>For more information about creating an application that uses Renderscript, read the
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p>
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </div>
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Type extends BaseObj {
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mDimX;
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mDimY;
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mDimZ;
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mDimMipmaps;
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mDimFaces;
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mElementCount;
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement;
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum CubemapFace {
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        POSITIVE_X (0),
5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NEGATIVE_X (1),
5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        POSITIVE_Y (2),
5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NEGATIVE_Y (3),
5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        POSITIVE_Z (4),
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NEGATIVE_Z (5);
6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        CubemapFace(int id) {
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the element associated with this Type.
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Element getElement() {
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mElement;
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the value of the X dimension.
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getX() {
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimX;
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the value of the Y dimension or 0 for a 1D allocation.
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getY() {
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimY;
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getZ() {
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimZ;
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return if the Type has a mipmap chain.
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean hasMipmaps() {
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimMipmaps;
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return if the Type is a cube map.
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean hasFaces() {
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimFaces;
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the total number of accessable cells in the Type.
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getCount() {
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mElementCount;
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    void calcElementCount() {
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean hasLod = hasMipmaps();
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int x = getX();
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int y = getY();
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int z = getZ();
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int faces = 1;
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (hasFaces()) {
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            faces = 6;
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (x == 0) {
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            x = 1;
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (y == 0) {
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            y = 1;
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (z == 0) {
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            z = 1;
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int count = x * y * z * faces;
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(x > 1) {
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                x >>= 1;
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(y > 1) {
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                y >>= 1;
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(z > 1) {
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                z >>= 1;
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            count += x * y * z * faces;
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mElementCount = count;
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Type(int id, RenderScript rs) {
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Builder class for Type.
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class Builder {
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript mRS;
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mDimX = 1;
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mDimY;
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mDimZ;
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean mDimMipmaps;
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean mDimFaces;
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element mElement;
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Create a new builder object.
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param rs
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param e The element for the type to be created.
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder(RenderScript rs, Element e) {
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            e.checkValid();
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = rs;
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElement = e;
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Add a dimension to the Type.
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param value
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setX(int value) {
20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(value < 1) {
20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimX = value;
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setY(int value) {
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(value < 1) {
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimY = value;
21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setMipmaps(boolean value) {
22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimMipmaps = value;
22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setFaces(boolean value) {
22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimFaces = value;
22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Validate structure and create a new type.
23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @return Type
23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Type create() {
23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mDimZ > 0) {
23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if ((mDimX < 1) || (mDimY < 1)) {
23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (mDimFaces) {
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("Cube maps not supported with 3D types.");
24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mDimY > 0) {
24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (mDimX < 1) {
24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("X dimension required when Y is present.");
24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
25098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mDimFaces) {
25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (mDimY < 1) {
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("Cube maps require 2D Types.");
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int id = mRS.nTypeCreate(mElement.getID(mRS),
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                     mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces);
25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            Type t = new Type(id, mRS);
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mElement = mElement;
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimX = mDimX;
26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimY = mDimY;
26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimZ = mDimZ;
26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimMipmaps = mDimMipmaps;
26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimFaces = mDimFaces;
26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.calcElementCount();
26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return t;
26898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
26998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
27098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
272