8e208e8a8f7da856f56d1256a502a64090c32f6d
[blender.git] / intern / cycles / kernel / shaders / node_rgb_curves.osl
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 #include "stdosl.h"
18 #include "oslutil.h"
19
20 float ramp_lookup(color ramp[], float at, int component)
21 {
22         int table_size = arraylength(ramp);
23
24         if (at < 0.0 || at > 1.0) {
25                 float t0, dy;
26                 if (at < 0.0) {
27                         t0 = ramp[0][component];
28                         dy = t0 - ramp[1][component];
29                         at = -at;
30                 }
31                 else {
32                         t0 = ramp[table_size - 1][component];
33                         dy = t0 - ramp[table_size - 2][component];
34                         at = at - 1.0;
35                 }
36                 return t0 + dy * at * (table_size - 1);
37         }
38
39         float f = clamp(at, 0.0, 1.0) * (table_size - 1);
40
41         /* clamp int as well in case of NaN */
42         int i = (int)f;
43         if (i < 0) i = 0;
44         if (i >= table_size) i = table_size - 1;
45         float t = f - (float)i;
46
47         float result = ramp[i][component];
48
49         if (t > 0.0)
50                 result = (1.0 - t) * result + t * ramp[i + 1][component];
51         
52         return result;
53 }
54
55 shader node_rgb_curves(
56         color ramp[] = {0.0},
57         float min_x = 0.0,
58         float max_x = 1.0,
59
60         color ColorIn = 0.0,
61         float Fac = 0.0,
62         output color ColorOut = 0.0)
63 {
64         color c = (ColorIn - color(min_x, min_x, min_x)) / (max_x - min_x);
65
66         ColorOut[0] = ramp_lookup(ramp, c[0], 0);
67         ColorOut[1] = ramp_lookup(ramp, c[1], 1);
68         ColorOut[2] = ramp_lookup(ramp, c[2], 2);
69
70         ColorOut = mix(ColorIn, ColorOut, Fac);
71 }
72