OSDN Git Service

am 2f7e2992: am 0f327c32: am c5590eb1: Improves Curves & Crop UI
[android-x86/packages-apps-Gallery2.git] / jni / filters / vibrance.c
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
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 <math.h>
18 #include "filters.h"
19
20 void JNIFUNCF(ImageFilterVibrance, nativeApplyFilter, jobject bitmap, jint width, jint height,  jfloat vibrance)
21 {
22     char* destination = 0;
23     AndroidBitmap_lockPixels(env, bitmap, (void**) &destination);
24     int i;
25     int len = width * height * 4;
26     float Rf = 0.2999f;
27     float Gf = 0.587f;
28     float Bf = 0.114f;
29     float Vib = vibrance/100.f;
30     float S  = Vib+1;
31     float MS = 1.0f - S;
32     float Rt = Rf * MS;
33     float Gt = Gf * MS;
34     float Bt = Bf * MS;
35     float R, G, B;
36     for (i = 0; i < len; i+=4)
37     {
38         int r = destination[RED];
39         int g = destination[GREEN];
40         int b = destination[BLUE];
41         float red = (r-MAX(g, b))/256.f;
42         float sx = (float)(Vib/(1+exp(-red*3)));
43         S = sx+1;
44         MS = 1.0f - S;
45         Rt = Rf * MS;
46         Gt = Gf * MS;
47         Bt = Bf * MS;
48         int t = (r + g) / 2;
49         R = r;
50         G = g;
51         B = b;
52
53         float Rc = R * (Rt + S) + G * Gt + B * Bt;
54         float Gc = R * Rt + G * (Gt + S) + B * Bt;
55         float Bc = R * Rt + G * Gt + B * (Bt + S);
56
57         destination[RED] = CLAMP(Rc);
58         destination[GREEN] = CLAMP(Gc);
59         destination[BLUE] = CLAMP(Bc);
60     }
61     AndroidBitmap_unlockPixels(env, bitmap);
62 }