diff options
author | John Hoford <hoford@google.com> | 2012-10-04 14:12:36 -0700 |
---|---|---|
committer | John Hoford <hoford@google.com> | 2012-10-04 17:32:01 -0700 |
commit | b559b2dd6637660ddbbdbae79a742c9f0fb1180b (patch) | |
tree | d0dbfbb1f5eb358b74cc99a79db20234cae22619 /jni | |
parent | 5448bf8095483574649afcc2add7f153670c7450 (diff) | |
download | android_packages_apps_Gallery2-b559b2dd6637660ddbbdbae79a742c9f0fb1180b.tar.gz android_packages_apps_Gallery2-b559b2dd6637660ddbbdbae79a742c9f0fb1180b.tar.bz2 android_packages_apps_Gallery2-b559b2dd6637660ddbbdbae79a742c9f0fb1180b.zip |
add vibrance fix a free in shadows
bug:7234321
Change-Id: I52b1b952fcdc34c23464793621df60aa7e8e00b2
Diffstat (limited to 'jni')
-rw-r--r-- | jni/Android.mk | 1 | ||||
-rw-r--r-- | jni/filters/shadows.c | 2 | ||||
-rw-r--r-- | jni/filters/vibrance.c | 62 |
3 files changed, 64 insertions, 1 deletions
diff --git a/jni/Android.mk b/jni/Android.mk index f6c3c81d1..935abebc8 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -32,6 +32,7 @@ LOCAL_SRC_FILES := filters/bw.c \ filters/hue.c \ filters/shadows.c \ filters/hsv.c \ + filters/vibrance.c \ filters/vignette.c LOCAL_CFLAGS += -ffast-math -O3 -funroll-loops diff --git a/jni/filters/shadows.c b/jni/filters/shadows.c index da3e33cf9..f812b93f8 100644 --- a/jni/filters/shadows.c +++ b/jni/filters/shadows.c @@ -34,6 +34,6 @@ } (*env)->ReleaseShortArrayElements(env, vlut, lut, 0); - free(lut); + free(hsv); AndroidBitmap_unlockPixels(env, bitmap); } diff --git a/jni/filters/vibrance.c b/jni/filters/vibrance.c new file mode 100644 index 000000000..cb5c536e5 --- /dev/null +++ b/jni/filters/vibrance.c @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <math.h> +#include "filters.h" + +void JNIFUNCF(ImageFilterVibrance, nativeApplyFilter, jobject bitmap, jint width, jint height, jfloat vibrance) +{ + char* destination = 0; + AndroidBitmap_lockPixels(env, bitmap, (void**) &destination); + int i; + int len = width * height * 4; + float Rf = 0.2999f; + float Gf = 0.587f; + float Bf = 0.114f; + float Vib = vibrance/100.f; + float S = Vib+1; + float MS = 1.0f - S; + float Rt = Rf * MS; + float Gt = Gf * MS; + float Bt = Bf * MS; + float R, G, B; + for (i = 0; i < len; i+=4) + { + int r = destination[RED]; + int g = destination[GREEN]; + int b = destination[BLUE]; + float red = (r-MAX(g, b))/256.f; + float sx = (float)(Vib/(1+exp(-red*3))); + S = sx+1; + MS = 1.0f - S; + Rt = Rf * MS; + Gt = Gf * MS; + Bt = Bf * MS; + int t = (r + g) / 2; + R = r; + G = g; + B = b; + + float Rc = R * (Rt + S) + G * Gt + B * Bt; + float Gc = R * Rt + G * (Gt + S) + B * Bt; + float Bc = R * Rt + G * Gt + B * (Bt + S); + + destination[RED] = CLAMP(Rc); + destination[GREEN] = CLAMP(Gc); + destination[BLUE] = CLAMP(Bc); + } + AndroidBitmap_unlockPixels(env, bitmap); +} |