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
JNIFUNCF(ImageFilterVibrance,nativeApplyFilter,jobject bitmap,jint width,jint height,jfloat vibrance)20 void JNIFUNCF(ImageFilterVibrance, nativeApplyFilter, jobject bitmap, jint width, jint height, jfloat vibrance)
21 {
22 uint8_t* 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 R = r;
49 G = g;
50 B = b;
51
52 float Rc = R * (Rt + S) + G * Gt + B * Bt;
53 float Gc = R * Rt + G * (Gt + S) + B * Bt;
54 float Bc = R * Rt + G * Gt + B * (Bt + S);
55
56 destination[RED] = CLAMP(Rc);
57 destination[GREEN] = CLAMP(Gc);
58 destination[BLUE] = CLAMP(Bc);
59 }
60 AndroidBitmap_unlockPixels(env, bitmap);
61 }
62