/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Don't edit this file!  It is auto-generated by frameworks/rs/api/gen_runtime.

/*
 * rs_element.rsh: Element functions
 *
 * The term "element" is used a bit ambiguously in RenderScript, as both
 * the type of an item of an allocation and the instantiation of that type:
 *
 * rs_element is a handle to a type specification, and
 *
 * In functions like rsGetElementAt(), "element" means the instantiation
 * of the type, i.e. an item of an allocation.
 *
 * The functions below let you query the characteristics of the type specificiation.
 *
 * To create complex elements, use the Element.Builder Java class.
 * For common elements, in Java you can simply use one of the many predefined elements
 * like F32_2.  You can't create elements from a script.
 *
 * An element can be a simple data type as found in C/C++, a handle type,
 * a structure, or a fixed size vector (of size 2, 3, or 4) of sub-elements.
 *
 * Elements can also have a kind, which is semantic information used mostly to
 * interpret pixel data.
 */
#ifndef RENDERSCRIPT_RS_ELEMENT_RSH
#define RENDERSCRIPT_RS_ELEMENT_RSH

/*
 * rsElementGetBytesSize: Return the size of an element
 *
 * Returns the size in bytes that an instantiation of this element will occupy.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetBytesSize(rs_element e);
#endif

/*
 * rsElementGetDataKind: Return the kind of an element
 *
 * Returns the element's data kind.  This is used to interpret pixel data.
 *
 * See rs_data_kind.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern rs_data_kind __attribute__((overloadable))
    rsElementGetDataKind(rs_element e);
#endif

/*
 * rsElementGetDataType: Return the data type of an element
 *
 * Returns the element's base data type.  This can be a type similar to C/C++ (e.g. RS_TYPE_UNSIGNED_8),
 * a handle (e.g. RS_TYPE_ALLOCATION and RS_TYPE_ELEMENT), or a more complex numerical type
 * (e.g.RS_TYPE_UNSIGNED_5_6_5 and RS_TYPE_MATRIX_4X4).
 *
 * If the element describes a vector, this function returns the data type of one of its items.
 *
 * If the element describes a structure, RS_TYPE_NONE is returned.
 *
 * See rs_data_type.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern rs_data_type __attribute__((overloadable))
    rsElementGetDataType(rs_element e);
#endif

/*
 * rsElementGetSubElement: Return a sub element of a complex element
 *
 * For the element represents a structure, this function returns the sub-element at
 * the specified index.
 *
 * If the element is not a structure or the index is greater or equal to the number
 * of sub-elements, an invalid handle is returned.
 *
 * Parameters:
 *   e Element to query
 *   index Index of the sub-element to return
 *
 * Returns: Sub-element at the given index
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern rs_element __attribute__((overloadable))
    rsElementGetSubElement(rs_element e, uint32_t index);
#endif

/*
 * rsElementGetSubElementArraySize: Return the array size of a sub element of a complex element
 *
 * For complex elements, some sub-elements could be statically
 * sized arrays. This function returns the array size of the
 * sub-element at the index.
 *
 * Parameters:
 *   e Element to query
 *   index Index of the sub-element
 *
 * Returns: Array size of the sub-element at the given index
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetSubElementArraySize(rs_element e, uint32_t index);
#endif

/*
 * rsElementGetSubElementCount: Return the number of sub-elements
 *
 * Elements could be simple, such as an int or a float, or a
 * structure with multiple sub-elements, such as a collection of
 * floats, float2, float4.  This function returns zero for simple
 * elements or the number of sub-elements otherwise.
 *
 * Parameters:
 *   e Element to get data from
 *
 * Returns: Number of sub-elements in this element
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetSubElementCount(rs_element e);
#endif

/*
 * rsElementGetSubElementName: Return the name of a sub-element
 *
 * For complex elements, this function returns the name of the sub-element
 * at the specified index.
 *
 * Parameters:
 *   e Element to get data from
 *   index Index of the sub-element
 *   name Array to store the name into
 *   nameLength Length of the provided name array
 *
 * Returns: Number of characters actually written, excluding the null terminator
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetSubElementName(rs_element e, uint32_t index, char* name, uint32_t nameLength);
#endif

/*
 * rsElementGetSubElementNameLength: Return the length of the name of a sub-element
 *
 * For complex elements, this function will return the length of
 * sub-element name at index
 *
 * Parameters:
 *   e Element to get data from
 *   index Index of the sub-element to return
 *
 * Returns: Length of the sub-element name including the null terminator (size of buffer needed to write the name)
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetSubElementNameLength(rs_element e, uint32_t index);
#endif

/*
 * This function specifies the location of a sub-element within
 * the element
 *
 * Parameters:
 *   e Element to get data from
 *   index Index of the sub-element
 *
 * Returns: Offset in bytes of sub-element in this element at given index
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index);
#endif

/*
 * Returns the element's vector size
 *
 * Parameters:
 *   e Element to get data from
 *
 * Returns: Length of the element vector (for float2, float3, etc.)
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 16))
extern uint32_t __attribute__((overloadable))
    rsElementGetVectorSize(rs_element e);
#endif

#endif // RENDERSCRIPT_RS_ELEMENT_RSH
