198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
2ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Copyright (C) 2013 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Field;
20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
247d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * <p>An Element represents one item within an {@link
2560c5b31f4448410221de043873b94797732afa66Stephen Hines * android.support.v8.renderscript.Allocation}.  An Element is roughly
2660c5b31f4448410221de043873b94797732afa66Stephen Hines * equivalent to a C type in a RenderScript kernel. Elements may be basic or
2760c5b31f4448410221de043873b94797732afa66Stephen Hines * complex. Some basic elements are</p> <ul> <li>A single float value
2860c5b31f4448410221de043873b94797732afa66Stephen Hines * (equivalent to a float in a kernel)</li> <li>A four-element float vector
2960c5b31f4448410221de043873b94797732afa66Stephen Hines * (equivalent to a float4 in a kernel)</li> <li>An unsigned 32-bit integer
3060c5b31f4448410221de043873b94797732afa66Stephen Hines * (equivalent to an unsigned int in a kernel)</li> <li>A single signed 8-bit
3160c5b31f4448410221de043873b94797732afa66Stephen Hines * integer (equivalent to a char in a kernel)</li> </ul> <p>A complex element is
3260c5b31f4448410221de043873b94797732afa66Stephen Hines * roughly equivalent to a C struct and contains a number of basic or complex
3360c5b31f4448410221de043873b94797732afa66Stephen Hines * Elements. From Java code, a complex element contains a list of sub-elements
3460c5b31f4448410221de043873b94797732afa66Stephen Hines * and names that represents a particular data structure. Structs used in RS
3560c5b31f4448410221de043873b94797732afa66Stephen Hines * scripts are available to Java code by using the
3660c5b31f4448410221de043873b94797732afa66Stephen Hines * {@code ScriptField_structname} class that is reflected from a particular
3760c5b31f4448410221de043873b94797732afa66Stephen Hines * script.</p>
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
397d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * <p>Basic Elements are comprised of a {@link
4060c5b31f4448410221de043873b94797732afa66Stephen Hines * android.support.v8.renderscript.Element.DataType} and a {@link
4160c5b31f4448410221de043873b94797732afa66Stephen Hines * android.support.v8.renderscript.Element.DataKind}. The DataType encodes C
4260c5b31f4448410221de043873b94797732afa66Stephen Hines * type information of an Element, while the DataKind encodes how that Element
4360c5b31f4448410221de043873b94797732afa66Stephen Hines * should be interpreted by a {@link android.support.v8.renderscript.Sampler}.
4460c5b31f4448410221de043873b94797732afa66Stephen Hines * Note that {@link android.support.v8.renderscript.Allocation} objects with
4560c5b31f4448410221de043873b94797732afa66Stephen Hines * DataKind {@link android.support.v8.renderscript.Element.DataKind#USER} cannot
4660c5b31f4448410221de043873b94797732afa66Stephen Hines * be used as input for a {@link android.support.v8.renderscript.Sampler}. In
4760c5b31f4448410221de043873b94797732afa66Stephen Hines * general, {@link android.support.v8.renderscript.Allocation} objects that are
4860c5b31f4448410221de043873b94797732afa66Stephen Hines * intended for use with a {@link android.support.v8.renderscript.Sampler}
4960c5b31f4448410221de043873b94797732afa66Stephen Hines * should use bitmap-derived Elements such as
5060c5b31f4448410221de043873b94797732afa66Stephen Hines * {@link android.support.v8.renderscript.Element#RGBA_8888} or {@link
5160c5b31f4448410221de043873b94797732afa66Stephen Hines * android.support.v8.renderscript#Element.A_8}.</p>
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <div class="special reference">
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <h3>Developer Guides</h3>
5560c5b31f4448410221de043873b94797732afa66Stephen Hines * <p>For more information about creating an application that uses RenderScript,
5660c5b31f4448410221de043873b94797732afa66Stephen Hines * read the
5760c5b31f4448410221de043873b94797732afa66Stephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a>
5860c5b31f4448410221de043873b94797732afa66Stephen Hines * developer guide.</p>
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </div>
6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Element extends BaseObj {
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mSize;
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element[] mElements;
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    String[] mElementNames;
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int[] mArraySizes;
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int[] mOffsetInBytes;
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int[] mVisibleElementMap;
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    DataType mType;
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    DataKind mKind;
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mNormalized;
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mVectorSize;
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void updateVisibleSubElements() {
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mElements == null) {
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int noPaddingFieldCount = 0;
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int fieldCount = mElementNames.length;
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Find out how many elements are not padding
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct = 0; ct < fieldCount; ct ++) {
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mElementNames[ct].charAt(0) != '#') {
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                noPaddingFieldCount ++;
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mVisibleElementMap = new int[noPaddingFieldCount];
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Make a map that points us at non-padding elements
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct = 0, ctNoPadding = 0; ct < fieldCount; ct ++) {
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mElementNames[ct].charAt(0) != '#') {
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mVisibleElementMap[ctNoPadding ++] = ct;
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return element size in bytes
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
100ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public int getBytesSize() {
101ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        return mSize;
102ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Returns the number of vector components. 2 for float2, 4 for
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * float4, etc.
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return element vector size
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
109ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public int getVectorSize() {
110ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        return mVectorSize;
111ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * DataType represents the basic type information for a basic element.  The
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * naming convention follows.  For numeric types it is FLOAT,
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * size of the data.  BOOLEAN is a true / false (1,0)
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * represented in an 8 bit container.  The UNSIGNED variants
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * with multiple bit definitions are for packed graphical data
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * formats and represent vectors with per vector member sizes
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * which are treated as a single unit for packing and alignment
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * purposes.
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * MATRIX the three matrix types contain FLOAT_32 elements and are treated
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * as 32 bits for alignment purposes.
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * RS_* objects.  32 bit opaque handles.
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum DataType {
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NONE (0, 0),
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        //FLOAT_16 (1, 2),
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        FLOAT_32 (2, 4),
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        FLOAT_64 (3, 8),
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_8 (4, 1),
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_16 (5, 2),
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_32 (6, 4),
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_64 (7, 8),
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_8 (8, 1),
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_16 (9, 2),
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_32 (10, 4),
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_64 (11, 8),
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        BOOLEAN(12, 1),
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_5_6_5 (13, 2),
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_5_5_5_1 (14, 2),
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_4_4_4_4 (15, 2),
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MATRIX_4X4 (16, 64),
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MATRIX_3X3 (17, 36),
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MATRIX_2X2 (18, 16),
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_ELEMENT (1000, 4),
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_TYPE (1001, 4),
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_ALLOCATION (1002, 4),
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_SAMPLER (1003, 4),
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_SCRIPT (1004, 4);
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mSize;
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        DataType(int id, int size) {
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mSize = size;
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * The special interpretation of the data if required.  This is primarly
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * useful for graphical data.  USER indicates no special interpretation is
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * expected.  PIXEL is used in conjunction with the standard data types for
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * representing texture formats.
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum DataKind {
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        USER (0),
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_L (7),
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_A (8),
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_LA (9),
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_RGB (10),
181f681be1f0ec328acaa311478887352a456d52be8Jason Sams        PIXEL_RGBA (11),
182f681be1f0ec328acaa311478887352a456d52be8Jason Sams        PIXEL_DEPTH (12),
183f681be1f0ec328acaa311478887352a456d52be8Jason Sams        PIXEL_YUV(13);
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        DataKind(int id) {
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Return if a element is too complex for use as a data source for a Mesh or
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * a Program.
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean isComplex() {
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mElements == null) {
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return false;
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct=0; ct < mElements.length; ct++) {
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mElements[ct].mElements != null) {
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                return true;
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return false;
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Elements could be simple, such as an int or a float, or a
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * structure with multiple sub elements, such as a collection of
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * floats, float2, float4. This function returns zero for simple
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * elements or the number of sub-elements otherwise.
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return number of sub-elements in this element
21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getSubElementCount() {
21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mVisibleElementMap == null) {
21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return 0;
21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mVisibleElementMap.length;
22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * For complex elements, this function will return the
22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * sub-element at index
22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param index index of the sub-element to return
22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return sub-element in this element at given index
22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public Element getSubElement(int index) {
23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mVisibleElementMap == null) {
23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mElements[mVisibleElementMap[index]];
23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * For complex elements, this function will return the
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * sub-element name at index
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param index index of the sub-element
24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return sub-element in this element at given index
24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public String getSubElementName(int index) {
24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mVisibleElementMap == null) {
24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
25098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mElementNames[mVisibleElementMap[index]];
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * For complex elements, some sub-elements could be statically
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * sized arrays. This function will return the array size for
25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * sub-element at index
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param index index of the sub-element
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return array size of sub-element in this element at given index
26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getSubElementArraySize(int index) {
26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mVisibleElementMap == null) {
26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
26898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
26998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mArraySizes[mVisibleElementMap[index]];
27098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
27298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
27398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * This function specifies the location of a sub-element within
27498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * the element
27598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @param index index of the sub-element
27698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return offset in bytes of sub-element in this element at given index
27798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
27898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getSubElementOffsetBytes(int index) {
27998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mVisibleElementMap == null) {
28098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Element contains no sub-elements");
28198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
28298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (index < 0 || index >= mVisibleElementMap.length) {
28398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Illegal sub-element index");
28498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
28598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mOffsetInBytes[mVisibleElementMap[index]];
28698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
28798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
28898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
28998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return element data type
29098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
29198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public DataType getDataType() {
29298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mType;
29398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
29498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
29598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
29698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return element data kind
29798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
29898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public DataKind getDataKind() {
29998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mKind;
30098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
30198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
30298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
30398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Utility function for returning an Element containing a single Boolean.
30498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
30598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the element will belong.
30698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
30798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
30898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
30998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element BOOLEAN(RenderScript rs) {
31098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_BOOLEAN == null) {
31198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_BOOLEAN = createUser(rs, DataType.BOOLEAN);
31298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
31398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_BOOLEAN;
31498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
31598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
31698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
31798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Utility function for returning an Element containing a single UNSIGNED_8.
31898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
31998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the element will belong.
32098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
32198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
32298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
32398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U8(RenderScript rs) {
32498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_U8 == null) {
32598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_U8 = createUser(rs, DataType.UNSIGNED_8);
32698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
32798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_U8;
32898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
32998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
33098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
33198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Utility function for returning an Element containing a single SIGNED_8.
33298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
33398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to which the element will belong.
33498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
33598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
33698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
33798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I8(RenderScript rs) {
33898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_I8 == null) {
33998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_I8 = createUser(rs, DataType.SIGNED_8);
34098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
34198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_I8;
34298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
34398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
34498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U16(RenderScript rs) {
34598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_U16 == null) {
34698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_U16 = createUser(rs, DataType.UNSIGNED_16);
34798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
34898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_U16;
34998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
35098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
35198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I16(RenderScript rs) {
35298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_I16 == null) {
35398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_I16 = createUser(rs, DataType.SIGNED_16);
35498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
35598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_I16;
35698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
35798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
35898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U32(RenderScript rs) {
35998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_U32 == null) {
36098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_U32 = createUser(rs, DataType.UNSIGNED_32);
36198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
36298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_U32;
36398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
36498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
36598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I32(RenderScript rs) {
36698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_I32 == null) {
36798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_I32 = createUser(rs, DataType.SIGNED_32);
36898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
36998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_I32;
37098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
37198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
37298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U64(RenderScript rs) {
37398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_U64 == null) {
37498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_U64 = createUser(rs, DataType.UNSIGNED_64);
37598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
37698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_U64;
37798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
37898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
37998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I64(RenderScript rs) {
38098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_I64 == null) {
38198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_I64 = createUser(rs, DataType.SIGNED_64);
38298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
38398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_I64;
38498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
38598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
38698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F32(RenderScript rs) {
38798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_F32 == null) {
38898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_F32 = createUser(rs, DataType.FLOAT_32);
38998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
39098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_F32;
39198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
39298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
39398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F64(RenderScript rs) {
39498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_F64 == null) {
39598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_F64 = createUser(rs, DataType.FLOAT_64);
39698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
39798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_F64;
39898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
39998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
40098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element ELEMENT(RenderScript rs) {
40198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_ELEMENT == null) {
40298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_ELEMENT = createUser(rs, DataType.RS_ELEMENT);
40398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
40498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_ELEMENT;
40598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
40698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
40798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element TYPE(RenderScript rs) {
40898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_TYPE == null) {
40998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_TYPE = createUser(rs, DataType.RS_TYPE);
41098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
41198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_TYPE;
41298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
41398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
41498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element ALLOCATION(RenderScript rs) {
41598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_ALLOCATION == null) {
41698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_ALLOCATION = createUser(rs, DataType.RS_ALLOCATION);
41798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
41898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_ALLOCATION;
41998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
42098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
42198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element SAMPLER(RenderScript rs) {
42298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_SAMPLER == null) {
42398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_SAMPLER = createUser(rs, DataType.RS_SAMPLER);
42498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
42598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_SAMPLER;
42698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
42798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
42898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element SCRIPT(RenderScript rs) {
42998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_SCRIPT == null) {
43098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_SCRIPT = createUser(rs, DataType.RS_SCRIPT);
43198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
43298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_SCRIPT;
43398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
43498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
43598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
43698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element A_8(RenderScript rs) {
43798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_A_8 == null) {
43898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
43998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
44098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_A_8;
44198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
44298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
44398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element RGB_565(RenderScript rs) {
44498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_RGB_565 == null) {
44598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
44698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
44798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_RGB_565;
44898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
44998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
45098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element RGB_888(RenderScript rs) {
45198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_RGB_888 == null) {
45298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
45398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
45498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_RGB_888;
45598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
45698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
45798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element RGBA_5551(RenderScript rs) {
45898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_RGBA_5551 == null) {
45998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
46098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
46198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_RGBA_5551;
46298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
46398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
46498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element RGBA_4444(RenderScript rs) {
46598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_RGBA_4444 == null) {
46698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
46798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
46898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_RGBA_4444;
46998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
47098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element RGBA_8888(RenderScript rs) {
47298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_RGBA_8888 == null) {
47398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
47498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
47598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_RGBA_8888;
47698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
47798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F32_2(RenderScript rs) {
47998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_FLOAT_2 == null) {
48098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_FLOAT_2 = createVector(rs, DataType.FLOAT_32, 2);
48198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
48298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_FLOAT_2;
48398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
48498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
48598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F32_3(RenderScript rs) {
48698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_FLOAT_3 == null) {
48798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_FLOAT_3 = createVector(rs, DataType.FLOAT_32, 3);
48898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
48998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_FLOAT_3;
49098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
49198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
49298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F32_4(RenderScript rs) {
49398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_FLOAT_4 == null) {
49498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_FLOAT_4 = createVector(rs, DataType.FLOAT_32, 4);
49598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
49698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_FLOAT_4;
49798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
49898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
49998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F64_2(RenderScript rs) {
50098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_DOUBLE_2 == null) {
50198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_DOUBLE_2 = createVector(rs, DataType.FLOAT_64, 2);
50298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
50398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_DOUBLE_2;
50498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
50598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
50698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F64_3(RenderScript rs) {
50798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_DOUBLE_3 == null) {
50898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_DOUBLE_3 = createVector(rs, DataType.FLOAT_64, 3);
50998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
51098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_DOUBLE_3;
51198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
51298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
51398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element F64_4(RenderScript rs) {
51498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_DOUBLE_4 == null) {
51598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_DOUBLE_4 = createVector(rs, DataType.FLOAT_64, 4);
51698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
51798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_DOUBLE_4;
51898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
51998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U8_2(RenderScript rs) {
52198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_UCHAR_2 == null) {
52298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_UCHAR_2 = createVector(rs, DataType.UNSIGNED_8, 2);
52398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
52498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_UCHAR_2;
52598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
52698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U8_3(RenderScript rs) {
52898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_UCHAR_3 == null) {
52998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_UCHAR_3 = createVector(rs, DataType.UNSIGNED_8, 3);
53098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
53198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_UCHAR_3;
53298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
53398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
53498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U8_4(RenderScript rs) {
53598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_UCHAR_4 == null) {
53698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_UCHAR_4 = createVector(rs, DataType.UNSIGNED_8, 4);
53798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
53898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_UCHAR_4;
53998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
54098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I8_2(RenderScript rs) {
54298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_CHAR_2 == null) {
54398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_CHAR_2 = createVector(rs, DataType.SIGNED_8, 2);
54498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
54598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_CHAR_2;
54698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
54798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I8_3(RenderScript rs) {
54998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_CHAR_3 == null) {
55098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_CHAR_3 = createVector(rs, DataType.SIGNED_8, 3);
55198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
55298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_CHAR_3;
55398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
55498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
55598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I8_4(RenderScript rs) {
55698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_CHAR_4 == null) {
55798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_CHAR_4 = createVector(rs, DataType.SIGNED_8, 4);
55898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
55998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_CHAR_4;
56098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
56198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
56298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U16_2(RenderScript rs) {
56398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_USHORT_2 == null) {
56498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_USHORT_2 = createVector(rs, DataType.UNSIGNED_16, 2);
56598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
56698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_USHORT_2;
56798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
56898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
56998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U16_3(RenderScript rs) {
57098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_USHORT_3 == null) {
57198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_USHORT_3 = createVector(rs, DataType.UNSIGNED_16, 3);
57298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
57398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_USHORT_3;
57498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
57598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
57698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U16_4(RenderScript rs) {
57798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_USHORT_4 == null) {
57898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_USHORT_4 = createVector(rs, DataType.UNSIGNED_16, 4);
57998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
58098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_USHORT_4;
58198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
58298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
58398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I16_2(RenderScript rs) {
58498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_SHORT_2 == null) {
58598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_SHORT_2 = createVector(rs, DataType.SIGNED_16, 2);
58698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
58798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_SHORT_2;
58898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
58998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
59098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I16_3(RenderScript rs) {
59198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_SHORT_3 == null) {
59298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_SHORT_3 = createVector(rs, DataType.SIGNED_16, 3);
59398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
59498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_SHORT_3;
59598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
59698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
59798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I16_4(RenderScript rs) {
59898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_SHORT_4 == null) {
59998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_SHORT_4 = createVector(rs, DataType.SIGNED_16, 4);
60098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
60198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_SHORT_4;
60298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
60398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
60498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U32_2(RenderScript rs) {
60598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_UINT_2 == null) {
60698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_UINT_2 = createVector(rs, DataType.UNSIGNED_32, 2);
60798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
60898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_UINT_2;
60998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
61098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
61198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U32_3(RenderScript rs) {
61298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_UINT_3 == null) {
61398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_UINT_3 = createVector(rs, DataType.UNSIGNED_32, 3);
61498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
61598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_UINT_3;
61698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
61798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
61898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U32_4(RenderScript rs) {
61998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_UINT_4 == null) {
62098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_UINT_4 = createVector(rs, DataType.UNSIGNED_32, 4);
62198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
62298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_UINT_4;
62398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
62498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
62598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I32_2(RenderScript rs) {
62698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_INT_2 == null) {
62798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_INT_2 = createVector(rs, DataType.SIGNED_32, 2);
62898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
62998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_INT_2;
63098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
63198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
63298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I32_3(RenderScript rs) {
63398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_INT_3 == null) {
63498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_INT_3 = createVector(rs, DataType.SIGNED_32, 3);
63598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
63698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_INT_3;
63798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
63898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
63998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I32_4(RenderScript rs) {
64098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_INT_4 == null) {
64198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_INT_4 = createVector(rs, DataType.SIGNED_32, 4);
64298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
64398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_INT_4;
64498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
64598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
64698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U64_2(RenderScript rs) {
64798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_ULONG_2 == null) {
64898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_ULONG_2 = createVector(rs, DataType.UNSIGNED_64, 2);
64998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
65098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_ULONG_2;
65198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
65298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
65398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U64_3(RenderScript rs) {
65498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_ULONG_3 == null) {
65598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_ULONG_3 = createVector(rs, DataType.UNSIGNED_64, 3);
65698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
65798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_ULONG_3;
65898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
65998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
66098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element U64_4(RenderScript rs) {
66198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_ULONG_4 == null) {
66298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_ULONG_4 = createVector(rs, DataType.UNSIGNED_64, 4);
66398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
66498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_ULONG_4;
66598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
66698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
66798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I64_2(RenderScript rs) {
66898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_LONG_2 == null) {
66998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_LONG_2 = createVector(rs, DataType.SIGNED_64, 2);
67098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
67198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_LONG_2;
67298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
67398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
67498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I64_3(RenderScript rs) {
67598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_LONG_3 == null) {
67698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_LONG_3 = createVector(rs, DataType.SIGNED_64, 3);
67798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
67898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_LONG_3;
67998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
68098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
68198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element I64_4(RenderScript rs) {
68298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_LONG_4 == null) {
68398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_LONG_4 = createVector(rs, DataType.SIGNED_64, 4);
68498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
68598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_LONG_4;
68698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
68798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
68898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element MATRIX_4X4(RenderScript rs) {
68998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_MATRIX_4X4 == null) {
69098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
69198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
69298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_MATRIX_4X4;
69398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
69498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
69598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element MATRIX_3X3(RenderScript rs) {
69698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_MATRIX_3X3 == null) {
69798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
69898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
69998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_MATRIX_3X3;
70098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
70198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
70298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element MATRIX_2X2(RenderScript rs) {
70398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(rs.mElement_MATRIX_2X2 == null) {
70498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
70598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
70698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs.mElement_MATRIX_2X2;
70798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
70898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
70998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element(int id, RenderScript rs, Element[] e, String[] n, int[] as) {
71098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
71198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mSize = 0;
71298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mVectorSize = 1;
71398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mElements = e;
71498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mElementNames = n;
71598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mArraySizes = as;
71698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType = DataType.NONE;
71798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mKind = DataKind.USER;
71898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mOffsetInBytes = new int[mElements.length];
71998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct = 0; ct < mElements.length; ct++ ) {
72098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mOffsetInBytes[ct] = mSize;
72198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mSize += mElements[ct].mSize * mArraySizes[ct];
72298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
72398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        updateVisibleSubElements();
72498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
72598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
72698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element(int id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
72798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
72898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((dt != DataType.UNSIGNED_5_6_5) &&
72998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (dt != DataType.UNSIGNED_4_4_4_4) &&
73098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            (dt != DataType.UNSIGNED_5_5_5_1)) {
73198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (size == 3) {
73298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mSize = dt.mSize * 4;
73398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            } else {
73498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mSize = dt.mSize * size;
73598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
73698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        } else {
73798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mSize = dt.mSize;
73898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
73998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mType = dt;
74098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mKind = dk;
74198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mNormalized = norm;
74298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mVectorSize = size;
74398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
74498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
74598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element(int id, RenderScript rs) {
74698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
74798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
74898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
74998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
75098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a custom Element of the specified DataType.  The DataKind will be
75198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * set to USER and the vector size to 1 indicating non-vector.
75298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
75398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs The context associated with the new Element.
75498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dt The DataType for the new element.
75598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
75698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
75798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static Element createUser(RenderScript rs, DataType dt) {
758ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        if (rs.isNative) {
759ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            RenderScriptThunker rst = (RenderScriptThunker)rs;
760ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            return ElementThunker.create(rst, dt);
761ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        }
76298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        DataKind dk = DataKind.USER;
76398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean norm = false;
76498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int vecSize = 1;
76598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
76698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Element(id, rs, dt, dk, norm, vecSize);
76798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
76898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
76998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
77098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a custom vector element of the specified DataType and vector size.
77198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * DataKind will be set to USER. Only primitive types (FLOAT_32, FLOAT_64,
77298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, UNSIGNED_8, UNSIGNED_16,
77398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * UNSIGNED_32, UNSIGNED_64, BOOLEAN) are supported.
77498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
77598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs The context associated with the new Element.
77698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dt The DataType for the new Element.
77798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param size Vector size for the new Element.  Range 2-4 inclusive
77898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *             supported.
77998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
78098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
78198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
78298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element createVector(RenderScript rs, DataType dt, int size) {
783ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        if (rs.isNative) {
784ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            RenderScriptThunker rst = (RenderScriptThunker)rs;
785ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            return ElementThunker.createVector(rst, dt, size);
786ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        }
78798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (size < 2 || size > 4) {
78898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Vector size out of range 2-4.");
78998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
79098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
79198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        switch (dt) {
79298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Support only primitive integer/float/boolean types as vectors.
79398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case FLOAT_32:
79498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case FLOAT_64:
79598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_8:
79698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_16:
79798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_32:
79898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_64:
79998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_8:
80098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_16:
80198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_32:
80298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_64:
80398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case BOOLEAN: {
80498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            DataKind dk = DataKind.USER;
80598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            boolean norm = false;
80698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
80798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return new Element(id, rs, dt, dk, norm, size);
80898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
80998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        default: {
81198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Cannot create vector of " +
81298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                "non-primitive type.");
81398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
81498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
81598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
81698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
81898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a new pixel Element type.  A matching DataType and DataKind must
81998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be provided.  The DataType and DataKind must contain the same number of
82098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * components.  Vector size will be set to 1.
82198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
82298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs The context associated with the new Element.
82398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dt The DataType for the new element.
82498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dk The DataKind to specify the mapping of each component in the
82598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *           DataType.
82698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
82798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
82898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
82998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
830ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        if (rs.isNative) {
831ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            RenderScriptThunker rst = (RenderScriptThunker)rs;
832ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            return ElementThunker.createPixel(rst, dt, dk);
833ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        }
834ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
83598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!(dk == DataKind.PIXEL_L ||
83698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_A ||
83798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_LA ||
83898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_RGB ||
839f681be1f0ec328acaa311478887352a456d52be8Jason Sams              dk == DataKind.PIXEL_RGBA ||
840f681be1f0ec328acaa311478887352a456d52be8Jason Sams              dk == DataKind.PIXEL_DEPTH ||
841f681be1f0ec328acaa311478887352a456d52be8Jason Sams              dk == DataKind.PIXEL_YUV)) {
84298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Unsupported DataKind");
84398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
84498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!(dt == DataType.UNSIGNED_8 ||
84598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_16 ||
84698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_5_6_5 ||
84798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_4_4_4_4 ||
84898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_5_5_5_1)) {
84998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Unsupported DataType");
85098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
85198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
85298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
85398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
85498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
85598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
85698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
85798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
85898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
85998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
860f681be1f0ec328acaa311478887352a456d52be8Jason Sams        if (dt == DataType.UNSIGNED_16 &&
861f681be1f0ec328acaa311478887352a456d52be8Jason Sams            dk != DataKind.PIXEL_DEPTH) {
862f681be1f0ec328acaa311478887352a456d52be8Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
863f681be1f0ec328acaa311478887352a456d52be8Jason Sams        }
86498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
86598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int size = 1;
86698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        switch (dk) {
86798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case PIXEL_LA:
86898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            size = 2;
86998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
87098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case PIXEL_RGB:
87198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            size = 3;
87298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
87398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case PIXEL_RGBA:
87498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            size = 4;
87598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
87698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
87798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
87898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean norm = true;
87998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
88098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Element(id, rs, dt, dk, norm, size);
88198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
88298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
88398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
88498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Check if the current Element is compatible with another Element.
88598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Primitive Elements are compatible if they share the same underlying
88698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * size and type (i.e. U8 is compatible with A_8). User-defined Elements
88798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * must be equal in order to be compatible. This requires strict name
88898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * equivalence for all sub-Elements (in addition to structural equivalence).
88998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
89098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param e The Element to check compatibility with.
89198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
89298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean true if the Elements are compatible, otherwise false.
89398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
89498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean isCompatible(Element e) {
89598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Try strict BaseObj equality to start with.
89698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (this.equals(e)) {
89798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return true;
89898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
89998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
90098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Ignore mKind because it is allowed to be different (user vs. pixel).
90198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // We also ignore mNormalized because it can be different. The mType
90298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // field must not be NONE since we require name equivalence for
90398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // all user-created Elements.
90498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return ((mSize == e.mSize) &&
90598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType != DataType.NONE) &&
90698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType == e.mType) &&
90798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mVectorSize == e.mVectorSize));
90898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
90998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
91098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
91198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Builder class for producing complex elements with matching field and name
91298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * pairs.  The builder starts empty.  The order in which elements are added
91398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * is retained for the layout in memory.
91498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
91598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
91698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class Builder {
917ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        ElementThunker.BuilderThunker mT;
918ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
91998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript mRS;
92098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element[] mElements;
92198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        String[] mElementNames;
92298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int[] mArraySizes;
92398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mCount;
92498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mSkipPadding;
92598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
92698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
92798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Create a builder object.
92898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
92998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param rs
93098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
93198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder(RenderScript rs) {
932ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            if (rs.isNative) {
933ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                RenderScriptThunker rst = (RenderScriptThunker)rs;
934ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                mT = new ElementThunker.BuilderThunker(rs);
935ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            }
93698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = rs;
93798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mCount = 0;
93898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElements = new Element[8];
93998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElementNames = new String[8];
94098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mArraySizes = new int[8];
94198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
94298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
94398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
94498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Add an array of elements to this element.
94598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
94698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param element
94798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param name
94898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param arraySize
94998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
95098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder add(Element element, String name, int arraySize) {
951ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            if (mT != null) {
952ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                mT.add(element, name, arraySize);
953ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                return this;
954ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            }
955ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
95698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (arraySize < 1) {
95798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Array size cannot be less than 1.");
95898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
95998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
96098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            // Skip padding fields after a vector 3 type.
96198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mSkipPadding != 0) {
96298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (name.startsWith("#padding_")) {
96398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    mSkipPadding = 0;
96498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    return this;
96598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
96698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
96798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
96898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (element.mVectorSize == 3) {
96998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mSkipPadding = 1;
97098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            } else {
97198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mSkipPadding = 0;
97298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
97398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
97498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(mCount == mElements.length) {
97598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                Element[] e = new Element[mCount + 8];
97698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                String[] s = new String[mCount + 8];
97798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                int[] as = new int[mCount + 8];
97898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                System.arraycopy(mElements, 0, e, 0, mCount);
97998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                System.arraycopy(mElementNames, 0, s, 0, mCount);
98098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                System.arraycopy(mArraySizes, 0, as, 0, mCount);
98198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mElements = e;
98298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mElementNames = s;
98398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mArraySizes = as;
98498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
98598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElements[mCount] = element;
98698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElementNames[mCount] = name;
98798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mArraySizes[mCount] = arraySize;
98898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mCount++;
989ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
99098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
99198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
99298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
99398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
99498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Add a single element to this Element.
99598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
99698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param element
99798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param name
99898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
99998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder add(Element element, String name) {
100098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return add(element, name, 1);
100198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
100298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
100398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
100498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Create the element from this builder.
100598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
100698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
100798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @return Element
100898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
100998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Element create() {
1010ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            if (mT != null) {
1011ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray                return mT.create(mRS);
1012ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            }
1013ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
101498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS.validate();
101598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            Element[] ein = new Element[mCount];
101698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            String[] sin = new String[mCount];
101798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int[] asin = new int[mCount];
101898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
101998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
102098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
102198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
102298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int[] ids = new int[ein.length];
102398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            for (int ct = 0; ct < ein.length; ct++ ) {
102498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ids[ct] = ein[ct].getID(mRS);
102598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
1026ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
102798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int id = mRS.nElementCreate2(ids, sin, asin);
102898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return new Element(id, mRS, ein, sin, asin);
102998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
103098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
103198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
103298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1033