diff options
-rw-r--r-- | jni/Android.mk | 1 | ||||
-rw-r--r-- | jni/filters/shadows.c | 2 | ||||
-rw-r--r-- | jni/filters/vibrance.c | 62 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/FilterShowActivity.java | 12 | ||||
-rw-r--r-- | src/com/android/gallery3d/filtershow/filters/ImageFilterVibrance.java | 22 |
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); + } +} |