198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Field;
20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>The most basic data type. An element represents one cell of a memory allocation.
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Element is the basic data type of Renderscript. An element can be of two forms: Basic elements or Complex forms.
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Examples of basic elements are:</p>
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <ul>
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *  <li>Single float value</li>
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *  <li>4 element float vector</li>
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *  <li>single RGB-565 color</li>
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *  <li>single unsigned int 16</li>
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </ul>
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>Complex elements contain a list of sub-elements and names that
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * represents a structure of data. The fields can be accessed by name
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * from a script or shader. The memory layout is defined and ordered. Data
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * alignment is determined by the most basic primitive type. i.e. a float4
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * vector will be aligned to sizeof(float) and not sizeof(float4). The
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * ordering of elements in memory will be the order in which they were added
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * with each component aligned as necessary. No re-ordering will be done.</p>
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>The primary source of elements are from scripts. A script that exports a
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * bind point for a data structure generates a Renderscript element to represent the
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * data exported by the script. The other common source of elements is from bitmap formats.</p>
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <div class="special reference">
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <h3>Developer Guides</h3>
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>For more information about creating an application that uses Renderscript, read the
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p>
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </div>
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Element extends BaseObj {
52ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    static class NElement {
53ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        android.renderscript.Element mE;
54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
55ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        NElement(android.renderscript.Element e) {
56ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mE = e;
57ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
58ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/*
59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        int getID() {
60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            return mE.getID();
61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        */
63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
64ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    NElement mNE;
65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mSize;
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element[] mElements;
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    String[] mElementNames;
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int[] mArraySizes;
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int[] mOffsetInBytes;
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int[] mVisibleElementMap;
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    DataType mType;
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    DataKind mKind;
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mNormalized;
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int mVectorSize;
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private void updateVisibleSubElements() {
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mElements == null) {
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return;
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int noPaddingFieldCount = 0;
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int fieldCount = mElementNames.length;
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Find out how many elements are not padding
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct = 0; ct < fieldCount; ct ++) {
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mElementNames[ct].charAt(0) != '#') {
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                noPaddingFieldCount ++;
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mVisibleElementMap = new int[noPaddingFieldCount];
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Make a map that points us at non-padding elements
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        for (int ct = 0, ctNoPadding = 0; ct < fieldCount; ct ++) {
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mElementNames[ct].charAt(0) != '#') {
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mVisibleElementMap[ctNoPadding ++] = ct;
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return element size in bytes
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getBytesSize() {return mSize;}
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * Returns the number of vector components. 2 for float2, 4 for
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * float4, etc.
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    * @return element vector size
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    */
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int getVectorSize() {return mVectorSize;}
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * DataType represents the basic type information for a basic element.  The
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * naming convention follows.  For numeric types it is FLOAT,
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * size of the data.  BOOLEAN is a true / false (1,0)
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * represented in an 8 bit container.  The UNSIGNED variants
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * with multiple bit definitions are for packed graphical data
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * formats and represent vectors with per vector member sizes
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * which are treated as a single unit for packing and alignment
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * purposes.
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * MATRIX the three matrix types contain FLOAT_32 elements and are treated
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * as 32 bits for alignment purposes.
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * RS_* objects.  32 bit opaque handles.
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum DataType {
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NONE (0, 0),
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        //FLOAT_16 (1, 2),
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        FLOAT_32 (2, 4),
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        FLOAT_64 (3, 8),
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_8 (4, 1),
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_16 (5, 2),
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_32 (6, 4),
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        SIGNED_64 (7, 8),
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_8 (8, 1),
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_16 (9, 2),
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_32 (10, 4),
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_64 (11, 8),
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        BOOLEAN(12, 1),
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_5_6_5 (13, 2),
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_5_5_5_1 (14, 2),
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        UNSIGNED_4_4_4_4 (15, 2),
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MATRIX_4X4 (16, 64),
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MATRIX_3X3 (17, 36),
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MATRIX_2X2 (18, 16),
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_ELEMENT (1000, 4),
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_TYPE (1001, 4),
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_ALLOCATION (1002, 4),
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_SAMPLER (1003, 4),
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RS_SCRIPT (1004, 4);
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mSize;
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        DataType(int id, int size) {
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mSize = size;
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * The special interpretation of the data if required.  This is primarly
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * useful for graphical data.  USER indicates no special interpretation is
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * expected.  PIXEL is used in conjunction with the standard data types for
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * representing texture formats.
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum DataKind {
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        USER (0),
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_L (7),
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_A (8),
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_LA (9),
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_RGB (10),
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        PIXEL_RGBA (11);
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    /**
75198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a custom Element of the specified DataType.  The DataKind will be
75298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * set to USER and the vector size to 1 indicating non-vector.
75398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
75498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs The context associated with the new Element.
75598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dt The DataType for the new element.
75698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
75798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
75898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static Element createUser(RenderScript rs, DataType dt) {
75998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        DataKind dk = DataKind.USER;
76098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean norm = false;
76198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int vecSize = 1;
76298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
76398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Element(id, rs, dt, dk, norm, vecSize);
76498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
76598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
76698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
76798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a custom vector element of the specified DataType and vector size.
76898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * DataKind will be set to USER. Only primitive types (FLOAT_32, FLOAT_64,
76998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, UNSIGNED_8, UNSIGNED_16,
77098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * UNSIGNED_32, UNSIGNED_64, BOOLEAN) are supported.
77198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
77298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs The context associated with the new Element.
77398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dt The DataType for the new Element.
77498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param size Vector size for the new Element.  Range 2-4 inclusive
77598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *             supported.
77698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
77798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
77898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
77998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element createVector(RenderScript rs, DataType dt, int size) {
78098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (size < 2 || size > 4) {
78198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Vector size out of range 2-4.");
78298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
78398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
78498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        switch (dt) {
78598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Support only primitive integer/float/boolean types as vectors.
78698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case FLOAT_32:
78798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case FLOAT_64:
78898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_8:
78998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_16:
79098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_32:
79198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case SIGNED_64:
79298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_8:
79398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_16:
79498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_32:
79598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case UNSIGNED_64:
79698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case BOOLEAN: {
79798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            DataKind dk = DataKind.USER;
79898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            boolean norm = false;
79998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
80098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return new Element(id, rs, dt, dk, norm, size);
80198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
80298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
80398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        default: {
80498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Cannot create vector of " +
80598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                "non-primitive type.");
80698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
80798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
80898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
80998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
81198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a new pixel Element type.  A matching DataType and DataKind must
81298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be provided.  The DataType and DataKind must contain the same number of
81398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * components.  Vector size will be set to 1.
81498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
81598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs The context associated with the new Element.
81698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dt The DataType for the new element.
81798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dk The DataKind to specify the mapping of each component in the
81898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *           DataType.
81998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
82098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return Element
82198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
82298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
82398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!(dk == DataKind.PIXEL_L ||
82498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_A ||
82598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_LA ||
82698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_RGB ||
82798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dk == DataKind.PIXEL_RGBA)) {
82898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Unsupported DataKind");
82998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
83098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!(dt == DataType.UNSIGNED_8 ||
83198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_16 ||
83298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_5_6_5 ||
83398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_4_4_4_4 ||
83498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams              dt == DataType.UNSIGNED_5_5_5_1)) {
83598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Unsupported DataType");
83698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
83798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
83898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
83998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
84098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
84198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
84298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
84398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
84498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
84598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
84698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
84798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int size = 1;
84898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        switch (dk) {
84998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case PIXEL_LA:
85098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            size = 2;
85198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
85298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case PIXEL_RGB:
85398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            size = 3;
85498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
85598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        case PIXEL_RGBA:
85698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            size = 4;
85798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            break;
85898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
85998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
86098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean norm = true;
86198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
86298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return new Element(id, rs, dt, dk, norm, size);
86398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
86498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
86598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
86698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Check if the current Element is compatible with another Element.
86798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Primitive Elements are compatible if they share the same underlying
86898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * size and type (i.e. U8 is compatible with A_8). User-defined Elements
86998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * must be equal in order to be compatible. This requires strict name
87098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * equivalence for all sub-Elements (in addition to structural equivalence).
87198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
87298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param e The Element to check compatibility with.
87398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
87498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean true if the Elements are compatible, otherwise false.
87598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
87698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean isCompatible(Element e) {
87798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Try strict BaseObj equality to start with.
87898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (this.equals(e)) {
87998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return true;
88098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
88198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
88298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Ignore mKind because it is allowed to be different (user vs. pixel).
88398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // We also ignore mNormalized because it can be different. The mType
88498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // field must not be NONE since we require name equivalence for
88598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // all user-created Elements.
88698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return ((mSize == e.mSize) &&
88798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType != DataType.NONE) &&
88898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mType == e.mType) &&
88998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                (mVectorSize == e.mVectorSize));
89098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
89198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
892ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    static class NBuilder {
893ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        android.renderscript.Element.Builder mB;
894ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
895ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        NBuilder(RenderScript rs) {
896ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mB = new android.renderscript.Element.Builder(rs.mNRS.getRS());
897ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
898ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
899ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        void add(Element element, String name, int arraySize) {
900ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mB.add(element.mNE.mE, name, arraySize);
901ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
902ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
903ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        NElement create() {
904ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            return new NElement(mB.create());
905ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
906ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
907ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
90898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
90998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Builder class for producing complex elements with matching field and name
91098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * pairs.  The builder starts empty.  The order in which elements are added
91198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * is retained for the layout in memory.
91298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
91398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
91498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class Builder {
915ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        NBuilder mNB;
916ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
91798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript mRS;
91898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Element[] mElements;
91998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        String[] mElementNames;
92098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int[] mArraySizes;
92198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mCount;
92298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mSkipPadding;
92398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
92498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
92598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Create a builder object.
92698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
92798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param rs
92898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
92998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder(RenderScript rs) {
93098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = rs;
93198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mCount = 0;
93298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElements = new Element[8];
93398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElementNames = new String[8];
93498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mArraySizes = new int[8];
93598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
93698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
93798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
93898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Add an array of elements to this element.
93998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
94098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param element
94198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param name
94298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param arraySize
94398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
94498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder add(Element element, String name, int arraySize) {
94598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (arraySize < 1) {
94698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                throw new RSIllegalArgumentException("Array size cannot be less than 1.");
94798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
94898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
94998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            // Skip padding fields after a vector 3 type.
95098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (mSkipPadding != 0) {
95198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (name.startsWith("#padding_")) {
95298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    mSkipPadding = 0;
95398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    return this;
95498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
95598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
95698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
95798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if (element.mVectorSize == 3) {
95898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mSkipPadding = 1;
95998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            } else {
96098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mSkipPadding = 0;
96198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
96298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
96398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(mCount == mElements.length) {
96498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                Element[] e = new Element[mCount + 8];
96598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                String[] s = new String[mCount + 8];
96698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                int[] as = new int[mCount + 8];
96798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                System.arraycopy(mElements, 0, e, 0, mCount);
96898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                System.arraycopy(mElementNames, 0, s, 0, mCount);
96998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                System.arraycopy(mArraySizes, 0, as, 0, mCount);
97098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mElements = e;
97198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mElementNames = s;
97298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mArraySizes = as;
97398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
97498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElements[mCount] = element;
97598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mElementNames[mCount] = name;
97698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mArraySizes[mCount] = arraySize;
97798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mCount++;
978ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
979ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            if (mRS.mUseNativeRS) {
980ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                mNB.add(element, name, arraySize);
981ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            }
98298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return this;
98398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
98498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
98598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
98698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Add a single element to this Element.
98798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
98898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param element
98998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @param name
99098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
99198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Builder add(Element element, String name) {
99298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return add(element, name, 1);
99398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
99498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
99598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        /**
99698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * Create the element from this builder.
99798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
99898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         *
99998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         * @return Element
100098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams         */
100198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Element create() {
100298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS.validate();
100398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            Element[] ein = new Element[mCount];
100498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            String[] sin = new String[mCount];
100598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int[] asin = new int[mCount];
100698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
100798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
100898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
100998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
101098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int[] ids = new int[ein.length];
101198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            for (int ct = 0; ct < ein.length; ct++ ) {
101298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                ids[ct] = ein[ct].getID(mRS);
101398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
1014ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
1015ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            if (mRS.mUseNativeRS) {
1016ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                NElement ne = mNB.create();
1017ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                Element e = new Element(-1, mRS, ein, sin, asin);
1018ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                e.mNE = ne;
1019ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                return e;
1020ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            }
1021ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
102298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int id = mRS.nElementCreate2(ids, sin, asin);
102398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return new Element(id, mRS, ein, sin, asin);
102498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
102598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
102698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
102798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1028