Element.java revision 8e90f2bc1fa35a2dc7bd2aab8b8241b628800218
136e612a488511940b61f09803b270aa1c61b68e0Jason Sams/*
236e612a488511940b61f09803b270aa1c61b68e0Jason Sams * Copyright (C) 2008 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
2236e612a488511940b61f09803b270aa1c61b68e0Jason Sams/**
2311518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>The most basic data type. An element represents one cell of a memory allocation.
24347697710d033036c533bd6cee409c4b4c19d437Alex Sakhartchouk * Element is the basic data type of Renderscript. An element can be of two forms: Basic elements or Complex forms.
2511518acc8c416023d8c2192b441a1767205676d9Robert Ly * Examples of basic elements are:</p>
2611518acc8c416023d8c2192b441a1767205676d9Robert Ly * <ul>
2711518acc8c416023d8c2192b441a1767205676d9Robert Ly *  <li>Single float value</li>
2811518acc8c416023d8c2192b441a1767205676d9Robert Ly *  <li>4 element float vector</li>
2911518acc8c416023d8c2192b441a1767205676d9Robert Ly *  <li>single RGB-565 color</li>
3011518acc8c416023d8c2192b441a1767205676d9Robert Ly *  <li>single unsigned int 16</li>
3111518acc8c416023d8c2192b441a1767205676d9Robert Ly * </ul>
32347697710d033036c533bd6cee409c4b4c19d437Alex Sakhartchouk * <p>Complex elements contain a list of sub-elements and names that
3311518acc8c416023d8c2192b441a1767205676d9Robert Ly * represents a structure of data. The fields can be accessed by name
3411518acc8c416023d8c2192b441a1767205676d9Robert Ly * from a script or shader. The memory layout is defined and ordered. Data
3511518acc8c416023d8c2192b441a1767205676d9Robert Ly * alignment is determinied by the most basic primitive type. i.e. a float4
36a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * vector will be alligned to sizeof(float) and not sizeof(float4).  The
37a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams * ordering of elements in memory will be the order in which they were added
3811518acc8c416023d8c2192b441a1767205676d9Robert Ly * with each component aligned as necessary. No re-ordering will be done.</p>
39a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams *
4011518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>The primary source of elements are from scripts. A script that exports a
4111518acc8c416023d8c2192b441a1767205676d9Robert Ly * bind point for a data structure generates a Renderscript element to represent the
4211518acc8c416023d8c2192b441a1767205676d9Robert Ly * data exported by the script. The other common source of elements is from bitmap formats.</p>
4336e612a488511940b61f09803b270aa1c61b68e0Jason Sams **/
4436e612a488511940b61f09803b270aa1c61b68e0Jason Samspublic class Element extends BaseObj {
45ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    int mSize;
46718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    Element[] mElements;
47718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    String[] mElementNames;
4870d4e5024298f71edb3b04867e05568f5495b4ceJason Sams    int[] mArraySizes;
49ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
50718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    DataType mType;
51718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    DataKind mKind;
52718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    boolean mNormalized;
53718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int mVectorSize;
54718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
55718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    int getSizeBytes() {return mSize;}
56718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
57a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams
58a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
59a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * DataType represents the basic type information for a basic element.  The
60a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * naming convention follows.  For numeric types its FLOAT, SIGNED, UNSIGNED
61a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * followed by the _BITS where BITS is the size of the data.  BOOLEAN is a
62a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * true / false (1,0) represented in an 8 bit container.  The UNSIGNED
63a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * variants with multiple bit definitions are for packed graphical data
64a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * formats and represents vectors with per vector member sizes which are
65a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * treated as a single unit for packing and alignment purposes.
66a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
67a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * MATRIX the three matrix types contain FLOAT_32 elements and are treated
68a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * as 32 bits for alignment purposes.
69a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
70a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * RS_* objects.  32 bit opaque handles.
71a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
72718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public enum DataType {
73718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        //FLOAT_16 (1, 2),
74718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        FLOAT_32 (2, 4),
7502f41705199336f808ece50d81585450e7f8f61fStephen Hines        FLOAT_64 (3, 8),
76718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_8 (4, 1),
77718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_16 (5, 2),
78718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        SIGNED_32 (6, 4),
79ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        SIGNED_64 (7, 8),
80718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_8 (8, 1),
81718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_16 (9, 2),
82718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        UNSIGNED_32 (10, 4),
8352d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        UNSIGNED_64 (11, 8),
84718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
85f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        BOOLEAN(12, 1),
86f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
87f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_5_6_5 (13, 2),
88f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_5_5_5_1 (14, 2),
89f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        UNSIGNED_4_4_4_4 (15, 2),
90f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
911d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_4X4 (16, 64),
921d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_3X3 (17, 36),
931d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        MATRIX_2X2 (18, 16),
941d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
951d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_ELEMENT (1000, 4),
961d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_TYPE (1001, 4),
971d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_ALLOCATION (1002, 4),
981d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_SAMPLER (1003, 4),
991d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_SCRIPT (1004, 4),
1001d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_MESH (1005, 4),
1011d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_FRAGMENT (1006, 4),
1021d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_VERTEX (1007, 4),
1031d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_RASTER (1008, 4),
1041d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        RS_PROGRAM_STORE (1009, 4);
105718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
106718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mID;
107718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mSize;
108718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        DataType(int id, int size) {
109718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mID = id;
110718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mSize = size;
111718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
112768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
113768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
114a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
115a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * The special interpretation of the data if required.  This is primarly
116a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * useful for graphical data.  USER indicates no special interpretation is
117a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * expected.  PIXEL is used in conjunction with the standard data types for
118a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * representing texture formats.
119a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
120718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public enum DataKind {
121718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        USER (0),
122718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
123718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_L (7),
124718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_A (8),
125718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_LA (9),
126718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        PIXEL_RGB (10),
1278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        PIXEL_RGBA (11),
1288e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        PIXEL_DEPTH (12);
129718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
130718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mID;
131718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        DataKind(int id) {
132718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mID = id;
133ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams        }
13436e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
13536e612a488511940b61f09803b270aa1c61b68e0Jason Sams
136a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
137a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Return if a element is too complex for use as a data source for a Mesh or
138a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * a Program.
139a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
140a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return boolean
141a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
142c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams    public boolean isComplex() {
143c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        if (mElements == null) {
144c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            return false;
145c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        }
146c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        for (int ct=0; ct < mElements.length; ct++) {
147c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            if (mElements[ct].mElements != null) {
148c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams                return true;
149c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            }
150c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        }
151c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams        return false;
152c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams    }
153c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams
154a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
155a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single Boolean.
156a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
157a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
158a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
159a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
160a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
161f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    public static Element BOOLEAN(RenderScript rs) {
162f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        if(rs.mElement_BOOLEAN == null) {
163f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams            rs.mElement_BOOLEAN = createUser(rs, DataType.BOOLEAN);
164f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        }
165f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams        return rs.mElement_BOOLEAN;
166f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams    }
167f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams
168a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
169a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single UNSIGNED_8.
170a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
171a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
172a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
173a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
174a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1758cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U8(RenderScript rs) {
1768cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_U8 == null) {
1778cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_U8 = createUser(rs, DataType.UNSIGNED_8);
1783c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
1798cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_U8;
1803c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
181ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
182a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
183a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Utility function for returning an Element containing a single SIGNED_8.
184a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
185a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs Context to which the element will belong.
186a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
187a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
188a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
1898cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element I8(RenderScript rs) {
1908cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_I8 == null) {
1918cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_I8 = createUser(rs, DataType.SIGNED_8);
1923c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
1938cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_I8;
1943c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
1953c0dfbab807a459622aeade4940daddf482dec66Jason Sams
196e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    public static Element U16(RenderScript rs) {
197e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        if(rs.mElement_U16 == null) {
198e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams            rs.mElement_U16 = createUser(rs, DataType.UNSIGNED_16);
199e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        }
200e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        return rs.mElement_U16;
201e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    }
202e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams
203e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    public static Element I16(RenderScript rs) {
204e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        if(rs.mElement_I16 == null) {
205e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams            rs.mElement_I16 = createUser(rs, DataType.SIGNED_16);
206e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        }
207e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams        return rs.mElement_I16;
208e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams    }
209e29f3e74f71ea730519ff8ae1d8dd4c1630bbaf9Jason Sams
2108cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U32(RenderScript rs) {
2118cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_U32 == null) {
2128cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_U32 = createUser(rs, DataType.UNSIGNED_32);
2133c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
2148cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_U32;
2153c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
2163c0dfbab807a459622aeade4940daddf482dec66Jason Sams
2178cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element I32(RenderScript rs) {
2188cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_I32 == null) {
2198cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_I32 = createUser(rs, DataType.SIGNED_32);
2203c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
2218cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_I32;
2223c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
2233c0dfbab807a459622aeade4940daddf482dec66Jason Sams
22452d836332f6aae74ed97fda1b53681f36710af64Stephen Hines    public static Element U64(RenderScript rs) {
22552d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        if(rs.mElement_U64 == null) {
22652d836332f6aae74ed97fda1b53681f36710af64Stephen Hines            rs.mElement_U64 = createUser(rs, DataType.UNSIGNED_64);
22752d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        }
22852d836332f6aae74ed97fda1b53681f36710af64Stephen Hines        return rs.mElement_U64;
22952d836332f6aae74ed97fda1b53681f36710af64Stephen Hines    }
23052d836332f6aae74ed97fda1b53681f36710af64Stephen Hines
231ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines    public static Element I64(RenderScript rs) {
232ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        if(rs.mElement_I64 == null) {
233ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines            rs.mElement_I64 = createUser(rs, DataType.SIGNED_64);
234ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        }
235ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines        return rs.mElement_I64;
236ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines    }
237ef1dac28d3bf98bd61cd9874fb3ccab42105e9b6Stephen Hines
2388cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32(RenderScript rs) {
2398cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_F32 == null) {
2408cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_F32 = createUser(rs, DataType.FLOAT_32);
2413c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
2428cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_F32;
2433c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
2443c0dfbab807a459622aeade4940daddf482dec66Jason Sams
24502f41705199336f808ece50d81585450e7f8f61fStephen Hines    public static Element F64(RenderScript rs) {
24602f41705199336f808ece50d81585450e7f8f61fStephen Hines        if(rs.mElement_F64 == null) {
24702f41705199336f808ece50d81585450e7f8f61fStephen Hines            rs.mElement_F64 = createUser(rs, DataType.FLOAT_64);
24802f41705199336f808ece50d81585450e7f8f61fStephen Hines        }
24902f41705199336f808ece50d81585450e7f8f61fStephen Hines        return rs.mElement_F64;
25002f41705199336f808ece50d81585450e7f8f61fStephen Hines    }
25102f41705199336f808ece50d81585450e7f8f61fStephen Hines
2528cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element ELEMENT(RenderScript rs) {
2538cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_ELEMENT == null) {
2548cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_ELEMENT = createUser(rs, DataType.RS_ELEMENT);
255a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2568cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_ELEMENT;
257a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
258a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2598cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element TYPE(RenderScript rs) {
2608cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_TYPE == null) {
2618cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_TYPE = createUser(rs, DataType.RS_TYPE);
262a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2638cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_TYPE;
264a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
265a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2668cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element ALLOCATION(RenderScript rs) {
2678cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_ALLOCATION == null) {
2688cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_ALLOCATION = createUser(rs, DataType.RS_ALLOCATION);
269a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2708cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_ALLOCATION;
271a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
272a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2738cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element SAMPLER(RenderScript rs) {
2748cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_SAMPLER == null) {
2758cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_SAMPLER = createUser(rs, DataType.RS_SAMPLER);
276a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2778cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_SAMPLER;
278a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
279a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2808cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element SCRIPT(RenderScript rs) {
2818cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_SCRIPT == null) {
2828cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_SCRIPT = createUser(rs, DataType.RS_SCRIPT);
283a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2848cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_SCRIPT;
285a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
286a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2878cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element MESH(RenderScript rs) {
2888cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_MESH == null) {
2898cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_MESH = createUser(rs, DataType.RS_MESH);
290a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2918cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_MESH;
292a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
293a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2948cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_FRAGMENT(RenderScript rs) {
2958cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_FRAGMENT == null) {
2968cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_FRAGMENT = createUser(rs, DataType.RS_PROGRAM_FRAGMENT);
297a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
2988cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_FRAGMENT;
299a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
300a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
3018cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_VERTEX(RenderScript rs) {
3028cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_VERTEX == null) {
3038cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_VERTEX = createUser(rs, DataType.RS_PROGRAM_VERTEX);
304a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
3058cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_VERTEX;
306a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
307a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
3088cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_RASTER(RenderScript rs) {
3098cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_RASTER == null) {
3108cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_RASTER = createUser(rs, DataType.RS_PROGRAM_RASTER);
311a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
3128cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_RASTER;
313a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
314a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
3158cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element PROGRAM_STORE(RenderScript rs) {
3168cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_PROGRAM_STORE == null) {
3178cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_PROGRAM_STORE = createUser(rs, DataType.RS_PROGRAM_STORE);
318a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams        }
3198cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_PROGRAM_STORE;
320a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams    }
321a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
322a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
3233c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element A_8(RenderScript rs) {
3243c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_A_8 == null) {
325718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_A_8 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_A);
3263c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3273c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_A_8;
3283c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3293c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3303c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGB_565(RenderScript rs) {
3313c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGB_565 == null) {
332718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGB_565 = createPixel(rs, DataType.UNSIGNED_5_6_5, DataKind.PIXEL_RGB);
3333c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3343c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGB_565;
3353c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3363c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3373c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGB_888(RenderScript rs) {
3383c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGB_888 == null) {
339718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGB_888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGB);
3403c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3413c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGB_888;
3423c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3433c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3443c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_5551(RenderScript rs) {
3453c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGBA_5551 == null) {
346718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGBA_5551 = createPixel(rs, DataType.UNSIGNED_5_5_5_1, DataKind.PIXEL_RGBA);
3473c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3483c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_5551;
3493c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3503c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3513c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_4444(RenderScript rs) {
3523c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGBA_4444 == null) {
353718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGBA_4444 = createPixel(rs, DataType.UNSIGNED_4_4_4_4, DataKind.PIXEL_RGBA);
3543c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3553c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_4444;
3563c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3573c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3583c0dfbab807a459622aeade4940daddf482dec66Jason Sams    public static Element RGBA_8888(RenderScript rs) {
3593c0dfbab807a459622aeade4940daddf482dec66Jason Sams        if(rs.mElement_RGBA_8888 == null) {
360718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            rs.mElement_RGBA_8888 = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_RGBA);
3613c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3623c0dfbab807a459622aeade4940daddf482dec66Jason Sams        return rs.mElement_RGBA_8888;
3633c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3643c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3658cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_2(RenderScript rs) {
3668cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_FLOAT_2 == null) {
3678cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_FLOAT_2 = createVector(rs, DataType.FLOAT_32, 2);
3683c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3698cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_2;
3703c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
3713c0dfbab807a459622aeade4940daddf482dec66Jason Sams
3728cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_3(RenderScript rs) {
3738cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_FLOAT_3 == null) {
3748cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_FLOAT_3 = createVector(rs, DataType.FLOAT_32, 3);
3753c0dfbab807a459622aeade4940daddf482dec66Jason Sams        }
3768cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_3;
37736e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
37836e612a488511940b61f09803b270aa1c61b68e0Jason Sams
3798cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element F32_4(RenderScript rs) {
3808cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_FLOAT_4 == null) {
3818cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_FLOAT_4 = createVector(rs, DataType.FLOAT_32, 4);
382718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
3838cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_FLOAT_4;
3843c0dfbab807a459622aeade4940daddf482dec66Jason Sams    }
38536e612a488511940b61f09803b270aa1c61b68e0Jason Sams
3868cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    public static Element U8_4(RenderScript rs) {
3878cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        if(rs.mElement_UCHAR_4 == null) {
3888cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams            rs.mElement_UCHAR_4 = createVector(rs, DataType.UNSIGNED_8, 4);
38936e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
3908cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams        return rs.mElement_UCHAR_4;
39136e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
39236e612a488511940b61f09803b270aa1c61b68e0Jason Sams
3931d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_4X4(RenderScript rs) {
3941d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        if(rs.mElement_MATRIX_4X4 == null) {
3951d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams            rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4);
3961d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
3971d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return rs.mElement_MATRIX_4X4;
3981d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
3991d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX4X4(RenderScript rs) {
4001d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return MATRIX_4X4(rs);
4011d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
4021d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
4031d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_3X3(RenderScript rs) {
4041d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        if(rs.mElement_MATRIX_3X3 == null) {
4051d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams            rs.mElement_MATRIX_3X3 = createUser(rs, DataType.MATRIX_3X3);
4061d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
407347697710d033036c533bd6cee409c4b4c19d437Alex Sakhartchouk        return rs.mElement_MATRIX_3X3;
4081d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
4091d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams
4101d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    public static Element MATRIX_2X2(RenderScript rs) {
4111d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        if(rs.mElement_MATRIX_2X2 == null) {
4121d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams            rs.mElement_MATRIX_2X2 = createUser(rs, DataType.MATRIX_2X2);
4131d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        }
4141d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams        return rs.mElement_MATRIX_2X2;
4151d45c47975ab2a8cef6db5a8976276de31e1e8d0Jason Sams    }
41636e612a488511940b61f09803b270aa1c61b68e0Jason Sams
41770d4e5024298f71edb3b04867e05568f5495b4ceJason Sams    Element(int id, RenderScript rs, Element[] e, String[] n, int[] as) {
4180de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
419ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams        mSize = 0;
420718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mElements = e;
421718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mElementNames = n;
42270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        mArraySizes = as;
423718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        for (int ct = 0; ct < mElements.length; ct++ ) {
4249e401bcd88a0fdeea96f53cb776e5de7b5b084cbAlex Sakhartchouk            mSize += mElements[ct].mSize * mArraySizes[ct];
425718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
426718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
427718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
4280de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk    Element(int id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
4290de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
430252c07802f7039f15f723751162e64a6621e6998Jason Sams        if ((dt != DataType.UNSIGNED_5_6_5) &&
431252c07802f7039f15f723751162e64a6621e6998Jason Sams            (dt != DataType.UNSIGNED_4_4_4_4) &&
432252c07802f7039f15f723751162e64a6621e6998Jason Sams            (dt != DataType.UNSIGNED_5_5_5_1)) {
433252c07802f7039f15f723751162e64a6621e6998Jason Sams            mSize = dt.mSize * size;
434252c07802f7039f15f723751162e64a6621e6998Jason Sams        } else {
435252c07802f7039f15f723751162e64a6621e6998Jason Sams            mSize = dt.mSize;
436252c07802f7039f15f723751162e64a6621e6998Jason Sams        }
437718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mType = dt;
438718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mKind = dk;
439718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mNormalized = norm;
440718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        mVectorSize = size;
44136e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
44236e612a488511940b61f09803b270aa1c61b68e0Jason Sams
4430de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk    Element(int id, RenderScript rs) {
4440de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
445dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
446dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
447dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
448dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
44906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        super.updateFromNative();
450dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
451dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
452dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int[] dataBuffer = new int[5];
45306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams        mRS.nElementGetNativeData(getID(), dataBuffer);
4540de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk
4550de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mNormalized = dataBuffer[2] == 1 ? true : false;
4560de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mVectorSize = dataBuffer[3];
4570de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        mSize = 0;
458dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        for (DataType dt: DataType.values()) {
459dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(dt.mID == dataBuffer[0]){
460dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mType = dt;
4610de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mSize = mType.mSize * mVectorSize;
462dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
463dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
464dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        for (DataKind dk: DataKind.values()) {
465dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(dk.mID == dataBuffer[1]){
466dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mKind = dk;
467dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
468dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
469dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
470dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int numSubElements = dataBuffer[4];
471dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(numSubElements > 0) {
472dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElements = new Element[numSubElements];
473dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElementNames = new String[numSubElements];
474dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
475dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            int[] subElementIds = new int[numSubElements];
47606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams            mRS.nElementGetSubElements(getID(), subElementIds, mElementNames);
477dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            for(int i = 0; i < numSubElements; i ++) {
4780de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mElements[i] = new Element(subElementIds[i], mRS);
479dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                mElements[i].updateFromNative();
4800de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk                mSize += mElements[i].mSize;
481dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            }
482dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
483dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
484dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
485dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
486a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
487a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a custom Element of the specified DataType.  The DataKind will be
488a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * set to USER and the vector size to 1 indicating non-vector.
489a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
490a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
491a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
492a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
493a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
494bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    static Element createUser(RenderScript rs, DataType dt) {
4950de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        DataKind dk = DataKind.USER;
4960de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = false;
4970de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int vecSize = 1;
4980de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int id = rs.nElementCreate(dt.mID, dk.mID, norm, vecSize);
4990de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, vecSize);
500ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    }
501ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
502a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
503a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a custom vector element of the specified DataType and vector size.
504a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *  DataKind will be set to USER.
505a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
506a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
507a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
508a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param size Vector size for the new Element.  Range 2-4 inclusive
509a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *             supported.
510a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
511a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
512a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
513718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static Element createVector(RenderScript rs, DataType dt, int size) {
514718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (size < 2 || size > 4) {
515bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            throw new RSIllegalArgumentException("Vector size out of range 2-4.");
51636e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
5170de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        DataKind dk = DataKind.USER;
5180de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = false;
5190de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
5200de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, size);
521718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
52236e612a488511940b61f09803b270aa1c61b68e0Jason Sams
523a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
524a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Create a new pixel Element type.  A matching DataType and DataKind must
525a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * be provided.  The DataType and DataKind must contain the same number of
526a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * components.  Vector size will be set to 1.
527a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
528a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param rs The context associated with the new Element.
529a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dt The DataType for the new element.
530a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @param dk The DataKind to specify the mapping of each component in the
531a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *           DataType.
532a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
533a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * @return Element
534a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
535718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static Element createPixel(RenderScript rs, DataType dt, DataKind dk) {
536718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (!(dk == DataKind.PIXEL_L ||
537718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_A ||
538718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_LA ||
539718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dk == DataKind.PIXEL_RGB ||
5408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dk == DataKind.PIXEL_RGBA ||
5418e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dk == DataKind.PIXEL_DEPTH)) {
542c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Unsupported DataKind");
54307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
544718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (!(dt == DataType.UNSIGNED_8 ||
5458e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk              dt == DataType.UNSIGNED_16 ||
546718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_5_6_5 ||
547718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_4_4_4_4 ||
548718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams              dt == DataType.UNSIGNED_5_5_5_1)) {
549c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Unsupported DataType");
55007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
551718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_5_6_5 && dk != DataKind.PIXEL_RGB) {
552c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
55307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
554718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_5_5_5_1 && dk != DataKind.PIXEL_RGBA) {
555c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
55625ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        }
557718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        if (dt == DataType.UNSIGNED_4_4_4_4 && dk != DataKind.PIXEL_RGBA) {
558c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams            throw new RSIllegalArgumentException("Bad kind and type combo");
55907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
5608e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        if (dt == DataType.UNSIGNED_16 &&
5618e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            dk != DataKind.PIXEL_DEPTH) {
5628e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            throw new RSIllegalArgumentException("Bad kind and type combo");
5638e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        }
56407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
565718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int size = 1;
5668e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        switch (dk) {
5678e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_LA:
568718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 2;
5698e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
5708e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_RGB:
571718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 3;
5728e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
5738e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_RGBA:
574718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            size = 4;
5758e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
5768e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        case PIXEL_DEPTH:
5778e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            size = 2;
5788e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk            break;
579334ea0c98f051b5a6b85bc616c93304651854298Jason Sams        }
580334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
5810de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        boolean norm = true;
5820de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        int id = rs.nElementCreate(dt.mID, dk.mID, norm, size);
5830de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        return new Element(id, rs, dt, dk, norm, size);
584718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    }
58507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
586a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams    /**
587a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * Builder class for producing complex elements with matching field and name
588a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * pairs.  The builder starts empty.  The order in which elements are added
589a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     * is retained for the layout in memory.
590a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     *
591a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams     */
592718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    public static class Builder {
593718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        RenderScript mRS;
594718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        Element[] mElements;
595718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        String[] mElementNames;
59670d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        int[] mArraySizes;
597718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        int mCount;
598334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
599a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
600a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create a builder object.
601a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
602a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param rs
603a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
604718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        public Builder(RenderScript rs) {
605718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mRS = rs;
606718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mCount = 0;
607718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElements = new Element[8];
608718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElementNames = new String[8];
60970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            mArraySizes = new int[8];
610718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        }
611718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
612a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
613a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add an array of elements to this element.
614a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
615a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param element
616a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param name
617a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param arraySize
618a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
619bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder add(Element element, String name, int arraySize) {
62070d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            if (arraySize < 1) {
621c1d6210fb5cc558ccea95a59a2b33bb9015fc7deJason Sams                throw new RSIllegalArgumentException("Array size cannot be less than 1.");
62270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            }
623718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            if(mCount == mElements.length) {
624718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                Element[] e = new Element[mCount + 8];
625718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                String[] s = new String[mCount + 8];
62670d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                int[] as = new int[mCount + 8];
627718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                System.arraycopy(mElements, 0, e, 0, mCount);
628718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                System.arraycopy(mElementNames, 0, s, 0, mCount);
62970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                System.arraycopy(mArraySizes, 0, as, 0, mCount);
630718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                mElements = e;
631718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams                mElementNames = s;
63270d4e5024298f71edb3b04867e05568f5495b4ceJason Sams                mArraySizes = as;
633718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            }
634718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElements[mCount] = element;
635718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mElementNames[mCount] = name;
63670d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            mArraySizes[mCount] = arraySize;
637718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mCount++;
638bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return this;
63907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        }
64007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
641a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
642a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Add a single element to this Element.
643a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
644a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param element
645a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @param name
646a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
647bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        public Builder add(Element element, String name) {
648bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams            return add(element, name, 1);
64970d4e5024298f71edb3b04867e05568f5495b4ceJason Sams        }
65070d4e5024298f71edb3b04867e05568f5495b4ceJason Sams
651a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams        /**
652a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * Create the element from this builder.
653a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
654a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         *
655a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         * @return Element
656a1b13ed0912a7e08f9848196b4ca64dcb5db9d0bJason Sams         */
65722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Element create() {
658771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
659718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            Element[] ein = new Element[mCount];
660718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            String[] sin = new String[mCount];
66170d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            int[] asin = new int[mCount];
662718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            java.lang.System.arraycopy(mElements, 0, ein, 0, mCount);
663718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            java.lang.System.arraycopy(mElementNames, 0, sin, 0, mCount);
66470d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            java.lang.System.arraycopy(mArraySizes, 0, asin, 0, mCount);
6650de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk
6660de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            int[] ids = new int[ein.length];
6670de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            for (int ct = 0; ct < ein.length; ct++ ) {
66806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams                ids[ct] = ein[ct].getID();
6690de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            }
67070d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            int id = mRS.nElementCreate2(ids, sin, asin);
67170d4e5024298f71edb3b04867e05568f5495b4ceJason Sams            return new Element(id, mRS, ein, sin, asin);
67236e612a488511940b61f09803b270aa1c61b68e0Jason Sams        }
67336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    }
67436e612a488511940b61f09803b270aa1c61b68e0Jason Sams}
67536e612a488511940b61f09803b270aa1c61b68e0Jason Sams
676