1044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/*
2044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Copyright (C) 2011 The Android Open Source Project
39df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
4044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * you may not use this file except in compliance with the License.
6044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * You may obtain a copy of the License at
709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
8044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
99df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
10044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Unless required by applicable law or agreed to in writing, software
11044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * See the License for the specific language governing permissions and
14044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * limitations under the License.
159df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
169df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
17044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** @file rs_math.rsh
18044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *  \brief todo-jsams
1974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *
20044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *  todo-jsams
2174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *
2274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk */
2374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
24044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#ifndef __RS_MATH_RSH__
25044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#define __RS_MATH_RSH__
269df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
2722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
289df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
299df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Return a random value between 0 (or min_value) and max_malue.
309df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
317349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern int __attribute__((overloadable))
327349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(int max_value);
339df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
349df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
359df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
367349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern int __attribute__((overloadable))
377349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(int min_value, int max_value);
389df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
399df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
409df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
417349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern float __attribute__((overloadable))
427349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(float max_value);
439df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
449df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
459df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
467349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern float __attribute__((overloadable))
477349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(float min_value, float max_value);
487349547db61d2d458b31c074b902d56d082e5d84Jason Sams
499df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
509df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Returns the fractional part of a float
519df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
5252132475c338620cab62cff885792ebf0db5419fStephen Hinesextern float __attribute__((const, overloadable))
537349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsFrac(float);
5422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
5522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
56044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/////////////////////////////////////////////////////
57044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams// int ops
58044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/////////////////////////////////////////////////////
59dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams
609df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
61044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Clamp the value amount between low and high.
629df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
63044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param amount  The value to clamp
64044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param low
65044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param high
669df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
6752132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uint __attribute__((const, overloadable, always_inline)) rsClamp(uint amount, uint low, uint high);
689df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
699df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
70044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload
719df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
7252132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME int __attribute__((const, overloadable, always_inline)) rsClamp(int amount, int low, int high);
739df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
749df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
759df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
7652132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME ushort __attribute__((const, overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high);
779df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
78044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload
799df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
8052132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME short __attribute__((const, overloadable, always_inline)) rsClamp(short amount, short low, short high);
819df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
829df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
839df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
8452132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uchar __attribute__((const, overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high);
859df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
869df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
879df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
8852132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME char __attribute__((const, overloadable, always_inline)) rsClamp(char amount, char low, char high);
89c61346b91434307c5003029017b54ce9c49112beJason Sams
90e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
91e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
92044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Computes 6 frustum planes from the view projection matrix
93044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param viewProj matrix to extract planes from
94044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param left plane
95044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param right plane
96044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param top plane
97044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param bottom plane
98044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param near plane
99044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param far plane
100e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
101044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams__inline__ static void __attribute__((overloadable, always_inline))
102044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsExtractFrustumPlanes(const rs_matrix4x4 *viewProj,
103044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams                         float4 *left, float4 *right,
104044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams                         float4 *top, float4 *bottom,
105044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams                         float4 *near, float4 *far) {
106044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    // x y z w = a b c d in the plane equation
107044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    left->x = viewProj->m[3] + viewProj->m[0];
108044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    left->y = viewProj->m[7] + viewProj->m[4];
109044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    left->z = viewProj->m[11] + viewProj->m[8];
110044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    left->w = viewProj->m[15] + viewProj->m[12];
111e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
112044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    right->x = viewProj->m[3] - viewProj->m[0];
113044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    right->y = viewProj->m[7] - viewProj->m[4];
114044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    right->z = viewProj->m[11] - viewProj->m[8];
115044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    right->w = viewProj->m[15] - viewProj->m[12];
116e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
117044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    top->x = viewProj->m[3] - viewProj->m[1];
118044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    top->y = viewProj->m[7] - viewProj->m[5];
119044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    top->z = viewProj->m[11] - viewProj->m[9];
120044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    top->w = viewProj->m[15] - viewProj->m[13];
121e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
122044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    bottom->x = viewProj->m[3] + viewProj->m[1];
123044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    bottom->y = viewProj->m[7] + viewProj->m[5];
124044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    bottom->z = viewProj->m[11] + viewProj->m[9];
125044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    bottom->w = viewProj->m[15] + viewProj->m[13];
126e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
127044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    near->x = viewProj->m[3] + viewProj->m[2];
128044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    near->y = viewProj->m[7] + viewProj->m[6];
129044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    near->z = viewProj->m[11] + viewProj->m[10];
130044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    near->w = viewProj->m[15] + viewProj->m[14];
131e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
132044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    far->x = viewProj->m[3] - viewProj->m[2];
133044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    far->y = viewProj->m[7] - viewProj->m[6];
134044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    far->z = viewProj->m[11] - viewProj->m[10];
135044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    far->w = viewProj->m[15] - viewProj->m[14];
136e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
137044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    float len = length(left->xyz);
138044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    *left /= len;
139044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    len = length(right->xyz);
140044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    *right /= len;
141044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    len = length(top->xyz);
142044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    *top /= len;
143044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    len = length(bottom->xyz);
144044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    *bottom /= len;
145044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    len = length(near->xyz);
146044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    *near /= len;
147044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    len = length(far->xyz);
148044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    *far /= len;
149044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams}
150e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
151e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
152044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Checks if a sphere is withing the 6 frustum planes
153044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param sphere float4 representing the sphere
154044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param left plane
155044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param right plane
156044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param top plane
157044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param bottom plane
158044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param near plane
159044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param far plane
160e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
161044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams__inline__ static bool __attribute__((overloadable, always_inline))
162044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsIsSphereInFrustum(float4 *sphere,
163044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams                      float4 *left, float4 *right,
164044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams                      float4 *top, float4 *bottom,
165044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams                      float4 *near, float4 *far) {
166044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
167044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
168044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    if (distToCenter < -sphere->w) {
169044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams        return false;
170044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    }
171044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    distToCenter = dot(right->xyz, sphere->xyz) + right->w;
172044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    if (distToCenter < -sphere->w) {
173044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams        return false;
174044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    }
175044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    distToCenter = dot(top->xyz, sphere->xyz) + top->w;
176044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    if (distToCenter < -sphere->w) {
177044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams        return false;
178044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    }
179044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
180044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    if (distToCenter < -sphere->w) {
181044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams        return false;
182044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    }
183044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    distToCenter = dot(near->xyz, sphere->xyz) + near->w;
184044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    if (distToCenter < -sphere->w) {
185044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams        return false;
186044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    }
187044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    distToCenter = dot(far->xyz, sphere->xyz) + far->w;
188044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    if (distToCenter < -sphere->w) {
189044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams        return false;
190044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    }
191044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams    return true;
192044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams}
193044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
194044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
195e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
196044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Pack floating point (0-1) RGB values into a uchar4.  The alpha component is
197044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * set to 255 (1.0).
198e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
199044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param r
200044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param g
201044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param b
202e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
203044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return uchar4
204e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
20552132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float r, float g, float b);
206e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
207e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
208044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Pack floating point (0-1) RGBA values into a uchar4.
209e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
210044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param r
211044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param g
212044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param b
213044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param a
214e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
215044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return uchar4
216e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
21752132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float r, float g, float b, float a);
218044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
219e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
220044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Pack floating point (0-1) RGB values into a uchar4.  The alpha component is
221044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * set to 255 (1.0).
222e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
223044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param color
224e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
225044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return uchar4
226e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
22752132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float3 color);
228e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
229e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
230044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Pack floating point (0-1) RGBA values into a uchar4.
231e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
232044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param color
233e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
234044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return uchar4
235e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
23652132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float4 color);
237e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
238e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
239044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Unpack a uchar4 color to float4.  The resulting float range will be (0-1).
240e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
241044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param c
242e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
243044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return float4
244e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
24552132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME float4 __attribute__((const)) rsUnpackColor8888(uchar4 c);
246e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
24752132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v);
24852132475c338620cab62cff885792ebf0db5419fStephen Hines_RS_RUNTIME float4 __attribute__((const, overloadable)) rsYuvToRGBA_float4(uchar y, uchar u, uchar v);
2494b768a65bda13116ba2646abaf986094f8fe95b8Jason Sams
250e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
251c4cdf4586a0210a0e4b7b9bf38e8973b31d17ea1Jason Sams#endif
252