/*
 * 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/generate.sh.

/*
 * rs_value_types.rsh: Numerical Types
 *
 * Scalars:
 *
 * RenderScript supports the following scalar numerical types:
 *
 *                    8 bits           16 bits            32 bits          64 bits
 * Integer:           char, int8_t     short, int16_t     int32_t          long, long long, int64_t
 * Unsigned integer:  uchar, uint8_t   ushort, uint16_t   uint, uint32_t   ulong, uint64_t
 * Floating point:                     half               float            double
 *
 *
 * Vectors:
 *
 * RenderScript supports fixed size vectors of length 2, 3, and 4.
 * Vectors are declared using the common type name followed by a 2, 3, or 4.
 * E.g. float4, int3, double2, ulong4.
 *
 * To create vector literals, use the vector type followed by the values enclosed
 * between parentheses, e.g. (float3)(1.0f, 2.0f, 3.0f).
 *
 * Entries of a vector can be accessed using different naming styles.
 *
 * Single entries can be accessed by following the variable name with a dot and:
 * - The letters x, y, z, and w,
 * - The letters r, g, b, and a,
 * - The letter s or S, followed by a zero based index.
 *
 * For example, with int4 myVar; the following are equivalent:
 *   myVar.x == myVar.r == myVar.s0 == myVar.S0
 *   myVar.y == myVar.g == myVar.s1 == myVar.S1
 *   myVar.z == myVar.b == myVar.s2 == myVar.S2
 *   myVar.w == myVar.a == myVar.s3 == myVar.S3
 *
 * Multiple entries of a vector can be accessed at once by using an identifier that is
 * the concatenation of multiple letters or indices.  The resulting vector has a size
 * equal to the number of entries named.
 *
 * With the example above, the middle two entries can be accessed using
 * myVar.yz, myVar.gb, myVar.s12, and myVar.S12.
 *
 * The entries don't have to be contiguous or in increasing order.  Entries can even be
 * repeated, as long as we're not trying to assign to it.  You also can't mix the naming
 * styles.
 *
 * Here are examples of what can or can't be done:
 * float4 v4;
 * float3 v3;
 * float2 v2;
 * v2 = v4.xx; // Valid
 * v3 = v4.zxw; // Valid
 * v3 = v4.bba; // Valid
 * v3 = v4.s032; // Valid
 * v3.s120 = v4.S233; // Valid
 * v4.yz = v3.rg; // Valid
 * v4.yzx = v3.rg; // Invalid: mismatched sizes
 * v4.yzz = v3; // Invalid: z appears twice in an assignment
 * v3 = v3.xas0; // Invalid: can't mix xyzw with rgba nor s0...
 * v3 = v4.s034; // Invalid: the digit can only be 0, 1, 2, or 3
 *
 *
 * Matrices and Quaternions:
 *
 * RenderScript supports fixed size square matrices of floats of size 2x2, 3x3, and 4x4.
 * The types are named rs_matrix2x2, rs_matrix3x3, and rs_matrix4x4.  See
 * Matrix Functions for the list of operations.
 *
 * Quaternions are also supported via rs_quaternion.  See Quaterion Functions for the list
 * of operations.
 */

#ifndef RENDERSCRIPT_RS_VALUE_TYPES_RSH
#define RENDERSCRIPT_RS_VALUE_TYPES_RSH

/*
 * half: 16 bit floating point value
 *
 * A 16 bit floating point value.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 23))
typedef __fp16 half;
#endif

/*
 * half2: Two 16 bit floats
 *
 * Vector version of the half float type. Provides two half fields packed
 * into a single 32 bit field with 32 bit alignment.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 23))
typedef half __attribute__((ext_vector_type(2))) half2;
#endif

/*
 * half3: Three 16 bit floats
 *
 * Vector version of the half float type. Provides three half fields packed
 * into a single 64 bit field with 64 bit alignment.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 23))
typedef half __attribute__((ext_vector_type(3))) half3;
#endif

/*
 * half4: Four 16 bit floats
 *
 * Vector version of the half float type. Provides four half fields packed
 * into a single 64 bit field with 64 bit alignment.
 */
#if (defined(RS_VERSION) && (RS_VERSION >= 23))
typedef half __attribute__((ext_vector_type(4))) half4;
#endif

/*
 * int8_t: 8 bit signed integer
 *
 * 8 bit signed integer type.
 */
typedef char int8_t;

/*
 * int16_t: 16 bit signed integer
 *
 * A 16 bit signed integer type.
 */
typedef short int16_t;

/*
 * int32_t: 32 bit signed integer
 *
 * A 32 bit signed integer type.
 */
typedef int int32_t;

/*
 * int64_t: 64 bit signed integer
 *
 * A 64 bit signed integer type.
 */
#if !defined(RS_VERSION) || (RS_VERSION <= 20)
typedef long long int64_t;
#endif

#if (defined(RS_VERSION) && (RS_VERSION >= 21))
typedef long int64_t;
#endif

/*
 * uint8_t: 8 bit unsigned integer
 *
 * 8 bit unsigned integer type.
 */
typedef unsigned char uint8_t;

/*
 * uint16_t: 16 bit unsigned integer
 *
 * A 16 bit unsigned integer type.
 */
typedef unsigned short uint16_t;

/*
 * uint32_t: 32 bit unsigned integer
 *
 * A 32 bit unsigned integer type.
 */
typedef unsigned int uint32_t;

/*
 * uint64_t: 64 bit unsigned integer
 *
 * A 64 bit unsigned integer type.
 */
#if !defined(RS_VERSION) || (RS_VERSION <= 20)
typedef unsigned long long uint64_t;
#endif

#if (defined(RS_VERSION) && (RS_VERSION >= 21))
typedef unsigned long uint64_t;
#endif

/*
 * uchar: 8 bit unsigned integer
 *
 * 8 bit unsigned integer type.
 */
typedef uint8_t uchar;

/*
 * ushort: 16 bit unsigned integer
 *
 * A 16 bit unsigned integer type.
 */
typedef uint16_t ushort;

/*
 * uint: 32 bit unsigned integer
 *
 * A 32 bit unsigned integer type.
 */
typedef uint32_t uint;

/*
 * ulong: 64 bit unsigned integer
 *
 * A 64 bit unsigned integer type.
 */
typedef uint64_t ulong;

/*
 * size_t: Unsigned size type
 *
 * Unsigned size type.  The number of bits depend on the compilation flags.
 */
#ifdef __LP64__
typedef uint64_t size_t;
#endif

#ifndef __LP64__
typedef uint32_t size_t;
#endif

/*
 * ssize_t: Signed size type
 *
 * Signed size type.  The number of bits depend on the compilation flags.
 */
#ifdef __LP64__
typedef int64_t ssize_t;
#endif

#ifndef __LP64__
typedef int32_t ssize_t;
#endif

/*
 * float2: Two 32 bit floats
 *
 * A vector of two floats.  These two floats are packed into a single 64 bit field
 * with a 64 bit alignment.
 *
 * A vector of two floats.  These two floats are packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef float __attribute__((ext_vector_type(2))) float2;

/*
 * float3: Three 32 bit floats
 *
 * A vector of three floats.  These three floats are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef float __attribute__((ext_vector_type(3))) float3;

/*
 * float4: Four 32 bit floats
 *
 * A vector of four floats type.  These four floats are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef float __attribute__((ext_vector_type(4))) float4;

/*
 * double2: Two 64 bit floats
 *
 * A vector of two doubles.  These two double fields packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef double __attribute__((ext_vector_type(2))) double2;

/*
 * double3: Three 64 bit floats
 *
 * A vector of three doubles.  These three double fields packed into a single 256 bit field
 * with a 256 bit alignment.
 */
typedef double __attribute__((ext_vector_type(3))) double3;

/*
 * double4: Four 64 bit floats
 *
 * A vector of four doubles.  These four double fields packed into a single 256 bit field
 * with a 256 bit alignment.
 */
typedef double __attribute__((ext_vector_type(4))) double4;

/*
 * uchar2: Two 8 bit unsigned integers
 *
 * A vector of two uchars.  These two uchar fields packed into a single 16 bit field
 * with a 16 bit alignment.
 */
typedef uchar __attribute__((ext_vector_type(2))) uchar2;

/*
 * uchar3: Three 8 bit unsigned integers
 *
 * A vector of three uchars.  These three uchar fields packed into a single 32 bit field
 * with a 32 bit alignment.
 */
typedef uchar __attribute__((ext_vector_type(3))) uchar3;

/*
 * uchar4: Four 8 bit unsigned integers
 *
 * A vector of four uchars.  These four uchar fields packed into a single 32 bit field
 * with a 32 bit alignment.
 */
typedef uchar __attribute__((ext_vector_type(4))) uchar4;

/*
 * ushort2: Two 16 bit unsigned integers
 *
 * A vector of two ushorts.  These two ushort fields packed into a single 32 bit field
 * with a 32 bit alignment.
 */
typedef ushort __attribute__((ext_vector_type(2))) ushort2;

/*
 * ushort3: Three 16 bit unsigned integers
 *
 * A vector of three ushorts.  These three ushort fields packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef ushort __attribute__((ext_vector_type(3))) ushort3;

/*
 * ushort4: Four 16 bit unsigned integers
 *
 * A vector of four ushorts.  These four ushort fields packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef ushort __attribute__((ext_vector_type(4))) ushort4;

/*
 * uint2: Two 32 bit unsigned integers
 *
 * A vector of two uints.  These two uints are packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef uint __attribute__((ext_vector_type(2))) uint2;

/*
 * uint3: Three 32 bit unsigned integers
 *
 * A vector of three uints.  These three uints are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef uint __attribute__((ext_vector_type(3))) uint3;

/*
 * uint4: Four 32 bit unsigned integers
 *
 * A vector of four uints.  These four uints are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef uint __attribute__((ext_vector_type(4))) uint4;

/*
 * ulong2: Two 64 bit unsigned integers
 *
 * A vector of two ulongs.  These two ulongs are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef ulong __attribute__((ext_vector_type(2))) ulong2;

/*
 * ulong3: Three 64 bit unsigned integers
 *
 * A vector of three ulongs.  These three ulong fields packed into a single 256 bit field
 * with a 256 bit alignment.
 */
typedef ulong __attribute__((ext_vector_type(3))) ulong3;

/*
 * ulong4: Four 64 bit unsigned integers
 *
 * A vector of four ulongs.  These four ulong fields packed into a single 256 bit field
 * with a 256 bit alignment.
 */
typedef ulong __attribute__((ext_vector_type(4))) ulong4;

/*
 * char2: Two 8 bit signed integers
 *
 * A vector of two chars.  These two chars are packed into a single 16 bit field
 * with a 16 bit alignment.
 */
typedef char __attribute__((ext_vector_type(2))) char2;

/*
 * char3: Three 8 bit signed integers
 *
 * A vector of three chars.  These three chars are packed into a single 32 bit field
 * with a 32 bit alignment.
 */
typedef char __attribute__((ext_vector_type(3))) char3;

/*
 * char4: Four 8 bit signed integers
 *
 * A vector of four chars.  These four chars are packed into a single 32 bit field
 * with a 32 bit alignment.
 */
typedef char __attribute__((ext_vector_type(4))) char4;

/*
 * short2: Two 16 bit signed integers
 *
 * A vector of two shorts.  These two shorts are packed into a single 32 bit field
 * with a 32 bit alignment.
 */
typedef short __attribute__((ext_vector_type(2))) short2;

/*
 * short3: Three 16 bit signed integers
 *
 * A vector of three shorts.  These three short fields packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef short __attribute__((ext_vector_type(3))) short3;

/*
 * short4: Four 16 bit signed integers
 *
 * A vector of four shorts.  These four short fields packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef short __attribute__((ext_vector_type(4))) short4;

/*
 * int2: Two 32 bit signed integers
 *
 * A vector of two ints.  These two ints are packed into a single 64 bit field
 * with a 64 bit alignment.
 */
typedef int __attribute__((ext_vector_type(2))) int2;

/*
 * int3: Three 32 bit signed integers
 *
 * A vector of three ints.  These three ints are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef int __attribute__((ext_vector_type(3))) int3;

/*
 * int4: Four 32 bit signed integers
 *
 * A vector of four ints.  These two fours are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef int __attribute__((ext_vector_type(4))) int4;

/*
 * long2: Two 64 bit signed integers
 *
 * A vector of two longs.  These two longs are packed into a single 128 bit field
 * with a 128 bit alignment.
 */
typedef long __attribute__((ext_vector_type(2))) long2;

/*
 * long3: Three 64 bit signed integers
 *
 * A vector of three longs.  These three longs are packed into a single 256 bit field
 * with a 256 bit alignment.
 */
typedef long __attribute__((ext_vector_type(3))) long3;

/*
 * long4: Four 64 bit signed integers
 *
 * A vector of four longs.  These four longs are packed into a single 256 bit field
 * with a 256 bit alignment.
 */
typedef long __attribute__((ext_vector_type(4))) long4;

/*
 * rs_matrix2x2: 2x2 matrix of 32 bit floats
 *
 * A square 2x2 matrix of floats.  The entries are stored in the array at the
 * location [row*2 + col].
 *
 * See Matrix Functions.
 */
typedef struct {
    float m[4];
} rs_matrix2x2;

/*
 * rs_matrix3x3: 3x3 matrix of 32 bit floats
 *
 * A square 3x3 matrix of floats.  The entries are stored in the array at the
 * location [row*3 + col].
 *
 * See Matrix Functions.
 */
typedef struct {
    float m[9];
} rs_matrix3x3;

/*
 * rs_matrix4x4: 4x4 matrix of 32 bit floats
 *
 * A square 4x4 matrix of floats.  The entries are stored in the array at the
 * location [row*4 + col].
 *
 * See Matrix Functions.
 */
typedef struct {
    float m[16];
} rs_matrix4x4;

/*
 * rs_quaternion: Quaternion
 *
 * A square 4x4 matrix of floats that represents a quaternion.
 *
 * See Quaternion Functions.
 */
typedef float4 rs_quaternion;

#endif // RENDERSCRIPT_RS_VALUE_TYPES_RSH
