198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
2f681be1f0ec328acaa311478887352a456d52be8Jason Sams * Copyright (C) 2013 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;
219fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams
229fdd33763a41feb9b0906078c660949fb2c3b930Jason Samsimport android.graphics.ImageFormat;
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
2660c5b31f4448410221de043873b94797732afa66Stephen Hines * <p>A Type describes the {@link android.support.v8.renderscript.Element} and
2760c5b31f4448410221de043873b94797732afa66Stephen Hines * dimensions used for an {@link android.support.v8.renderscript.Allocation} or
2860c5b31f4448410221de043873b94797732afa66Stephen Hines * a parallel operation. Types are created through
2960c5b31f4448410221de043873b94797732afa66Stephen Hines * {@link android.support.v8.renderscript.Type.Builder}.</p>
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
3160c5b31f4448410221de043873b94797732afa66Stephen Hines * <p>A Type always includes an {@link android.support.v8.renderscript.Element}
3260c5b31f4448410221de043873b94797732afa66Stephen Hines * and an X dimension. A Type may be multidimensional, up to three dimensions.
3360c5b31f4448410221de043873b94797732afa66Stephen Hines * A nonzero value in the Y or Z dimensions indicates that the dimension is
3460c5b31f4448410221de043873b94797732afa66Stephen Hines * present. Note that a Type with only a given X dimension and a Type with the
3560c5b31f4448410221de043873b94797732afa66Stephen Hines * same X dimension but Y = 1 are not equivalent.</p>
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
377d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * <p>A Type also supports inclusion of level of detail (LOD) or cube map
387d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * faces. LOD and cube map faces are booleans to indicate present or not
397d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * present. </p>
407d435ae5ba100be5710b685653cc351cab159c11Stephen Hines *
417d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * <p>A Type also supports YUV format information to support an {@link
4260c5b31f4448410221de043873b94797732afa66Stephen Hines * android.support.v8.renderscript.Allocation} in a YUV format. The YUV formats
4360c5b31f4448410221de043873b94797732afa66Stephen Hines * supported are {@link android.graphics.ImageFormat#YV12} and {@link
447d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * android.graphics.ImageFormat#NV21}.</p>
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <div class="special reference">
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <h3>Developer Guides</h3>
4860c5b31f4448410221de043873b94797732afa66Stephen Hines * <p>For more information about creating an application that uses RenderScript,
4960c5b31f4448410221de043873b94797732afa66Stephen Hines * read the
5060c5b31f4448410221de043873b94797732afa66Stephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
5160c5b31f4448410221de043873b94797732afa66Stephen Hines * developer guide.</p>
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </div>
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Type extends BaseObj {
5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mDimX;
5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mDimY;
5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mDimZ;
5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mDimMipmaps;
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mDimFaces;
601b370e358d16cc3b50b169511d6b387db09f972dJason Sams    int mDimYuv;
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mElementCount;
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement;
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum CubemapFace {
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        POSITIVE_X (0),
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NEGATIVE_X (1),
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        POSITIVE_Y (2),
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NEGATIVE_Y (3),
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        POSITIVE_Z (4),
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NEGATIVE_Z (5);
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        CubemapFace(int id) {
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the element associated with this Type.
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Element getElement() {
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mElement;
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the value of the X dimension.
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getX() {
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimX;
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the value of the Y dimension or 0 for a 1D allocation.
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getY() {
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimY;
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getZ() {
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimZ;
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
1157d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * Get the YUV format
1167d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     *
1177d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @hide
1187d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     *
1197d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @return int
1207d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     */
1217d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    public int getYuv() {
1227d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        return mDimYuv;
1237d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    }
1247d435ae5ba100be5710b685653cc351cab159c11Stephen Hines
1257d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    /**
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return if the Type has a mipmap chain.
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean hasMipmaps() {
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimMipmaps;
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return if the Type is a cube map.
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean hasFaces() {
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mDimFaces;
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return the total number of accessable cells in the Type.
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getCount() {
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mElementCount;
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    void calcElementCount() {
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean hasLod = hasMipmaps();
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int x = getX();
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int y = getY();
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int z = getZ();
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int faces = 1;
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (hasFaces()) {
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            faces = 6;
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (x == 0) {
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            x = 1;
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (y == 0) {
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            y = 1;
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (z == 0) {
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            z = 1;
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int count = x * y * z * faces;
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(x > 1) {
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                x >>= 1;
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(y > 1) {
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                y >>= 1;
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(z > 1) {
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                z >>= 1;
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            count += x * y * z * faces;
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mElementCount = count;
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Type(int id, RenderScript rs) {
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Builder class for Type.
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class Builder {
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript mRS;
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mDimX = 1;
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mDimY;
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mDimZ;
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean mDimMipmaps;
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean mDimFaces;
2059fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams        int mYuv;
20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element mElement;
20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Create a new builder object.
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param rs
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param e The element for the type to be created.
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder(RenderScript rs, Element e) {
21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            e.checkValid();
21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = rs;
21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElement = e;
21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Add a dimension to the Type.
22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param value
22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setX(int value) {
22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(value < 1) {
22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimX = value;
23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setY(int value) {
23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(value < 1) {
23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimY = value;
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
243c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray        public Builder setZ(int value) {
244c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray            if(value < 1) {
245c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid.");
246c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray            }
247c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray            mDimZ = value;
248c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray            return this;
249c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray        }
250c5b37c751f22199fd3cf14f6ef19ed4b9664510fTim Murray
25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setMipmaps(boolean value) {
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimMipmaps = value;
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder setFaces(boolean value) {
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDimFaces = value;
25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2619fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams        /**
2627d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Set the YUV layout for a Type.
2637d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
2649fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams         * @hide
2659fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams         *
2667d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @param yuvFormat {@link android.graphics.ImageFormat#YV12} or {@link android.graphics.ImageFormat#NV21}
2679fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams         */
2689fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams        public Builder setYuvFormat(int yuvFormat) {
2699fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            switch (yuvFormat) {
2709fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            case android.graphics.ImageFormat.NV21:
2719fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            case android.graphics.ImageFormat.YV12:
2729fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams                break;
2739fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams
2749fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            default:
2759fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams                throw new RSIllegalArgumentException("Only NV21 and YV12 are supported..");
2769fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            }
2779fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams
2789fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            mYuv = yuvFormat;
2799fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            return this;
2809fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams        }
2819fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams
28298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
28398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
2847d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Validate structure and create a new Type.
28598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
28698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @return Type
28798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
28898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Type create() {
28998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mDimZ > 0) {
29098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if ((mDimX < 1) || (mDimY < 1)) {
29198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
29298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
29398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (mDimFaces) {
29498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("Cube maps not supported with 3D types.");
29598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
29698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
29798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mDimY > 0) {
29898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (mDimX < 1) {
29998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("X dimension required when Y is present.");
30098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
30198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
30298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mDimFaces) {
30398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (mDimY < 1) {
30498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    throw new RSInvalidStateException("Cube maps require 2D Types.");
30598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
30698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
30798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3089fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            if (mYuv != 0) {
3099fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams                if ((mDimZ != 0) || mDimFaces || mDimMipmaps) {
3109fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams                    throw new RSInvalidStateException("YUV only supports basic 2D.");
3119fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams                }
3129fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            }
3139fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams
314ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            Type t;
315ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            if (mRS.isNative) {
316ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                RenderScriptThunker rst = (RenderScriptThunker)mRS;
317ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                t = TypeThunker.create(rst, mElement, mDimX, mDimY, mDimZ,
318ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                                       mDimMipmaps, mDimFaces, mYuv);
319ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            } else {
320ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                int id = mRS.nTypeCreate(mElement.getID(mRS),
321ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                                         mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);
322ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                t = new Type(id, mRS);
323ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            }
32498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mElement = mElement;
32598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimX = mDimX;
32698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimY = mDimY;
32798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimZ = mDimZ;
32898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimMipmaps = mDimMipmaps;
32998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.mDimFaces = mDimFaces;
3309fdd33763a41feb9b0906078c660949fb2c3b930Jason Sams            t.mDimYuv = mYuv;
33198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
33298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            t.calcElementCount();
33398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return t;
33498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
33598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
33698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
33798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
338