ClangFormat: apply to source, most of intern
[blender.git] / intern / cycles / kernel / svm / svm_ramp_util.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __SVM_RAMP_UTIL_H__
18 #define __SVM_RAMP_UTIL_H__
19
20 CCL_NAMESPACE_BEGIN
21
22 /* NOTE: svm_ramp.h, svm_ramp_util.h and node_ramp_util.h must stay consistent */
23
24 ccl_device_inline float3
25 rgb_ramp_lookup(const float3 *ramp, float f, bool interpolate, bool extrapolate, int table_size)
26 {
27   if ((f < 0.0f || f > 1.0f) && extrapolate) {
28     float3 t0, dy;
29     if (f < 0.0f) {
30       t0 = ramp[0];
31       dy = t0 - ramp[1], f = -f;
32     }
33     else {
34       t0 = ramp[table_size - 1];
35       dy = t0 - ramp[table_size - 2];
36       f = f - 1.0f;
37     }
38     return t0 + dy * f * (table_size - 1);
39   }
40
41   f = clamp(f, 0.0f, 1.0f) * (table_size - 1);
42
43   /* clamp int as well in case of NaN */
44   int i = clamp(float_to_int(f), 0, table_size - 1);
45   float t = f - (float)i;
46
47   float3 result = ramp[i];
48
49   if (interpolate && t > 0.0f) {
50     result = (1.0f - t) * result + t * ramp[i + 1];
51   }
52
53   return result;
54 }
55
56 ccl_device float float_ramp_lookup(
57     const float *ramp, float f, bool interpolate, bool extrapolate, int table_size)
58 {
59   if ((f < 0.0f || f > 1.0f) && extrapolate) {
60     float t0, dy;
61     if (f < 0.0f) {
62       t0 = ramp[0];
63       dy = t0 - ramp[1], f = -f;
64     }
65     else {
66       t0 = ramp[table_size - 1];
67       dy = t0 - ramp[table_size - 2];
68       f = f - 1.0f;
69     }
70     return t0 + dy * f * (table_size - 1);
71   }
72
73   f = clamp(f, 0.0f, 1.0f) * (table_size - 1);
74
75   /* clamp int as well in case of NaN */
76   int i = clamp(float_to_int(f), 0, table_size - 1);
77   float t = f - (float)i;
78
79   float result = ramp[i];
80
81   if (interpolate && t > 0.0f) {
82     result = (1.0f - t) * result + t * ramp[i + 1];
83   }
84
85   return result;
86 }
87
88 CCL_NAMESPACE_END
89
90 #endif /* __SVM_RAMP_UTIL_H__ */