145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams * Copyright (C) 2013 The Android Open Source Project
345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License.
645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at
745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software
1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and
1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License.
1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */
1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript;
1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Field;
215d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
225d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Samsimport android.graphics.ImageFormat;
2345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log;
2445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
262192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>A Type describes the {@link android.support.v8.renderscript.Element} and
272192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * dimensions used for an {@link android.support.v8.renderscript.Allocation} or
282192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * a parallel operation. Types are created through
292192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * {@link android.support.v8.renderscript.Type.Builder}.</p>
3045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
312192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>A Type always includes an {@link android.support.v8.renderscript.Element}
322192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * and an X dimension. A Type may be multidimensional, up to three dimensions.
332192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * A nonzero value in the Y or Z dimensions indicates that the dimension is
342192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * present. Note that a Type with only a given X dimension and a Type with the
352192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * same X dimension but Y = 1 are not equivalent.</p>
3645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
37032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>A Type also supports inclusion of level of detail (LOD) or cube map
38032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * faces. LOD and cube map faces are booleans to indicate present or not
39032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * present. </p>
40032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines *
41032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>A Type also supports YUV format information to support an {@link
422192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * android.support.v8.renderscript.Allocation} in a YUV format. The YUV formats
432192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * supported are {@link android.graphics.ImageFormat#YV12} and {@link
44032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * android.graphics.ImageFormat#NV21}.</p>
4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <div class="special reference">
4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <h3>Developer Guides</h3>
482192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>For more information about creating an application that uses RenderScript,
492192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * read the
502192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
512192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * developer guide.</p>
5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * </div>
5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
5445d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class Type extends BaseObj {
5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int mDimX;
5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int mDimY;
5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int mDimZ;
5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    boolean mDimMipmaps;
5945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    boolean mDimFaces;
608fafeb11cf19fdada0add886e99ab0af5d3ddabeJason Sams    int mDimYuv;
6145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int mElementCount;
6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement;
6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public enum CubemapFace {
6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        POSITIVE_X (0),
6645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        NEGATIVE_X (1),
6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        POSITIVE_Y (2),
6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        NEGATIVE_Y (3),
6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        POSITIVE_Z (4),
7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        NEGATIVE_Z (5);
7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mID;
7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        CubemapFace(int id) {
7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mID = id;
7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return the element associated with this Type.
8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public Element getElement() {
8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mElement;
8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return the value of the X dimension.
8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return int
9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getX() {
9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mDimX;
9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return the value of the Y dimension or 0 for a 1D allocation.
9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return int
10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getY() {
10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mDimY;
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return int
10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getZ() {
11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mDimZ;
11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
115032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Get the YUV format
116032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
117032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @return int
118032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
119032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    public int getYuv() {
120032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        return mDimYuv;
121032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    }
122032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines
123032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
12445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return if the Type has a mipmap chain.
12545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
12645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return boolean
12745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
12845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public boolean hasMipmaps() {
12945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mDimMipmaps;
13045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
13245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
13345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return if the Type is a cube map.
13445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
13545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return boolean
13645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
13745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public boolean hasFaces() {
13845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mDimFaces;
13945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
14045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
14145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
14245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return the total number of accessable cells in the Type.
14345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
14445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return int
14545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
14645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getCount() {
14745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mElementCount;
14845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
14945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    void calcElementCount() {
15145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean hasLod = hasMipmaps();
15245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int x = getX();
15345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int y = getY();
15445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int z = getZ();
15545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int faces = 1;
15645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (hasFaces()) {
15745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            faces = 6;
15845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (x == 0) {
16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            x = 1;
16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
16245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (y == 0) {
16345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            y = 1;
16445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
16545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (z == 0) {
16645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            z = 1;
16745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
16845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
16945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int count = x * y * z * faces;
17045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
17145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
17245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if(x > 1) {
17345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                x >>= 1;
17445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
17545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if(y > 1) {
17645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                y >>= 1;
17745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
17845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if(z > 1) {
17945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                z >>= 1;
18045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
18145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
18245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            count += x * y * z * faces;
18345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
18445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mElementCount = count;
18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
18745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
188bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    Type(long id, RenderScript rs) {
18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(id, rs);
19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /*
1936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * Get an identical dummy Type for Compat Context
1946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
1956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
1966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    public long getDummyType(RenderScript mRS, long eid) {
1976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return mRS.nIncTypeCreate(eid, mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mDimYuv);
1986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
201b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * Utility function for creating basic 1D types. The type is
202b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * created without mipmaps enabled.
203b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     *
204b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param rs The RenderScript context
205b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param e The Element for the Type
206b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param dimX The X dimension, must be > 0
207b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     *
208b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @return Type
209b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     */
210b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    static public Type createX(RenderScript rs, Element e, int dimX) {
211b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        if (dimX < 1) {
212b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang            throw new RSInvalidStateException("Dimension must be >= 1.");
213b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        }
214b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
215b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0);
216b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        Type t = new Type(id, rs);
217b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mElement = e;
218b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mDimX = dimX;
219b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.calcElementCount();
220b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        return t;
221b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
222b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
223b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    /**
224b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * Utility function for creating basic 2D types. The type is
225b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * created without mipmaps or cubemaps.
226b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     *
227b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param rs The RenderScript context
228b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param e The Element for the Type
229b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param dimX The X dimension, must be > 0
230b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param dimY The Y dimension, must be > 0
231b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     *
232b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @return Type
233b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     */
234b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) {
235b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        if ((dimX < 1) || (dimY < 1)) {
236b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang            throw new RSInvalidStateException("Dimension must be >= 1.");
237b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        }
238b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
239b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0);
240b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        Type t = new Type(id, rs);
241b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mElement = e;
242b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mDimX = dimX;
243b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mDimY = dimY;
244b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.calcElementCount();
245b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        return t;
246b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
247b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
248b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    /**
249b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * Utility function for creating basic 3D types. The type is
250b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * created without mipmaps.
251b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     *
252b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param rs The RenderScript context
253b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param e The Element for the Type
254b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param dimX The X dimension, must be > 0
255b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param dimY The Y dimension, must be > 0
256b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @param dimZ The Z dimension, must be > 0
257b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     *
258b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     * @return Type
259b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang     */
260b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) {
261b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) {
262b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang            throw new RSInvalidStateException("Dimension must be >= 1.");
263b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        }
264b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
265b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0);
266b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        Type t = new Type(id, rs);
267b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mElement = e;
268b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mDimX = dimX;
269b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mDimY = dimY;
270b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.mDimZ = dimZ;
271b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        t.calcElementCount();
272b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        return t;
273b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
274b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
275b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    /**
27645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Builder class for Type.
27745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
27845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
27945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class Builder {
28045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript mRS;
28145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mDimX = 1;
28245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mDimY;
28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mDimZ;
28445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean mDimMipmaps;
28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean mDimFaces;
2865d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams        int mYuv;
28745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
28845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Element mElement;
28945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
29045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * Create a new builder object.
29245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param rs
29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param e The element for the type to be created.
29545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
29645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder(RenderScript rs, Element e) {
29745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            e.checkValid();
29845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS = rs;
29945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mElement = e;
30045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
30145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
30245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
30345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * Add a dimension to the Type.
30445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
30545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
30645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param value
30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
30845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder setX(int value) {
30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if(value < 1) {
31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mDimX = value;
31345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return this;
31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder setY(int value) {
31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if(value < 1) {
31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mDimY = value;
32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return this;
32245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
32345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3249c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        public Builder setZ(int value) {
3259c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray            if(value < 1) {
3269c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray                throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid.");
3279c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray            }
3289c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray            mDimZ = value;
3299c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray            return this;
3309c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        }
3319c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray
33245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder setMipmaps(boolean value) {
33345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mDimMipmaps = value;
33445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return this;
33545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
33645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
33745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder setFaces(boolean value) {
33845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mDimFaces = value;
33945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return this;
34045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
34145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3425d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams        /**
343032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Set the YUV layout for a Type.
344032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
345032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @param yuvFormat {@link android.graphics.ImageFormat#YV12} or {@link android.graphics.ImageFormat#NV21}
3465d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams         */
3475d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams        public Builder setYuvFormat(int yuvFormat) {
3485d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            switch (yuvFormat) {
3495d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            case android.graphics.ImageFormat.NV21:
3505d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            case android.graphics.ImageFormat.YV12:
3515d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams                break;
3525d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
3535d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            default:
3545d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams                throw new RSIllegalArgumentException("Only NV21 and YV12 are supported..");
3555d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            }
3565d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
3575d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            mYuv = yuvFormat;
3585d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            return this;
3595d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams        }
3605d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
36145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
36245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
363032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Validate structure and create a new Type.
36445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
36545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @return Type
36645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
36745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Type create() {
36845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mDimZ > 0) {
36945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if ((mDimX < 1) || (mDimY < 1)) {
37045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
37145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
37245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (mDimFaces) {
37345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    throw new RSInvalidStateException("Cube maps not supported with 3D types.");
37445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
37545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
37645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mDimY > 0) {
37745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (mDimX < 1) {
37845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    throw new RSInvalidStateException("X dimension required when Y is present.");
37945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
38045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
38145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mDimFaces) {
38245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (mDimY < 1) {
38345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    throw new RSInvalidStateException("Cube maps require 2D Types.");
38445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
38545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
38645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3875d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            if (mYuv != 0) {
3885d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams                if ((mDimZ != 0) || mDimFaces || mDimMipmaps) {
3895d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams                    throw new RSInvalidStateException("YUV only supports basic 2D.");
3905d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams                }
3915d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            }
3925d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
393baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            Type t;
394bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            long id = mRS.nTypeCreate(mElement.getID(mRS),
395470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang                                     mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);
396470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            t = new Type(id, mRS);
397470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
39845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.mElement = mElement;
39945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.mDimX = mDimX;
40045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.mDimY = mDimY;
40145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.mDimZ = mDimZ;
40245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.mDimMipmaps = mDimMipmaps;
40345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.mDimFaces = mDimFaces;
4045d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams            t.mDimYuv = mYuv;
40545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
40645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            t.calcElementCount();
40745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return t;
40845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
40945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
41145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
412