vibrance.rs revision 572a5031a5d8602db0bec0b253428a034bd4dd59
103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)/*
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) *
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * you may not use this file except in compliance with the License.
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * You may obtain a copy of the License at
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) *
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) *
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * See the License for the specific language governing permissions and
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) * limitations under the License.
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) */
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ip.rsh"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)float vibrance = 0.f;
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const float Rf = 0.2999f;
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const float Gf = 0.587f;
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const float Bf = 0.114f;
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static float S  = 0.f;
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static float MS = 0.f;
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static float Rt = 0.f;
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static float Gt = 0.f;
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static float Bt = 0.f;
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static float Vib = 0.f;
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void vibranceKernel(const uchar4 *in, uchar4 *out) {
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    float R, G, B;
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int r = in->r;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int g = in->g;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int b = in->b;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    float red = (r-max(g, b))/256.f;
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    float sx = (float)(Vib/(1+native_exp(-red*3)));
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    S = sx+1;
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    MS = 1.0f - S;
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Rt = Rf * MS;
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Gt = Gf * MS;
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Bt = Bf * MS;
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int t = (r + g) / 2;
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    R = r;
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    G = g;
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    B = b;
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    float Rc = R * (Rt + S) + G * Gt + B * Bt;
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    float Gc = R * Rt + G * (Gt + S) + B * Bt;
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    float Bc = R * Rt + G * Gt + B * (Bt + S);
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    out->r = rsClamp(Rc, 0, 255);
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    out->g = rsClamp(Gc, 0, 255);
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    out->b = rsClamp(Bc, 0, 255);
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void prepareVibrance() {
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Vib = vibrance/100.f;
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    S  = Vib + 1;
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    MS = 1.0f - S;
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Rt = Rf * MS;
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Gt = Gf * MS;
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Bt = Bf * MS;
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)