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)