145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
2baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray * 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 Samsimport java.lang.reflect.Field;
20a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
2145d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log;
2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
24032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>An Element represents one item within an {@link
252192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * android.support.v8.renderscript.Allocation}.  An Element is roughly
262192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * equivalent to a C type in a RenderScript kernel. Elements may be basic or
272192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * complex. Some basic elements are</p> <ul> <li>A single float value
282192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * (equivalent to a float in a kernel)</li> <li>A four-element float vector
292192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * (equivalent to a float4 in a kernel)</li> <li>An unsigned 32-bit integer
302192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * (equivalent to an unsigned int in a kernel)</li> <li>A single signed 8-bit
312192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * integer (equivalent to a char in a kernel)</li> </ul> <p>A complex element is
322192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * roughly equivalent to a C struct and contains a number of basic or complex
332192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * Elements. From Java code, a complex element contains a list of sub-elements
342192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * and names that represents a particular data structure. Structs used in RS
352192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * scripts are available to Java code by using the
362192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * {@code ScriptField_structname} class that is reflected from a particular
372192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * script.</p>
3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
39032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>Basic Elements are comprised of a {@link
402192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * android.support.v8.renderscript.Element.DataType} and a {@link
412192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * android.support.v8.renderscript.Element.DataKind}. The DataType encodes C
422192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * type information of an Element, while the DataKind encodes how that Element
432192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * should be interpreted by a {@link android.support.v8.renderscript.Sampler}.
442192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * Note that {@link android.support.v8.renderscript.Allocation} objects with
452192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * DataKind {@link android.support.v8.renderscript.Element.DataKind#USER} cannot
462192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * be used as input for a {@link android.support.v8.renderscript.Sampler}. In
472192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * general, {@link android.support.v8.renderscript.Allocation} objects that are
482192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * intended for use with a {@link android.support.v8.renderscript.Sampler}
492192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * should use bitmap-derived Elements such as
502192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * {@link android.support.v8.renderscript.Element#RGBA_8888} or {@link
512192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * android.support.v8.renderscript#Element.A_8}.</p>
5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <div class="special reference">
5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <h3>Developer Guides</h3>
552192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <p>For more information about creating an application that uses RenderScript,
562192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * read the
572192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
582192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * developer guide.</p>
5945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * </div>
6045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
6145d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class Element extends BaseObj {
6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int mSize;
6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element[] mElements;
6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    String[] mElementNames;
6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int[] mArraySizes;
6645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int[] mOffsetInBytes;
6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int[] mVisibleElementMap;
6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    DataType mType;
7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    DataKind mKind;
7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    boolean mNormalized;
7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int mVectorSize;
7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private void updateVisibleSubElements() {
7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mElements == null) {
7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return;
7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int noPaddingFieldCount = 0;
8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int fieldCount = mElementNames.length;
8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // Find out how many elements are not padding
8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int ct = 0; ct < fieldCount; ct ++) {
8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mElementNames[ct].charAt(0) != '#') {
8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                noPaddingFieldCount ++;
8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mVisibleElementMap = new int[noPaddingFieldCount];
8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // Make a map that points us at non-padding elements
9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int ct = 0, ctNoPadding = 0; ct < fieldCount; ct ++) {
9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mElementNames[ct].charAt(0) != '#') {
9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mVisibleElementMap[ctNoPadding ++] = ct;
9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return element size in bytes
9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
100baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    public int getBytesSize() {
101baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        return mSize;
102baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    }
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Returns the number of vector components. 2 for float2, 4 for
10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * float4, etc.
10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return element vector size
10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
109baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    public int getVectorSize() {
110baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        return mVectorSize;
111baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    }
11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
11545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * DataType represents the basic type information for a basic element.  The
11645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * naming convention follows.  For numeric types it is FLOAT,
11745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
11845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * size of the data.  BOOLEAN is a true / false (1,0)
11945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * represented in an 8 bit container.  The UNSIGNED variants
12045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * with multiple bit definitions are for packed graphical data
12145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * formats and represent vectors with per vector member sizes
12245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * which are treated as a single unit for packing and alignment
12345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * purposes.
12445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
12545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * MATRIX the three matrix types contain FLOAT_32 elements and are treated
12645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * as 32 bits for alignment purposes.
12745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
12845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * RS_* objects.  32 bit opaque handles.
12945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
13045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public enum DataType {
13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        NONE (0, 0),
13245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        //FLOAT_16 (1, 2),
13345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        FLOAT_32 (2, 4),
13445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        FLOAT_64 (3, 8),
13545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        SIGNED_8 (4, 1),
13645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        SIGNED_16 (5, 2),
13745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        SIGNED_32 (6, 4),
13845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        SIGNED_64 (7, 8),
13945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_8 (8, 1),
14045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_16 (9, 2),
14145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_32 (10, 4),
14245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_64 (11, 8),
14345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
14445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        BOOLEAN(12, 1),
14545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
14645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_5_6_5 (13, 2),
14745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_5_5_5_1 (14, 2),
14845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        UNSIGNED_4_4_4_4 (15, 2),
14945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        MATRIX_4X4 (16, 64),
15145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        MATRIX_3X3 (17, 36),
15245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        MATRIX_2X2 (18, 16),
15345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
154bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        RS_ELEMENT (1000),
155bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        RS_TYPE (1001),
156bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        RS_ALLOCATION (1002),
157bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        RS_SAMPLER (1003),
158bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        RS_SCRIPT (1004);
15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mID;
16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mSize;
16245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        DataType(int id, int size) {
16345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mID = id;
16445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mSize = size;
16545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
166bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
167bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        DataType(int id) {
168bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            mID = id;
169bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            mSize = 4;
170bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            if (RenderScript.sPointerSize == 8) {
171bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                mSize = 32;
172bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            }
173bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        }
17445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
17545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
17645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
17745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * The special interpretation of the data if required.  This is primarly
17845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * useful for graphical data.  USER indicates no special interpretation is
17945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * expected.  PIXEL is used in conjunction with the standard data types for
18045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * representing texture formats.
18145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
18245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public enum DataKind {
18345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        USER (0),
18445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        PIXEL_L (7),
18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        PIXEL_A (8),
18745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        PIXEL_LA (9),
18845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        PIXEL_RGB (10),
18938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        PIXEL_RGBA (11),
19038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        PIXEL_DEPTH (12),
19138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        PIXEL_YUV(13);
19245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mID;
19445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        DataKind(int id) {
19545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mID = id;
19645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
19745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Return if a element is too complex for use as a data source for a Mesh or
20145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * a Program.
20245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
20345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return boolean
20445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
20545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public boolean isComplex() {
20645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mElements == null) {
20745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return false;
20845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
20945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int ct=0; ct < mElements.length; ct++) {
21045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mElements[ct].mElements != null) {
21145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                return true;
21245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
21345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
21445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return false;
21545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
21645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
21745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
21845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * Elements could be simple, such as an int or a float, or a
21945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * structure with multiple sub elements, such as a collection of
22045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * floats, float2, float4. This function returns zero for simple
22145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * elements or the number of sub-elements otherwise.
22245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return number of sub-elements in this element
22345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
22445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getSubElementCount() {
22545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mVisibleElementMap == null) {
22645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return 0;
22745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
22845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mVisibleElementMap.length;
22945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
23045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
23145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
23245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * For complex elements, this function will return the
23345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * sub-element at index
23445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param index index of the sub-element to return
23545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return sub-element in this element at given index
23645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
23745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public Element getSubElement(int index) {
23845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mVisibleElementMap == null) {
23945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
24045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
24145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
24245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
24345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
24445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mElements[mVisibleElementMap[index]];
24545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
24645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
24745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
24845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * For complex elements, this function will return the
24945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * sub-element name at index
25045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param index index of the sub-element
25145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return sub-element in this element at given index
25245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
25345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public String getSubElementName(int index) {
25445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mVisibleElementMap == null) {
25545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
25645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
25745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
25845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
25945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
26045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mElementNames[mVisibleElementMap[index]];
26145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
26245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
26345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
26445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * For complex elements, some sub-elements could be statically
26545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * sized arrays. This function will return the array size for
26645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * sub-element at index
26745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param index index of the sub-element
26845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return array size of sub-element in this element at given index
26945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
27045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getSubElementArraySize(int index) {
27145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mVisibleElementMap == null) {
27245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
27345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
27445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
27545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
27645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
27745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mArraySizes[mVisibleElementMap[index]];
27845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
27945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
28045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
28145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * This function specifies the location of a sub-element within
28245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * the element
28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @param index index of the sub-element
28445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return offset in bytes of sub-element in this element at given index
28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
28645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public int getSubElementOffsetBytes(int index) {
28745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mVisibleElementMap == null) {
28845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
28945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
29045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
29245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mOffsetInBytes[mVisibleElementMap[index]];
29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
29545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
29645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
29745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return element data type
29845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
29945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public DataType getDataType() {
30045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mType;
30145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
30245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
30345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
30445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    * @return element data kind
30545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    */
30645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public DataKind getDataKind() {
30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mKind;
30845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Utility function for returning an Element containing a single Boolean.
31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
31345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs Context to which the element will belong.
31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element BOOLEAN(RenderScript rs) {
31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_BOOLEAN == null) {
31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_BOOLEAN = createUser(rs, DataType.BOOLEAN);
32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_BOOLEAN;
32245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
32345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
32445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
32545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Utility function for returning an Element containing a single UNSIGNED_8.
32645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
32745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs Context to which the element will belong.
32845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
32945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
33045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
33145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U8(RenderScript rs) {
33245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_U8 == null) {
33345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_U8 = createUser(rs, DataType.UNSIGNED_8);
33445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
33545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_U8;
33645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
33745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
33845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
33945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Utility function for returning an Element containing a single SIGNED_8.
34045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
34145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs Context to which the element will belong.
34245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
34345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
34445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
34545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I8(RenderScript rs) {
34645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_I8 == null) {
34745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_I8 = createUser(rs, DataType.SIGNED_8);
34845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
34945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_I8;
35045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
35145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
35245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U16(RenderScript rs) {
35345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_U16 == null) {
35445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_U16 = createUser(rs, DataType.UNSIGNED_16);
35545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
35645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_U16;
35745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
35845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
35945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I16(RenderScript rs) {
36045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_I16 == null) {
36145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_I16 = createUser(rs, DataType.SIGNED_16);
36245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
36345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_I16;
36445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
36545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
36645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U32(RenderScript rs) {
36745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_U32 == null) {
36845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_U32 = createUser(rs, DataType.UNSIGNED_32);
36945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
37045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_U32;
37145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
37245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
37345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I32(RenderScript rs) {
37445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_I32 == null) {
37545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_I32 = createUser(rs, DataType.SIGNED_32);
37645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
37745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_I32;
37845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
37945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
38045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U64(RenderScript rs) {
38145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_U64 == null) {
38245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_U64 = createUser(rs, DataType.UNSIGNED_64);
38345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
38445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_U64;
38545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
38645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
38745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I64(RenderScript rs) {
38845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_I64 == null) {
38945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_I64 = createUser(rs, DataType.SIGNED_64);
39045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
39145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_I64;
39245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
39345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
39445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F32(RenderScript rs) {
39545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_F32 == null) {
39645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_F32 = createUser(rs, DataType.FLOAT_32);
39745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
39845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_F32;
39945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
40045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
40145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F64(RenderScript rs) {
40245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_F64 == null) {
40345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_F64 = createUser(rs, DataType.FLOAT_64);
40445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
40545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_F64;
40645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
40745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
40845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element ELEMENT(RenderScript rs) {
40945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_ELEMENT == null) {
41045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_ELEMENT = createUser(rs, DataType.RS_ELEMENT);
41145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
41245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_ELEMENT;
41345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
41545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element TYPE(RenderScript rs) {
41645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_TYPE == null) {
41745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_TYPE = createUser(rs, DataType.RS_TYPE);
41845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
41945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_TYPE;
42045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
42145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
42245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element ALLOCATION(RenderScript rs) {
42345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_ALLOCATION == null) {
42445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_ALLOCATION = createUser(rs, DataType.RS_ALLOCATION);
42545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
42645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_ALLOCATION;
42745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
42845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
42945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element SAMPLER(RenderScript rs) {
43045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_SAMPLER == null) {
43145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_SAMPLER = createUser(rs, DataType.RS_SAMPLER);
43245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
43345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_SAMPLER;
43445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
43545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
43645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element SCRIPT(RenderScript rs) {
43745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_SCRIPT == null) {
43845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_SCRIPT = createUser(rs, DataType.RS_SCRIPT);
43945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
44045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_SCRIPT;
44145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
44245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
44345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
44445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element A_8(RenderScript rs) {
44545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_A_8 == null) {
44645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
44745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
44845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_A_8;
44945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
45045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
45145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element RGB_565(RenderScript rs) {
45245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_RGB_565 == null) {
45345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
45445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
45545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_RGB_565;
45645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
45745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
45845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element RGB_888(RenderScript rs) {
45945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_RGB_888 == null) {
46045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
46145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
46245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_RGB_888;
46345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
46445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
46545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element RGBA_5551(RenderScript rs) {
46645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_RGBA_5551 == null) {
46745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
46845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
46945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_RGBA_5551;
47045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
47145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
47245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element RGBA_4444(RenderScript rs) {
47345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_RGBA_4444 == null) {
47445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
47545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
47645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_RGBA_4444;
47745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
47845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
47945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element RGBA_8888(RenderScript rs) {
48045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_RGBA_8888 == null) {
48145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
48245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
48345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_RGBA_8888;
48445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
48545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
48645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F32_2(RenderScript rs) {
48745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_FLOAT_2 == null) {
48845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_FLOAT_2 = createVector(rs, DataType.FLOAT_32, 2);
48945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
49045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_FLOAT_2;
49145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
49245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
49345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F32_3(RenderScript rs) {
49445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_FLOAT_3 == null) {
49545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_FLOAT_3 = createVector(rs, DataType.FLOAT_32, 3);
49645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
49745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_FLOAT_3;
49845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
49945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
50045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F32_4(RenderScript rs) {
50145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_FLOAT_4 == null) {
50245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_FLOAT_4 = createVector(rs, DataType.FLOAT_32, 4);
50345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
50445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_FLOAT_4;
50545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
50645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
50745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F64_2(RenderScript rs) {
50845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_DOUBLE_2 == null) {
50945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_DOUBLE_2 = createVector(rs, DataType.FLOAT_64, 2);
51045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
51145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_DOUBLE_2;
51245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
51345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
51445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F64_3(RenderScript rs) {
51545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_DOUBLE_3 == null) {
51645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_DOUBLE_3 = createVector(rs, DataType.FLOAT_64, 3);
51745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
51845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_DOUBLE_3;
51945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
52045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
52145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element F64_4(RenderScript rs) {
52245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_DOUBLE_4 == null) {
52345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_DOUBLE_4 = createVector(rs, DataType.FLOAT_64, 4);
52445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
52545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_DOUBLE_4;
52645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
52745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
52845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U8_2(RenderScript rs) {
52945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_UCHAR_2 == null) {
53045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_UCHAR_2 = createVector(rs, DataType.UNSIGNED_8, 2);
53145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
53245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_UCHAR_2;
53345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
53445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
53545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U8_3(RenderScript rs) {
53645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_UCHAR_3 == null) {
53745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_UCHAR_3 = createVector(rs, DataType.UNSIGNED_8, 3);
53845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
53945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_UCHAR_3;
54045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
54145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
54245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U8_4(RenderScript rs) {
54345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_UCHAR_4 == null) {
54445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_UCHAR_4 = createVector(rs, DataType.UNSIGNED_8, 4);
54545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
54645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_UCHAR_4;
54745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
54845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
54945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I8_2(RenderScript rs) {
55045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_CHAR_2 == null) {
55145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_CHAR_2 = createVector(rs, DataType.SIGNED_8, 2);
55245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
55345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_CHAR_2;
55445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
55545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
55645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I8_3(RenderScript rs) {
55745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_CHAR_3 == null) {
55845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_CHAR_3 = createVector(rs, DataType.SIGNED_8, 3);
55945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
56045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_CHAR_3;
56145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
56245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
56345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I8_4(RenderScript rs) {
56445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_CHAR_4 == null) {
56545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_CHAR_4 = createVector(rs, DataType.SIGNED_8, 4);
56645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
56745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_CHAR_4;
56845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
56945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
57045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U16_2(RenderScript rs) {
57145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_USHORT_2 == null) {
57245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_USHORT_2 = createVector(rs, DataType.UNSIGNED_16, 2);
57345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
57445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_USHORT_2;
57545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
57645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
57745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U16_3(RenderScript rs) {
57845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_USHORT_3 == null) {
57945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_USHORT_3 = createVector(rs, DataType.UNSIGNED_16, 3);
58045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
58145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_USHORT_3;
58245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
58345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
58445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U16_4(RenderScript rs) {
58545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_USHORT_4 == null) {
58645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_USHORT_4 = createVector(rs, DataType.UNSIGNED_16, 4);
58745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
58845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_USHORT_4;
58945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
59045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
59145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I16_2(RenderScript rs) {
59245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_SHORT_2 == null) {
59345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_SHORT_2 = createVector(rs, DataType.SIGNED_16, 2);
59445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
59545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_SHORT_2;
59645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
59745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
59845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I16_3(RenderScript rs) {
59945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_SHORT_3 == null) {
60045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_SHORT_3 = createVector(rs, DataType.SIGNED_16, 3);
60145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
60245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_SHORT_3;
60345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
60445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
60545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I16_4(RenderScript rs) {
60645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_SHORT_4 == null) {
60745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_SHORT_4 = createVector(rs, DataType.SIGNED_16, 4);
60845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
60945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_SHORT_4;
61045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
61145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
61245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U32_2(RenderScript rs) {
61345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_UINT_2 == null) {
61445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_UINT_2 = createVector(rs, DataType.UNSIGNED_32, 2);
61545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
61645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_UINT_2;
61745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
61845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
61945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U32_3(RenderScript rs) {
62045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_UINT_3 == null) {
62145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_UINT_3 = createVector(rs, DataType.UNSIGNED_32, 3);
62245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
62345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_UINT_3;
62445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
62545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
62645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U32_4(RenderScript rs) {
62745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_UINT_4 == null) {
62845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_UINT_4 = createVector(rs, DataType.UNSIGNED_32, 4);
62945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
63045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_UINT_4;
63145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
63245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
63345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I32_2(RenderScript rs) {
63445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_INT_2 == null) {
63545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_INT_2 = createVector(rs, DataType.SIGNED_32, 2);
63645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
63745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_INT_2;
63845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
63945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
64045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I32_3(RenderScript rs) {
64145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_INT_3 == null) {
64245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_INT_3 = createVector(rs, DataType.SIGNED_32, 3);
64345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
64445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_INT_3;
64545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
64645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
64745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I32_4(RenderScript rs) {
64845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_INT_4 == null) {
64945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_INT_4 = createVector(rs, DataType.SIGNED_32, 4);
65045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
65145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_INT_4;
65245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
65345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
65445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U64_2(RenderScript rs) {
65545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_ULONG_2 == null) {
65645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_ULONG_2 = createVector(rs, DataType.UNSIGNED_64, 2);
65745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
65845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_ULONG_2;
65945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
66045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
66145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U64_3(RenderScript rs) {
66245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_ULONG_3 == null) {
66345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_ULONG_3 = createVector(rs, DataType.UNSIGNED_64, 3);
66445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
66545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_ULONG_3;
66645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
66745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
66845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element U64_4(RenderScript rs) {
66945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_ULONG_4 == null) {
67045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_ULONG_4 = createVector(rs, DataType.UNSIGNED_64, 4);
67145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
67245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_ULONG_4;
67345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
67445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
67545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I64_2(RenderScript rs) {
67645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_LONG_2 == null) {
67745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_LONG_2 = createVector(rs, DataType.SIGNED_64, 2);
67845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
67945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_LONG_2;
68045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
68145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
68245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I64_3(RenderScript rs) {
68345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_LONG_3 == null) {
68445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_LONG_3 = createVector(rs, DataType.SIGNED_64, 3);
68545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
68645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_LONG_3;
68745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
68845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
68945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element I64_4(RenderScript rs) {
69045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_LONG_4 == null) {
69145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_LONG_4 = createVector(rs, DataType.SIGNED_64, 4);
69245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
69345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_LONG_4;
69445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
69545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
69645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element MATRIX_4X4(RenderScript rs) {
69745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_MATRIX_4X4 == null) {
69845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
69945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
70045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_MATRIX_4X4;
70145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
70245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
70345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element MATRIX_3X3(RenderScript rs) {
70445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_MATRIX_3X3 == null) {
70545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
70645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
70745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_MATRIX_3X3;
70845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
70945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
71045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element MATRIX_2X2(RenderScript rs) {
71145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(rs.mElement_MATRIX_2X2 == null) {
71245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
71345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
71445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.mElement_MATRIX_2X2;
71545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
71645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
717bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    Element(long id, RenderScript rs, Element[] e, String[] n, int[] as) {
71845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(id, rs);
71945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mSize = 0;
72045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mVectorSize = 1;
72145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mElements = e;
72245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mElementNames = n;
72345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mArraySizes = as;
72445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mType = DataType.NONE;
72545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mKind = DataKind.USER;
72645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mOffsetInBytes = new int[mElements.length];
72745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int ct = 0; ct < mElements.length; ct++ ) {
72845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mOffsetInBytes[ct] = mSize;
72945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mSize += mElements[ct].mSize * mArraySizes[ct];
73045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
73145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        updateVisibleSubElements();
73245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
73345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
734bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    Element(long id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
73545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(id, rs);
73645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if ((dt != DataType.UNSIGNED_5_6_5) &&
73745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            (dt != DataType.UNSIGNED_4_4_4_4) &&
73845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            (dt != DataType.UNSIGNED_5_5_5_1)) {
73945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (size == 3) {
74045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mSize = dt.mSize * 4;
74145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            } else {
74245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mSize = dt.mSize * size;
74345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
74445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } else {
74545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mSize = dt.mSize;
74645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
74745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mType = dt;
74845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mKind = dk;
74945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mNormalized = norm;
75045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mVectorSize = size;
75145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
75245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
753bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    Element(long id, RenderScript rs) {
75445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(id, rs);
75545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
75645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /*
7586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * Get an identical dummy Element for Compat Context
7596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
7606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
7616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    public long getDummyElement(RenderScript mRS) {
7626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return mRS.nIncElementCreate(mType.mID, mKind.mID, mNormalized, mVectorSize);
7636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
76445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
76545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Create a custom Element of the specified DataType.  The DataKind will be
76645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * set to USER and the vector size to 1 indicating non-vector.
76745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
76845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs The context associated with the new Element.
76945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param dt The DataType for the new element.
77045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
77145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
77245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static Element createUser(RenderScript rs, DataType dt) {
77345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        DataKind dk = DataKind.USER;
77445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean norm = false;
77545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int vecSize = 1;
776bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        long id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
77745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return new Element(id, rs, dt, dk, norm, vecSize);
77845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
77945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
78045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
78145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Create a custom vector element of the specified DataType and vector size.
78245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * DataKind will be set to USER. Only primitive types (FLOAT_32, FLOAT_64,
78345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, UNSIGNED_8, UNSIGNED_16,
78445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * UNSIGNED_32, UNSIGNED_64, BOOLEAN) are supported.
78545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
78645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs The context associated with the new Element.
78745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param dt The DataType for the new Element.
78845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param size Vector size for the new Element.  Range 2-4 inclusive
78945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *             supported.
79045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
79145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
79245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
79345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element createVector(RenderScript rs, DataType dt, int size) {
79445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (size < 2 || size > 4) {
79545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Vector size out of range 2-4.");
79645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
79745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
79845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        switch (dt) {
79945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // Support only primitive integer/float/boolean types as vectors.
80045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case FLOAT_32:
80145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case FLOAT_64:
80245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case SIGNED_8:
80345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case SIGNED_16:
80445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case SIGNED_32:
80545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case SIGNED_64:
80645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case UNSIGNED_8:
80745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case UNSIGNED_16:
80845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case UNSIGNED_32:
80945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case UNSIGNED_64:
81045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case BOOLEAN: {
81145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            DataKind dk = DataKind.USER;
81245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            boolean norm = false;
813bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            long id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
81445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return new Element(id, rs, dt, dk, norm, size);
81545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
81645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
81745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        default: {
81845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Cannot create vector of " +
81945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                "non-primitive type.");
82045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
82145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
82245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
82345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
82445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
82545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Create a new pixel Element type.  A matching DataType and DataKind must
82645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * be provided.  The DataType and DataKind must contain the same number of
82745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * components.  Vector size will be set to 1.
82845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
82945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs The context associated with the new Element.
83045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param dt The DataType for the new element.
83145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param dk The DataKind to specify the mapping of each component in the
83245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *           DataType.
83345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
83445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return Element
83545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
83645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
83745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (!(dk == DataKind.PIXEL_L ||
83845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dk == DataKind.PIXEL_A ||
83945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dk == DataKind.PIXEL_LA ||
84045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dk == DataKind.PIXEL_RGB ||
84138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams              dk == DataKind.PIXEL_RGBA ||
84238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams              dk == DataKind.PIXEL_DEPTH ||
84338f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams              dk == DataKind.PIXEL_YUV)) {
84445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Unsupported DataKind");
84545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
84645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (!(dt == DataType.UNSIGNED_8 ||
84745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dt == DataType.UNSIGNED_16 ||
84845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dt == DataType.UNSIGNED_5_6_5 ||
84945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dt == DataType.UNSIGNED_4_4_4_4 ||
85045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams              dt == DataType.UNSIGNED_5_5_5_1)) {
85145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Unsupported DataType");
85245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
85345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
85445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
85545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
85645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
85745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
85845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
85945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
86045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
86145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
86238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        if (dt == DataType.UNSIGNED_16 &&
86338f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams            dk != DataKind.PIXEL_DEPTH) {
86438f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
86538f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        }
86645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
86745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int size = 1;
86845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        switch (dk) {
86945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case PIXEL_LA:
87045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            size = 2;
87145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            break;
87245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case PIXEL_RGB:
87345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            size = 3;
87445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            break;
87545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        case PIXEL_RGBA:
87645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            size = 4;
87745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            break;
87845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
87945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
88045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean norm = true;
881bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        long id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
88245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return new Element(id, rs, dt, dk, norm, size);
88345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
88445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
88545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
88645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Check if the current Element is compatible with another Element.
88745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Primitive Elements are compatible if they share the same underlying
88845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * size and type (i.e. U8 is compatible with A_8). User-defined Elements
88945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * must be equal in order to be compatible. This requires strict name
89045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * equivalence for all sub-Elements (in addition to structural equivalence).
89145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
89245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param e The Element to check compatibility with.
89345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
89445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return boolean true if the Elements are compatible, otherwise false.
89545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
89645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public boolean isCompatible(Element e) {
89745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // Try strict BaseObj equality to start with.
89845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (this.equals(e)) {
89945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return true;
90045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
90145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
90245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // Ignore mKind because it is allowed to be different (user vs. pixel).
90345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // We also ignore mNormalized because it can be different. The mType
90445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // field must not be NONE since we require name equivalence for
90545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // all user-created Elements.
90645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return ((mSize == e.mSize) &&
90745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                (mType != DataType.NONE) &&
90845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                (mType == e.mType) &&
90945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                (mVectorSize == e.mVectorSize));
91045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
91145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
91245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
91345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Builder class for producing complex elements with matching field and name
91445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * pairs.  The builder starts empty.  The order in which elements are added
91545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * is retained for the layout in memory.
91645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
91745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
91845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class Builder {
919a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
92045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript mRS;
92145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Element[] mElements;
92245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        String[] mElementNames;
92345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int[] mArraySizes;
92445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mCount;
92545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mSkipPadding;
92645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
92745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
92845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * Create a builder object.
92945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
93045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param rs
93145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
93245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder(RenderScript rs) {
93345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS = rs;
93445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mCount = 0;
93545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mElements = new Element[8];
93645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mElementNames = new String[8];
93745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mArraySizes = new int[8];
93845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
93945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
94045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
94145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * Add an array of elements to this element.
94245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
94345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param element
94445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param name
94545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param arraySize
94645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
94745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder add(Element element, String name, int arraySize) {
94845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (arraySize < 1) {
94945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                throw new RSIllegalArgumentException("Array size cannot be less than 1.");
95045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
95145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
95245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            // Skip padding fields after a vector 3 type.
95345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (mSkipPadding != 0) {
95445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (name.startsWith("#padding_")) {
95545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    mSkipPadding = 0;
95645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    return this;
95745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
95845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
95945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
96045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if (element.mVectorSize == 3) {
96145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mSkipPadding = 1;
96245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            } else {
96345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mSkipPadding = 0;
96445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
96545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
96645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            if(mCount == mElements.length) {
96745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                Element[] e = new Element[mCount + 8];
96845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                String[] s = new String[mCount + 8];
96945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int[] as = new int[mCount + 8];
97045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                System.arraycopy(mElements, 0, e, 0, mCount);
97145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                System.arraycopy(mElementNames, 0, s, 0, mCount);
97245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                System.arraycopy(mArraySizes, 0, as, 0, mCount);
97345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mElements = e;
97445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mElementNames = s;
97545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                mArraySizes = as;
97645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
97745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mElements[mCount] = element;
97845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mElementNames[mCount] = name;
97945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mArraySizes[mCount] = arraySize;
98045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mCount++;
981a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
98245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return this;
98345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
98445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
98545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
98645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * Add a single element to this Element.
98745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
98845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param element
98945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @param name
99045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
99145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Builder add(Element element, String name) {
99245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return add(element, name, 1);
99345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
99445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
99545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        /**
99645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * Create the element from this builder.
99745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
99845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         *
99945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         * @return Element
100045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams         */
100145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Element create() {
100245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS.validate();
100345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            Element[] ein = new Element[mCount];
100445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            String[] sin = new String[mCount];
100545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            int[] asin = new int[mCount];
100645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
100745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
100845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
100945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1010bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            long[] ids = new long[ein.length];
101145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            for (int ct = 0; ct < ein.length; ct++ ) {
101245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                ids[ct] = ein[ct].getID(mRS);
101345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
1014a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
1015bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            long id = mRS.nElementCreate2(ids, sin, asin);
101645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return new Element(id, mRS, ein, sin, asin);
101745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
101845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
101945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
102045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1021