summaryrefslogtreecommitdiffstats
path: root/jni/filters/vibrance.c
diff options
context:
space:
mode:
authorJohn Hoford <hoford@google.com>2012-10-04 21:12:36 (GMT)
committerJohn Hoford <hoford@google.com>2012-10-05 00:32:01 (GMT)
commit005887a93bf91aecd9b68b7bb6bcd74db6cfb9bb (patch)
tree30f84687798a577dee4f8c775dd38bfcc25fd76d /jni/filters/vibrance.c
parent7c46d38c4a1df9712f808260ec56995cb77aa4a2 (diff)
downloadandroid_packages_apps_Snap-005887a93bf91aecd9b68b7bb6bcd74db6cfb9bb.zip
android_packages_apps_Snap-005887a93bf91aecd9b68b7bb6bcd74db6cfb9bb.tar.gz
android_packages_apps_Snap-005887a93bf91aecd9b68b7bb6bcd74db6cfb9bb.tar.bz2
add vibrance fix a free in shadows
bug:7234321 Change-Id: I52b1b952fcdc34c23464793621df60aa7e8e00b2
Diffstat (limited to 'jni/filters/vibrance.c')
-rw-r--r--jni/filters/vibrance.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/jni/filters/vibrance.c b/jni/filters/vibrance.c
new file mode 100644
index 0000000..cb5c536
--- /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);
+}