136e612a488511940b61f09803b270aa1c61b68e0Jason Sams/*
2dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams * Copyright (C) 2013 The Android Open Source Project
336e612a488511940b61f09803b270aa1c61b68e0Jason Sams *
436e612a488511940b61f09803b270aa1c61b68e0Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
536e612a488511940b61f09803b270aa1c61b68e0Jason Sams * you may not use this file except in compliance with the License.
636e612a488511940b61f09803b270aa1c61b68e0Jason Sams * You may obtain a copy of the License at
736e612a488511940b61f09803b270aa1c61b68e0Jason Sams *
836e612a488511940b61f09803b270aa1c61b68e0Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
936e612a488511940b61f09803b270aa1c61b68e0Jason Sams *
1036e612a488511940b61f09803b270aa1c61b68e0Jason Sams * Unless required by applicable law or agreed to in writing, software
1136e612a488511940b61f09803b270aa1c61b68e0Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1236e612a488511940b61f09803b270aa1c61b68e0Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1336e612a488511940b61f09803b270aa1c61b68e0Jason Sams * See the License for the specific language governing permissions and
1436e612a488511940b61f09803b270aa1c61b68e0Jason Sams * limitations under the License.
1536e612a488511940b61f09803b270aa1c61b68e0Jason Sams */
1636e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1736e612a488511940b61f09803b270aa1c61b68e0Jason Samspackage android.renderscript;
1836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1943ee06857bb7f99446d1d84f8789016c5d105558Jason Samsimport java.lang.reflect.Field;
20dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukimport android.util.Log;
2136e612a488511940b61f09803b270aa1c61b68e0Jason Sams
229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
23c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>An Element represents one item within an {@link
24c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation}.  An Element is roughly equivalent to a C
25c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * type in a RenderScript kernel. Elements may be basic or complex. Some basic
26c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * elements are</p> <ul> <li>A single float value (equivalent to a float in a
27c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel)</li> <li>A four-element float vector (equivalent to a float4 in a
28c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel)</li> <li>An unsigned 32-bit integer (equivalent to an unsigned int in
29c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * a kernel)</li> <li>A single signed 8-bit integer (equivalent to a char in a
30c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel)</li> </ul> <p>A complex element is roughly equivalent to a C struct
31c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * and contains a number of basic or complex Elements. From Java code, a complex
32c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * element contains a list of sub-elements and names that represents a
33c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * particular data structure. Structs used in RS scripts are available to Java
34c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * code by using the {@code ScriptField_structname} class that is reflected from
35c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * a particular script.</p>
36a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
37c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>Basic Elements are comprised of a {@link
38c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Element.DataType} and a {@link
39c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Element.DataKind}. The DataType encodes C type
40c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * information of an Element, while the DataKind encodes how that Element should
41c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * be interpreted by a {@link android.renderscript.Sampler}. Note that {@link
42c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation} objects with DataKind {@link
43c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Element.DataKind#USER} cannot be used as input for a
44c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * {@link android.renderscript.Sampler}. In general, {@link
45c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation} objects that are intended for use with a
46c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * {@link android.renderscript.Sampler} should use bitmap-derived Elements such
47c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * as {@link android.renderscript.Element#RGBA_8888} or {@link
48c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript#Element.A_8}.</p>
493aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
503aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
513aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
52c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <p>For more information about creating an application that uses RenderScript, read the
53c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
543aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
5536e612a488511940b61f09803b270aa1c61b68e0Jason Sams **/
5636e612a488511940b61f09803b270aa1c61b68e0Jason Samspublic class Element extends BaseObj {
57ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    int mSize;
58718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    Element[] mElements;
59718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    String[] mElementNames;
6070d4e5024298f71edb3b04867e05568f5495b4ceJason Sams    int[] mArraySizes;
617d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    int[] mOffsetInBytes;
62ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
633aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk    int[] mVisibleElementMap;
643aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
65718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    DataType mType;
66718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    DataKind mKind;
67718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    boolean mNormalized;
68718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int mVectorSize;
69718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
703aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk    private void updateVisibleSubElements() {
713aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mElements == null) {
723aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            return;
733aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        }
743aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
753aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        int noPaddingFieldCount = 0;
763aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        int fieldCount = mElementNames.length;
773aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        // Find out how many elements are not padding
783aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        for (int ct = 0; ct < fieldCount; ct ++) {
793aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            if (mElementNames[ct].charAt(0) != '#') {
803aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk                noPaddingFieldCount ++;
813aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            }
823aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        }
833aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        mVisibleElementMap = new int[noPaddingFieldCount];
843aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
853aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        // Make a map that points us at non-padding elements
863aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        for (int ct = 0, ctNoPadding = 0; ct < fieldCount; ct ++) {
873aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            if (mElementNames[ct].charAt(0) != '#') {
883aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk                mVisibleElementMap[ctNoPadding ++] = ct;
893aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk            }
903aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        }
913aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk    }
923aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk
939c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
947d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return element size in bytes
957d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
96918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    public int getBytesSize() {return mSize;}
97718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
989c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
99918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * Returns the number of vector components. 2 for float2, 4 for
100918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * float4, etc.
101fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk    * @return element vector size
102fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk    */
103fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk    public int getVectorSize() {return mVectorSize;}
104fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk
105a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
1069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
107a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * DataType represents the basic type information for a basic element.  The
108f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * naming convention follows.  For numeric types it is FLOAT,
109f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
110f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * size of the data.  BOOLEAN is a true / false (1,0)
111f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * represented in an 8 bit container.  The UNSIGNED variants
112f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * with multiple bit definitions are for packed graphical data
113f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * formats and represent vectors with per vector member sizes
114f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * which are treated as a single unit for packing and alignment
115f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk     * purposes.
116a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
117a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * MATRIX the three matrix types contain FLOAT_32 elements and are treated
118a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * as 32 bits for alignment purposes.
119a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
120a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * RS_* objects.  32 bit opaque handles.
121a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
122718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public enum DataType {
1233aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        NONE (0, 0),
124718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        //FLOAT_16 (1, 2),
125718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        FLOAT_32 (2, 4),
12602f41705199336f808ece50d81585450e7f8f61fStephen Hines        FLOAT_64 (3, 8),
127718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_8 (4, 1),
128718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_16 (5, 2),
129718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_32 (6, 4),
130ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        SIGNED_64 (7, 8),
131718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_8 (8, 1),
132718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_16 (9, 2),
133718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_32 (10, 4),
13452d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        UNSIGNED_64 (11, 8),
135718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
136f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        BOOLEAN(12, 1),
137f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
138f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_5_6_5 (13, 2),
139f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_5_5_5_1 (14, 2),
140f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_4_4_4_4 (15, 2),
141f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
1421d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_4X4 (16, 64),
1431d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_3X3 (17, 36),
1441d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_2X2 (18, 16),
1451d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
1461d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_ELEMENT (1000, 4),
1471d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_TYPE (1001, 4),
1481d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_ALLOCATION (1002, 4),
1491d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_SAMPLER (1003, 4),
1501d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_SCRIPT (1004, 4),
1511d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_MESH (1005, 4),
1521d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_FRAGMENT (1006, 4),
1531d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_VERTEX (1007, 4),
1541d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_RASTER (1008, 4),
1553a2914132146f340511425d7f78540098606b512Stephen Hines        RS_PROGRAM_STORE (1009, 4),
1563a2914132146f340511425d7f78540098606b512Stephen Hines        RS_FONT (1010, 4);
157718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
158718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mID;
159718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mSize;
160718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        DataType(int id, int size) {
161718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mID = id;
162718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mSize = size;
163718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
164768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
165768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
1669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
167a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * The special interpretation of the data if required.  This is primarly
168a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * useful for graphical data.  USER indicates no special interpretation is
169a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * expected.  PIXEL is used in conjunction with the standard data types for
170a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * representing texture formats.
171a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
172718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public enum DataKind {
173718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        USER (0),
174718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
175718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_L (7),
176718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_A (8),
177718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_LA (9),
178718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_RGB (10),
1798e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        PIXEL_RGBA (11),
1808140d7b0f62a6e5b54e318c959f2d501f7ee6784Jason Sams        PIXEL_DEPTH (12),
1818140d7b0f62a6e5b54e318c959f2d501f7ee6784Jason Sams        PIXEL_YUV(13);
182718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
183718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mID;
184718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        DataKind(int id) {
185718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mID = id;
186ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams        }
18736e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
18836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
190a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if a element is too complex for use as a data source for a Mesh or
191a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * a Program.
192a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
193a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
194a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
195c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams    public boolean isComplex() {
196c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        if (mElements == null) {
197c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            return false;
198c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        }
199c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        for (int ct=0; ct < mElements.length; ct++) {
200c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            if (mElements[ct].mElements != null) {
201c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams                return true;
202c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            }
203c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        }
204c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        return false;
205c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams    }
206c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams
2079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
208918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * Elements could be simple, such as an int or a float, or a
209918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * structure with multiple sub elements, such as a collection of
210918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * floats, float2, float4. This function returns zero for simple
211918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * elements or the number of sub-elements otherwise.
2127d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return number of sub-elements in this element
2137d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2147d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public int getSubElementCount() {
2153aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2167d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            return 0;
2177d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2183aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mVisibleElementMap.length;
2197d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2207d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
222918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * For complex elements, this function will return the
223918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sub-element at index
2247d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element to return
2257d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return sub-element in this element at given index
2267d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2277d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Element getSubElement(int index) {
2283aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2297d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2307d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2313aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2327d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2337d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2343aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mElements[mVisibleElementMap[index]];
2357d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2367d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2379c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
238918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * For complex elements, this function will return the
239918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sub-element name at index
2407d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element
2417d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return sub-element in this element at given index
2427d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2437d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public String getSubElementName(int index) {
2443aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2457d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2467d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2473aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2487d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2497d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2503aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mElementNames[mVisibleElementMap[index]];
2517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2527d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2539c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
254918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * For complex elements, some sub-elements could be statically
255918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sized arrays. This function will return the array size for
256918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * sub-element at index
2577d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element
2587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return array size of sub-element in this element at given index
2597d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2607d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public int getSubElementArraySize(int index) {
2613aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2643aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2667d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2673aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mArraySizes[mVisibleElementMap[index]];
2687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2709c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
271918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * This function specifies the location of a sub-element within
272918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk    * the element
2737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @param index index of the sub-element
2747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    * @return offset in bytes of sub-element in this element at given index
2757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    */
2767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public int getSubElementOffsetBytes(int index) {
2773aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (mVisibleElementMap == null) {
2787d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Element contains no sub-elements");
2797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2803aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        if (index < 0 || index >= mVisibleElementMap.length) {
2817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            throw new RSIllegalArgumentException("Illegal sub-element index");
2827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        }
2833aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        return mOffsetInBytes[mVisibleElementMap[index]];
2847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
2857d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
2869c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
287f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    * @return element data type
288f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    */
289f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    public DataType getDataType() {
290f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk        return mType;
291f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    }
292f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk
2939c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
294f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    * @return element data kind
295f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    */
296f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    public DataKind getDataKind() {
297f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk        return mKind;
298f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk    }
299f5d8ac7cc35747ef7285ccc196f616b96229def9Alex Sakhartchouk
3009c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
301a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single Boolean.
302a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
303a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
304a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
305a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
306a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
307f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    public static Element BOOLEAN(RenderScript rs) {
308f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        if(rs.mElement_BOOLEAN == null) {
309f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams            rs.mElement_BOOLEAN = createUser(rs, DataType.BOOLEAN);
310f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        }
311f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        return rs.mElement_BOOLEAN;
312f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    }
313f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
3149c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
315a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single UNSIGNED_8.
316a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
317a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
318a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
319a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
320a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
3218cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U8(RenderScript rs) {
3228cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_U8 == null) {
3238cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_U8 = createUser(rs, DataType.UNSIGNED_8);
3243c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3258cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_U8;
3263c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
327ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
3289c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
329a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single SIGNED_8.
330a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
331a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
332a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
333a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
334a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
3358cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element I8(RenderScript rs) {
3368cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_I8 == null) {
3378cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_I8 = createUser(rs, DataType.SIGNED_8);
3383c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3398cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_I8;
3403c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3413c0dfbab807a459622aeade4940daddf482dec66Jason Sams
342e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    public static Element U16(RenderScript rs) {
343e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        if(rs.mElement_U16 == null) {
344e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams            rs.mElement_U16 = createUser(rs, DataType.UNSIGNED_16);
345e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        }
346e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        return rs.mElement_U16;
347e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    }
348e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams
349e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    public static Element I16(RenderScript rs) {
350e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        if(rs.mElement_I16 == null) {
351e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams            rs.mElement_I16 = createUser(rs, DataType.SIGNED_16);
352e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        }
353e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        return rs.mElement_I16;
354e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    }
355e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams
3568cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U32(RenderScript rs) {
3578cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_U32 == null) {
3588cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_U32 = createUser(rs, DataType.UNSIGNED_32);
3593c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3608cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_U32;
3613c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3623c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3638cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element I32(RenderScript rs) {
3648cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_I32 == null) {
3658cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_I32 = createUser(rs, DataType.SIGNED_32);
3663c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3678cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_I32;
3683c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3693c0dfbab807a459622aeade4940daddf482dec66Jason Sams
37052d836332f6aae74ed97fda1b53681f36710af64Stephen Hines    public static Element U64(RenderScript rs) {
37152d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        if(rs.mElement_U64 == null) {
37252d836332f6aae74ed97fda1b53681f36710af64Stephen Hines            rs.mElement_U64 = createUser(rs, DataType.UNSIGNED_64);
37352d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        }
37452d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        return rs.mElement_U64;
37552d836332f6aae74ed97fda1b53681f36710af64Stephen Hines    }
37652d836332f6aae74ed97fda1b53681f36710af64Stephen Hines
377ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines    public static Element I64(RenderScript rs) {
378ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        if(rs.mElement_I64 == null) {
379ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines            rs.mElement_I64 = createUser(rs, DataType.SIGNED_64);
380ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        }
381ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        return rs.mElement_I64;
382ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines    }
383ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines
3848cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32(RenderScript rs) {
3858cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_F32 == null) {
3868cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_F32 = createUser(rs, DataType.FLOAT_32);
3873c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3888cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_F32;
3893c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3903c0dfbab807a459622aeade4940daddf482dec66Jason Sams
39102f41705199336f808ece50d81585450e7f8f61fStephen Hines    public static Element F64(RenderScript rs) {
39202f41705199336f808ece50d81585450e7f8f61fStephen Hines        if(rs.mElement_F64 == null) {
39302f41705199336f808ece50d81585450e7f8f61fStephen Hines            rs.mElement_F64 = createUser(rs, DataType.FLOAT_64);
39402f41705199336f808ece50d81585450e7f8f61fStephen Hines        }
39502f41705199336f808ece50d81585450e7f8f61fStephen Hines        return rs.mElement_F64;
39602f41705199336f808ece50d81585450e7f8f61fStephen Hines    }
39702f41705199336f808ece50d81585450e7f8f61fStephen Hines
3988cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element ELEMENT(RenderScript rs) {
3998cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_ELEMENT == null) {
4008cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_ELEMENT = createUser(rs, DataType.RS_ELEMENT);
401a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4028cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_ELEMENT;
403a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
404a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4058cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element TYPE(RenderScript rs) {
4068cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_TYPE == null) {
4078cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_TYPE = createUser(rs, DataType.RS_TYPE);
408a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4098cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_TYPE;
410a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
411a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4128cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element ALLOCATION(RenderScript rs) {
4138cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_ALLOCATION == null) {
4148cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_ALLOCATION = createUser(rs, DataType.RS_ALLOCATION);
415a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4168cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_ALLOCATION;
417a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
418a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4198cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element SAMPLER(RenderScript rs) {
4208cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_SAMPLER == null) {
4218cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_SAMPLER = createUser(rs, DataType.RS_SAMPLER);
422a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4238cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_SAMPLER;
424a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
425a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4268cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element SCRIPT(RenderScript rs) {
4278cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_SCRIPT == null) {
4288cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_SCRIPT = createUser(rs, DataType.RS_SCRIPT);
429a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4308cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_SCRIPT;
431a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
432a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4338cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element MESH(RenderScript rs) {
4348cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_MESH == null) {
4358cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_MESH = createUser(rs, DataType.RS_MESH);
436a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4378cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_MESH;
438a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
439a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4408cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_FRAGMENT(RenderScript rs) {
4418cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_FRAGMENT == null) {
4428cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_FRAGMENT = createUser(rs, DataType.RS_PROGRAM_FRAGMENT);
443a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4448cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_FRAGMENT;
445a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
446a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4478cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_VERTEX(RenderScript rs) {
4488cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_VERTEX == null) {
4498cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_VERTEX = createUser(rs, DataType.RS_PROGRAM_VERTEX);
450a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4518cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_VERTEX;
452a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
453a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4548cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_RASTER(RenderScript rs) {
4558cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_RASTER == null) {
4568cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_RASTER = createUser(rs, DataType.RS_PROGRAM_RASTER);
457a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4588cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_RASTER;
459a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
460a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4618cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_STORE(RenderScript rs) {
4628cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_STORE == null) {
4638cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_STORE = createUser(rs, DataType.RS_PROGRAM_STORE);
464a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
4658cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_STORE;
466a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
467a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
4683a2914132146f340511425d7f78540098606b512Stephen Hines    public static Element FONT(RenderScript rs) {
4693a2914132146f340511425d7f78540098606b512Stephen Hines        if(rs.mElement_FONT == null) {
4703a2914132146f340511425d7f78540098606b512Stephen Hines            rs.mElement_FONT = createUser(rs, DataType.RS_FONT);
4713a2914132146f340511425d7f78540098606b512Stephen Hines        }
4723a2914132146f340511425d7f78540098606b512Stephen Hines        return rs.mElement_FONT;
4733a2914132146f340511425d7f78540098606b512Stephen Hines    }
4743a2914132146f340511425d7f78540098606b512Stephen Hines
4759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines
4763c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element A_8(RenderScript rs) {
4773c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_A_8 == null) {
478718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
4793c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
4803c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_A_8;
4813c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
4823c0dfbab807a459622aeade4940daddf482dec66Jason Sams
4833c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGB_565(RenderScript rs) {
4843c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGB_565 == null) {
485718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
4863c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
4873c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGB_565;
4883c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
4893c0dfbab807a459622aeade4940daddf482dec66Jason Sams
4903c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGB_888(RenderScript rs) {
4913c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGB_888 == null) {
492718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
4933c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
4943c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGB_888;
4953c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
4963c0dfbab807a459622aeade4940daddf482dec66Jason Sams
4973c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_5551(RenderScript rs) {
4983c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGBA_5551 == null) {
499718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
5003c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5013c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_5551;
5023c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
5033c0dfbab807a459622aeade4940daddf482dec66Jason Sams
5043c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_4444(RenderScript rs) {
5053c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGBA_4444 == null) {
506718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
5073c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5083c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_4444;
5093c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
5103c0dfbab807a459622aeade4940daddf482dec66Jason Sams
5113c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_8888(RenderScript rs) {
5123c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGBA_8888 == null) {
513718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
5143c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5153c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_8888;
5163c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
5173c0dfbab807a459622aeade4940daddf482dec66Jason Sams
5188cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_2(RenderScript rs) {
5198cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_FLOAT_2 == null) {
5208cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_FLOAT_2 = createVector(rs, DataType.FLOAT_32, 2);
5213c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5228cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_2;
5233c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
5243c0dfbab807a459622aeade4940daddf482dec66Jason Sams
5258cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_3(RenderScript rs) {
5268cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_FLOAT_3 == null) {
5278cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_FLOAT_3 = createVector(rs, DataType.FLOAT_32, 3);
5283c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
5298cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_3;
53036e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
53136e612a488511940b61f09803b270aa1c61b68e0Jason Sams
5328cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_4(RenderScript rs) {
5338cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_FLOAT_4 == null) {
5348cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_FLOAT_4 = createVector(rs, DataType.FLOAT_32, 4);
535718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
5368cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_4;
5373c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
53836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
539836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element F64_2(RenderScript rs) {
540836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_DOUBLE_2 == null) {
541836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_DOUBLE_2 = createVector(rs, DataType.FLOAT_64, 2);
542836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
543836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_DOUBLE_2;
544836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
545836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
546836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element F64_3(RenderScript rs) {
547836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_DOUBLE_3 == null) {
548836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_DOUBLE_3 = createVector(rs, DataType.FLOAT_64, 3);
549836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
550836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_DOUBLE_3;
551836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
552836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
553836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element F64_4(RenderScript rs) {
554836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_DOUBLE_4 == null) {
555836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_DOUBLE_4 = createVector(rs, DataType.FLOAT_64, 4);
556836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
557836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_DOUBLE_4;
558836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
559836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
560836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U8_2(RenderScript rs) {
561836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_UCHAR_2 == null) {
562836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_UCHAR_2 = createVector(rs, DataType.UNSIGNED_8, 2);
563836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
564836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UCHAR_2;
565836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
566836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
567836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U8_3(RenderScript rs) {
568836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_UCHAR_3 == null) {
569836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_UCHAR_3 = createVector(rs, DataType.UNSIGNED_8, 3);
570836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
571836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UCHAR_3;
572836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
573836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
5748cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U8_4(RenderScript rs) {
5758cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_UCHAR_4 == null) {
5768cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_UCHAR_4 = createVector(rs, DataType.UNSIGNED_8, 4);
57736e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
5788cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_UCHAR_4;
57936e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
58036e612a488511940b61f09803b270aa1c61b68e0Jason Sams
581836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I8_2(RenderScript rs) {
582836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_CHAR_2 == null) {
583836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_CHAR_2 = createVector(rs, DataType.SIGNED_8, 2);
584836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
585836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_CHAR_2;
586836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
587836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
588836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I8_3(RenderScript rs) {
589836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_CHAR_3 == null) {
590836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_CHAR_3 = createVector(rs, DataType.SIGNED_8, 3);
591836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
592836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_CHAR_3;
593836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
594836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
595836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I8_4(RenderScript rs) {
596836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_CHAR_4 == null) {
597836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_CHAR_4 = createVector(rs, DataType.SIGNED_8, 4);
598836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
599836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_CHAR_4;
600836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
601836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
602836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U16_2(RenderScript rs) {
603836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_USHORT_2 == null) {
604836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_USHORT_2 = createVector(rs, DataType.UNSIGNED_16, 2);
605836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
606836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_USHORT_2;
607836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
608836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
609836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U16_3(RenderScript rs) {
610836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_USHORT_3 == null) {
611836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_USHORT_3 = createVector(rs, DataType.UNSIGNED_16, 3);
612836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
613836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_USHORT_3;
614836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
615836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
616836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U16_4(RenderScript rs) {
617836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_USHORT_4 == null) {
618836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_USHORT_4 = createVector(rs, DataType.UNSIGNED_16, 4);
619836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
620836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_USHORT_4;
621836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
622836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
623836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I16_2(RenderScript rs) {
624836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_SHORT_2 == null) {
625836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_SHORT_2 = createVector(rs, DataType.SIGNED_16, 2);
626836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
627836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_SHORT_2;
628836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
629836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
630836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I16_3(RenderScript rs) {
631836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_SHORT_3 == null) {
632836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_SHORT_3 = createVector(rs, DataType.SIGNED_16, 3);
633836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
634836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_SHORT_3;
635836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
636836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
637836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I16_4(RenderScript rs) {
638836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_SHORT_4 == null) {
639836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_SHORT_4 = createVector(rs, DataType.SIGNED_16, 4);
640836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
641836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_SHORT_4;
642836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
643836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
644836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U32_2(RenderScript rs) {
645836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_UINT_2 == null) {
646836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_UINT_2 = createVector(rs, DataType.UNSIGNED_32, 2);
647836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
648836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UINT_2;
649836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
650836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
651836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U32_3(RenderScript rs) {
652836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_UINT_3 == null) {
653836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_UINT_3 = createVector(rs, DataType.UNSIGNED_32, 3);
654836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
655836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UINT_3;
656836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
657836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
658836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U32_4(RenderScript rs) {
659836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_UINT_4 == null) {
660836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_UINT_4 = createVector(rs, DataType.UNSIGNED_32, 4);
661836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
662836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_UINT_4;
663836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
664836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
665836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I32_2(RenderScript rs) {
666836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_INT_2 == null) {
667836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_INT_2 = createVector(rs, DataType.SIGNED_32, 2);
668836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
669836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_INT_2;
670836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
671836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
672836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I32_3(RenderScript rs) {
673836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_INT_3 == null) {
674836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_INT_3 = createVector(rs, DataType.SIGNED_32, 3);
675836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
676836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_INT_3;
677836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
678836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
679836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I32_4(RenderScript rs) {
680836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_INT_4 == null) {
681836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_INT_4 = createVector(rs, DataType.SIGNED_32, 4);
682836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
683836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_INT_4;
684836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
685836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
686836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U64_2(RenderScript rs) {
687836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_ULONG_2 == null) {
688836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_ULONG_2 = createVector(rs, DataType.UNSIGNED_64, 2);
689836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
690836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_ULONG_2;
691836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
692836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
693836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U64_3(RenderScript rs) {
694836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_ULONG_3 == null) {
695836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_ULONG_3 = createVector(rs, DataType.UNSIGNED_64, 3);
696836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
697836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_ULONG_3;
698836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
699836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
700836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element U64_4(RenderScript rs) {
701836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_ULONG_4 == null) {
702836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_ULONG_4 = createVector(rs, DataType.UNSIGNED_64, 4);
703836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
704836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_ULONG_4;
705836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
706836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
707836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I64_2(RenderScript rs) {
708836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_LONG_2 == null) {
709836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_LONG_2 = createVector(rs, DataType.SIGNED_64, 2);
710836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
711836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_LONG_2;
712836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
713836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
714836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I64_3(RenderScript rs) {
715836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_LONG_3 == null) {
716836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_LONG_3 = createVector(rs, DataType.SIGNED_64, 3);
717836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
718836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_LONG_3;
719836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
720836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
721836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    public static Element I64_4(RenderScript rs) {
722836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        if(rs.mElement_LONG_4 == null) {
723836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines            rs.mElement_LONG_4 = createVector(rs, DataType.SIGNED_64, 4);
724836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        }
725836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines        return rs.mElement_LONG_4;
726836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines    }
727836c4a58a7f03485ef433dcdb61837cbc0c39735Stephen Hines
728932e78e9903342e3494983fd3463084caab4ba42Tim Murray    public static Element YUV(RenderScript rs) {
729932e78e9903342e3494983fd3463084caab4ba42Tim Murray        if (rs.mElement_YUV == null) {
730932e78e9903342e3494983fd3463084caab4ba42Tim Murray            rs.mElement_YUV = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_YUV);
731932e78e9903342e3494983fd3463084caab4ba42Tim Murray        }
732932e78e9903342e3494983fd3463084caab4ba42Tim Murray        return rs.mElement_YUV;
733932e78e9903342e3494983fd3463084caab4ba42Tim Murray    }
734932e78e9903342e3494983fd3463084caab4ba42Tim Murray
7351d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_4X4(RenderScript rs) {
7361d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        if(rs.mElement_MATRIX_4X4 == null) {
7371d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams            rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
7381d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
7391d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return rs.mElement_MATRIX_4X4;
7401d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
74165c80f824711f084c4ece9204f543a7809534294Jason Sams
74265c80f824711f084c4ece9204f543a7809534294Jason Sams    /** @deprecated use MATRIX_4X4
74365c80f824711f084c4ece9204f543a7809534294Jason Sams    */
7441d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX4X4(RenderScript rs) {
7451d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return MATRIX_4X4(rs);
7461d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
7471d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
7481d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_3X3(RenderScript rs) {
7491d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        if(rs.mElement_MATRIX_3X3 == null) {
7501d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams            rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
7511d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
752347697710d033036c533bd6cee409c4b4c19d437Alex Sakhartchouk        return rs.mElement_MATRIX_3X3;
7531d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
7541d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
7551d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_2X2(RenderScript rs) {
7561d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        if(rs.mElement_MATRIX_2X2 == null) {
7571d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams            rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
7581d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
7591d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return rs.mElement_MATRIX_2X2;
7601d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
76136e612a488511940b61f09803b270aa1c61b68e0Jason Sams
76270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams    Element(int id, RenderScript rs, Element[] e, String[] n, int[] as) {
7630de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
764ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams        mSize = 0;
765fd79e02e0fec8620da7affaadcf275cf0518241aAlex Sakhartchouk        mVectorSize = 1;
766718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mElements = e;
767718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mElementNames = n;
76870d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        mArraySizes = as;
7693aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        mType = DataType.NONE;
7703aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        mKind = DataKind.USER;
7717d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        mOffsetInBytes = new int[mElements.length];
772718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        for (int ct = 0; ct < mElements.length; ct++ ) {
7737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mOffsetInBytes[ct] = mSize;
7749e401bcd88a0fdeea96f53cb776e5de7b5b084cbAlex Sakhartchouk            mSize += mElements[ct].mSize * mArraySizes[ct];
775718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
7763aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        updateVisibleSubElements();
777718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
778718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
7790de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk    Element(int id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
7800de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
781252c07802f7039f15f723751162e64a6621e6998Jason Sams        if ((dt != DataType.UNSIGNED_5_6_5) &&
782252c07802f7039f15f723751162e64a6621e6998Jason Sams            (dt != DataType.UNSIGNED_4_4_4_4) &&
783252c07802f7039f15f723751162e64a6621e6998Jason Sams            (dt != DataType.UNSIGNED_5_5_5_1)) {
784e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if (size == 3) {
785e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSize = dt.mSize * 4;
786e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            } else {
787e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSize = dt.mSize * size;
788e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            }
789252c07802f7039f15f723751162e64a6621e6998Jason Sams        } else {
790252c07802f7039f15f723751162e64a6621e6998Jason Sams            mSize = dt.mSize;
791252c07802f7039f15f723751162e64a6621e6998Jason Sams        }
792718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mType = dt;
793718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mKind = dk;
794718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mNormalized = norm;
795718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mVectorSize = size;
79636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
79736e612a488511940b61f09803b270aa1c61b68e0Jason Sams
7980de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk    Element(int id, RenderScript rs) {
7990de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
800dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
801dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
802dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
803dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
80406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
805dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
806dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
807dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int[] dataBuffer = new int[5];
808e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nElementGetNativeData(getID(mRS), dataBuffer);
8090de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk
8100de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mNormalized = dataBuffer[2] == 1 ? true : false;
8110de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mVectorSize = dataBuffer[3];
8120de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mSize = 0;
813dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        for (DataType dt: DataType.values()) {
814dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(dt.mID == dataBuffer[0]){
815dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mType = dt;
8160de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mSize = mType.mSize * mVectorSize;
817dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
818dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
819dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        for (DataKind dk: DataKind.values()) {
820dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(dk.mID == dataBuffer[1]){
821dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mKind = dk;
822dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
823dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
824dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
825dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int numSubElements = dataBuffer[4];
826dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(numSubElements > 0) {
827dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElements = new Element[numSubElements];
828dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElementNames = new String[numSubElements];
8297d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mArraySizes = new int[numSubElements];
8307d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            mOffsetInBytes = new int[numSubElements];
831dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
832dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            int[] subElementIds = new int[numSubElements];
833e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nElementGetSubElements(getID(mRS), subElementIds, mElementNames, mArraySizes);
834dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            for(int i = 0; i < numSubElements; i ++) {
8350de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mElements[i] = new Element(subElementIds[i], mRS);
836dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mElements[i].updateFromNative();
8377d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                mOffsetInBytes[i] = mSize;
8387d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                mSize += mElements[i].mSize * mArraySizes[i];
839dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
840dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
8413aac0abe7965ce9e2078c7d5796805d83e39df7cAlex Sakhartchouk        updateVisibleSubElements();
842dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
843dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
8449c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
845a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a custom Element of the specified DataType.  The DataKind will be
846a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * set to USER and the vector size to 1 indicating non-vector.
847a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
848a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
849a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
850a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
851a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
852bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    static Element createUser(RenderScript rs, DataType dt) {
8530de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        DataKind dk = DataKind.USER;
8540de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = false;
8550de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int vecSize = 1;
8560de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
8570de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, vecSize);
858ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    }
859ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
8609c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
861a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a custom vector element of the specified DataType and vector size.
8623beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * DataKind will be set to USER. Only primitive types (FLOAT_32, FLOAT_64,
8633beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * SIGNED_8, SIGNED_16, SIGNED_32, SIGNED_64, UNSIGNED_8, UNSIGNED_16,
8643beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * UNSIGNED_32, UNSIGNED_64, BOOLEAN) are supported.
865a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
866a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
8673beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines     * @param dt The DataType for the new Element.
868a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param size Vector size for the new Element.  Range 2-4 inclusive
869a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *             supported.
870a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
871a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
872a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
873718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static Element createVector(RenderScript rs, DataType dt, int size) {
874718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (size < 2 || size > 4) {
875bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            throw new RSIllegalArgumentException("Vector size out of range 2-4.");
87636e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
8773beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines
8783beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        switch (dt) {
8793beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        // Support only primitive integer/float/boolean types as vectors.
8803beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case FLOAT_32:
8813beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case FLOAT_64:
8823beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_8:
8833beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_16:
8843beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_32:
8853beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case SIGNED_64:
8863beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_8:
8873beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_16:
8883beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_32:
8893beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case UNSIGNED_64:
8903beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        case BOOLEAN: {
8913beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            DataKind dk = DataKind.USER;
8923beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            boolean norm = false;
8933beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
8943beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            return new Element(id, rs, dt, dk, norm, size);
8953beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        }
8963beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines
8973beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        default: {
8983beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines            throw new RSIllegalArgumentException("Cannot create vector of " +
8993beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines                "non-primitive type.");
9003beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        }
9013beb60e67a23b8a7381a7ae16338f793a9ee256aStephen Hines        }
902718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
90336e612a488511940b61f09803b270aa1c61b68e0Jason Sams
9049c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
905a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a new pixel Element type.  A matching DataType and DataKind must
906a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * be provided.  The DataType and DataKind must contain the same number of
907a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * components.  Vector size will be set to 1.
908a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
909a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
910a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
911a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dk The DataKind to specify the mapping of each component in the
912a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *           DataType.
913a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
914a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
915a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
916718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
917718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (!(dk == DataKind.PIXEL_L ||
918718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_A ||
919718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_LA ||
920718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_RGB ||
9218e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dk == DataKind.PIXEL_RGBA ||
922dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams              dk == DataKind.PIXEL_DEPTH ||
923dd6c8b34f172ba699954e4d3095dba8c0fd5e930Jason Sams              dk == DataKind.PIXEL_YUV)) {
924c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Unsupported DataKind");
92507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
926718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (!(dt == DataType.UNSIGNED_8 ||
9278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dt == DataType.UNSIGNED_16 ||
928718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_5_6_5 ||
929718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_4_4_4_4 ||
930718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_5_5_5_1)) {
931c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Unsupported DataType");
93207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
933718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
934c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
93507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
936718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
937c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
93825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        }
939718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
940c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
94107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
9428e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        if (dt == DataType.UNSIGNED_16 &&
9438e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            dk != DataKind.PIXEL_DEPTH) {
9448e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            throw new RSIllegalArgumentException("Bad kind and type combo");
9458e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
94607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
947718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int size = 1;
9488e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        switch (dk) {
9498e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_LA:
950718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 2;
9518e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
9528e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_RGB:
953718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 3;
9548e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
9558e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_RGBA:
956718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 4;
9578e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
9588e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_DEPTH:
9598e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            size = 2;
9608e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
961334ea0c98f051b5a6b85bc616c93304651854298Jason Sams        }
962334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
9630de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = true;
9640de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
9650de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, size);
966718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
96707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
9689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
969f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * Check if the current Element is compatible with another Element.
970f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * Primitive Elements are compatible if they share the same underlying
971f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * size and type (i.e. U8 is compatible with A_8). User-defined Elements
972f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * must be equal in order to be compatible. This requires strict name
973f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * equivalence for all sub-Elements (in addition to structural equivalence).
974f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     *
975f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * @param e The Element to check compatibility with.
976f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     *
977f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     * @return boolean true if the Elements are compatible, otherwise false.
978f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines     */
979f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines    public boolean isCompatible(Element e) {
980f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        // Try strict BaseObj equality to start with.
981f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        if (this.equals(e)) {
982f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines            return true;
983f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        }
984f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines
985f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        // Ignore mKind because it is allowed to be different (user vs. pixel).
986f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        // We also ignore mNormalized because it can be different. The mType
987209481137147e64c72f1d5737085b17736931bdaStephen Hines        // field must not be NONE since we require name equivalence for
988209481137147e64c72f1d5737085b17736931bdaStephen Hines        // all user-created Elements.
989f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines        return ((mSize == e.mSize) &&
990209481137147e64c72f1d5737085b17736931bdaStephen Hines                (mType != DataType.NONE) &&
991f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines                (mType == e.mType) &&
992f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines                (mVectorSize == e.mVectorSize));
993f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines    }
994f257e513a11cb89a6cf5200ecf5ae14714cdaf39Stephen Hines
9959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
996a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Builder class for producing complex elements with matching field and name
997a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * pairs.  The builder starts empty.  The order in which elements are added
998a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * is retained for the layout in memory.
999a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
1000a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1001718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static class Builder {
1002718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        RenderScript mRS;
1003718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        Element[] mElements;
1004718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        String[] mElementNames;
100570d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        int[] mArraySizes;
1006718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mCount;
1007e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk        int mSkipPadding;
1008334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
10099c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1010a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create a builder object.
1011a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1012a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param rs
1013a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
1014718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        public Builder(RenderScript rs) {
1015718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mRS = rs;
1016718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mCount = 0;
1017718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElements = new Element[8];
1018718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElementNames = new String[8];
101970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            mArraySizes = new int[8];
1020718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
1021718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
10229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1023a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add an array of elements to this element.
1024a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1025a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param element
1026a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param name
1027a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param arraySize
1028a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
1029bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder add(Element element, String name, int arraySize) {
103070d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            if (arraySize < 1) {
1031c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams                throw new RSIllegalArgumentException("Array size cannot be less than 1.");
103270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            }
1033e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk
1034e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            // Skip padding fields after a vector 3 type.
1035e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if (mSkipPadding != 0) {
1036e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                if (name.startsWith("#padding_")) {
1037e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                    mSkipPadding = 0;
1038e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                    return this;
1039e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                }
1040e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            }
1041e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk
1042e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            if (element.mVectorSize == 3) {
1043e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSkipPadding = 1;
1044e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            } else {
1045e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk                mSkipPadding = 0;
1046e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk            }
1047e60149d2277da53c4a681b7f3971cf13cd4b012bAlex Sakhartchouk
1048718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            if(mCount == mElements.length) {
1049718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                Element[] e = new Element[mCount + 8];
1050718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                String[] s = new String[mCount + 8];
105170d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                int[] as = new int[mCount + 8];
1052718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                System.arraycopy(mElements, 0, e, 0, mCount);
1053718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                System.arraycopy(mElementNames, 0, s, 0, mCount);
105470d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                System.arraycopy(mArraySizes, 0, as, 0, mCount);
1055718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                mElements = e;
1056718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                mElementNames = s;
105770d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                mArraySizes = as;
1058718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            }
1059718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElements[mCount] = element;
1060718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElementNames[mCount] = name;
106170d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            mArraySizes[mCount] = arraySize;
1062718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mCount++;
1063bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
106407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
106507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
10669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1067a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add a single element to this Element.
1068a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1069a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param element
1070a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param name
1071a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
1072bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder add(Element element, String name) {
1073bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return add(element, name, 1);
107470d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        }
107570d4e5024298f71edb3b04867e05568f5495b4ceJason Sams
10769c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
1077a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create the element from this builder.
1078a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1079a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
1080a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @return Element
1081a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
108222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Element create() {
1083771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
1084718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            Element[] ein = new Element[mCount];
1085718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            String[] sin = new String[mCount];
108670d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            int[] asin = new int[mCount];
1087718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
1088718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
108970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
10900de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk
10910de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            int[] ids = new int[ein.length];
10920de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            for (int ct = 0; ct < ein.length; ct++ ) {
1093e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                ids[ct] = ein[ct].getID(mRS);
10940de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            }
109570d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            int id = mRS.nElementCreate2(ids, sin, asin);
109670d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            return new Element(id, mRS, ein, sin, asin);
109736e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
109836e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
109936e612a488511940b61f09803b270aa1c61b68e0Jason Sams}
110036e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1101