From 005887a93bf91aecd9b68b7bb6bcd74db6cfb9bb Mon Sep 17 00:00:00 2001 From: John Hoford Date: Thu, 4 Oct 2012 14:12:36 -0700 Subject: add vibrance fix a free in shadows bug:7234321 Change-Id: I52b1b952fcdc34c23464793621df60aa7e8e00b2 --- jni/Android.mk | 1 + jni/filters/shadows.c | 2 +- jni/filters/vibrance.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 jni/filters/vibrance.c (limited to 'jni') 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 +#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); +} -- cgit v1.2.3