blob: bd4ae4eca3b7a3f80934b05793ecfd7dcfc00578 [file] [log] [blame]
Jason Sams8f8a5722010-07-15 17:11:13 -07001#pragma version(1)
2
Jason Sams8f8a5722010-07-15 17:11:13 -07003#include "ip.rsh"
4
Jason Sams43c31422010-08-16 12:29:23 -07005static float inBlack;
6static float outBlack;
7static float inWhite;
8static float outWhite;
9static float3 gamma;
10static float saturation;
11
12static float inWMinInB;
13static float outWMinOutB;
14static float overInWMinInB;
15static rs_matrix3x3 colorMat;
16
Jason Sams43c31422010-08-16 12:29:23 -070017void setLevels(float iBlk, float oBlk, float iWht, float oWht) {
18 inBlack = iBlk;
19 outBlack = oBlk;
20 inWhite = iWht;
21 outWhite = oWht;
22
23 inWMinInB = inWhite - inBlack;
24 outWMinOutB = outWhite - outBlack;
25 overInWMinInB = 1.f / inWMinInB;
26}
27
28void setSaturation(float sat) {
29 saturation = sat;
30
31 // Saturation
32 // Linear weights
33 //float rWeight = 0.3086f;
34 //float gWeight = 0.6094f;
35 //float bWeight = 0.0820f;
36
37 // Gamma 2.2 weights (we haven't converted our image to linear space yet for perf reasons)
38 float rWeight = 0.299f;
39 float gWeight = 0.587f;
40 float bWeight = 0.114f;
41
42 float oneMinusS = 1.0f - saturation;
43 rsMatrixSet(&colorMat, 0, 0, oneMinusS * rWeight + saturation);
44 rsMatrixSet(&colorMat, 0, 1, oneMinusS * rWeight);
45 rsMatrixSet(&colorMat, 0, 2, oneMinusS * rWeight);
46 rsMatrixSet(&colorMat, 1, 0, oneMinusS * gWeight);
47 rsMatrixSet(&colorMat, 1, 1, oneMinusS * gWeight + saturation);
48 rsMatrixSet(&colorMat, 1, 2, oneMinusS * gWeight);
49 rsMatrixSet(&colorMat, 2, 0, oneMinusS * bWeight);
50 rsMatrixSet(&colorMat, 2, 1, oneMinusS * bWeight);
51 rsMatrixSet(&colorMat, 2, 2, oneMinusS * bWeight + saturation);
52}
53
54void setGamma(float g) {
55 gamma = (float3)g;
56}
57
Shih-wei Liao16095fc2011-01-12 01:13:01 -080058//sliao
Shih-wei Liao0e7be132011-01-16 15:38:13 -080059extern uchar3 __attribute__((overloadable)) convert2uchar3(float3 xyz);
Shih-wei Liao16095fc2011-01-12 01:13:01 -080060
Jason Sams8f8a5722010-07-15 17:11:13 -070061void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) {
62 uchar4 *output = (uchar4 *)v_out;
Jason Sams8f8a5722010-07-15 17:11:13 -070063 const FilterStruct *fs = (const FilterStruct *)usrData;
Jason Sams43c31422010-08-16 12:29:23 -070064 const float4 *input = (const float4 *)rsGetElementAt(fs->ain, x, 0);
Jason Sams8f8a5722010-07-15 17:11:13 -070065
Jason Samsf46f25a2010-07-22 14:44:04 -070066 float3 blurredPixel = 0;
Jason Samsf46f25a2010-07-22 14:44:04 -070067 const float *gPtr = fs->gaussian;
68 if ((y > fs->radius) && (y < (fs->height - fs->radius))) {
Jason Sams43c31422010-08-16 12:29:23 -070069 const float4 *i = input + ((y - fs->radius) * fs->width);
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080070 for (int r = -fs->radius; r <= fs->radius; r ++) {
Jason Sams43c31422010-08-16 12:29:23 -070071 blurredPixel += i->xyz * gPtr[0];
Jason Samsf46f25a2010-07-22 14:44:04 -070072 gPtr++;
73 i += fs->width;
Jason Sams8f8a5722010-07-15 17:11:13 -070074 }
Jason Samsf46f25a2010-07-22 14:44:04 -070075 } else {
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080076 for (int r = -fs->radius; r <= fs->radius; r ++) {
Jason Sams05716aa2010-08-09 12:09:00 -070077 int validH = rsClamp(y + r, (uint)0, (uint)(fs->height - 1));
Jason Sams43c31422010-08-16 12:29:23 -070078 const float4 *i = input + validH * fs->width;
79 blurredPixel += i->xyz * gPtr[0];
Jason Samsf46f25a2010-07-22 14:44:04 -070080 gPtr++;
Jason Sams8f8a5722010-07-15 17:11:13 -070081 }
Jason Sams8f8a5722010-07-15 17:11:13 -070082 }
Jason Sams43c31422010-08-16 12:29:23 -070083
84 float3 temp = rsMatrixMultiply(&colorMat, blurredPixel);
85 temp = (clamp(temp, 0.f, 255.f) - inBlack) * overInWMinInB;
86 if (gamma.x != 1.0f)
87 temp = pow(temp, (float3)gamma);
88 temp = clamp(temp * outWMinOutB + outBlack, 0.f, 255.f);
89
Shih-wei Liao2aad5622011-01-17 01:17:39 -080090 output->xyz = convert_uchar3(temp);
Jason Sams43c31422010-08-16 12:29:23 -070091 //output->w = input->w;
Jason Sams8f8a5722010-07-15 17:11:13 -070092}
93