summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jni/Android.mk1
-rw-r--r--jni/filters/shadows.c2
-rw-r--r--jni/filters/vibrance.c62
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java12
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterVibrance.java22
5 files changed, 92 insertions, 7 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);
+}
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index 389973e50..d777b9f8b 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -804,14 +804,14 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
- ImageFilter filter = preset.getFilter("Shadows");
+ ImageFilter filter = preset.getFilter("Vibrance");
if (filter == null) {
- ImageFilterShadows contrast = new ImageFilterShadows();
+ ImageFilterVibrance contrast = new ImageFilterVibrance();
ImagePreset copy = new ImagePreset(preset);
copy.add(contrast);
copy.setHistoryName(contrast.getName());
copy.setIsFx(false);
- filter = copy.getFilter("Shadows");
+ filter = copy.getFilter("Vibrance");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
@@ -856,14 +856,14 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mImageShow.setVisibility(View.VISIBLE);
mImageShow.setShowControls(true);
ImagePreset preset = mImageShow.getImagePreset();
- ImageFilter filter = preset.getFilter("Hue");
+ ImageFilter filter = preset.getFilter("Shadows");
if (filter == null) {
- ImageFilterHue contrast = new ImageFilterHue();
+ ImageFilterShadows contrast = new ImageFilterShadows();
ImagePreset copy = new ImagePreset(preset);
copy.add(contrast);
copy.setHistoryName(contrast.getName());
copy.setIsFx(false);
- filter = copy.getFilter("Hue");
+ filter = copy.getFilter("Shadows");
mImageShow.setImagePreset(copy);
}
mImageShow.setCurrentFilter(filter);
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterVibrance.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterVibrance.java
new file mode 100644
index 000000000..fd437ee8a
--- /dev/null
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterVibrance.java
@@ -0,0 +1,22 @@
+
+package com.android.gallery3d.filtershow.filters;
+
+import android.graphics.Bitmap;
+
+public class ImageFilterVibrance extends ImageFilter {
+
+ public ImageFilterVibrance() {
+ mName = "Vibrance";
+ }
+
+ native protected void nativeApplyFilter(Bitmap bitmap, int w, int h, float bright);
+
+ @Override
+ public void apply(Bitmap bitmap) {
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ int p = mParameter;
+ float value = p;
+ nativeApplyFilter(bitmap, w, h, value);
+ }
+}