OSDN Git Service

Added stub for applying geometry flip.
authorRuben Brunk <rubenbrunk@google.com>
Mon, 8 Oct 2012 20:48:46 +0000 (13:48 -0700)
committerRuben Brunk <rubenbrunk@google.com>
Mon, 8 Oct 2012 20:58:39 +0000 (13:58 -0700)
Bug: 7224232
Bug: 7218935
Change-Id: Iaeea6a94f4fea44a8046f09a0fce72fe32ed7cc0

jni/Android.mk
jni/filters/geometry.c [new file with mode: 0644]
src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java [new file with mode: 0644]
src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java
src/com/android/gallery3d/filtershow/presets/ImagePreset.java

index 935abeb..213663c 100644 (file)
@@ -25,15 +25,16 @@ LOCAL_LDFLAGS       := -llog -ljnigraphics
 LOCAL_SDK_VERSION := 9
 LOCAL_MODULE    := libjni_filtershow_filters
 LOCAL_SRC_FILES := filters/bw.c \
-                  filters/gradient.c \
-                  filters/saturated.c \
+                   filters/gradient.c \
+                   filters/saturated.c \
                    filters/exposure.c \
                    filters/contrast.c \
                    filters/hue.c \
                    filters/shadows.c \
                    filters/hsv.c \
                    filters/vibrance.c \
-                  filters/vignette.c
+                   filters/geometry.c \
+                   filters/vignette.c
 
 LOCAL_CFLAGS    += -ffast-math -O3 -funroll-loops
 LOCAL_ARM_MODE := arm
diff --git a/jni/filters/geometry.c b/jni/filters/geometry.c
new file mode 100644 (file)
index 0000000..f2f5b27
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * 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 "filters.h"
+
+void JNIFUNCF(ImageFilterGeometry, nativeApplyFilterFlip, jobject src, jint srcWidth, jint srcHeight, jobject dst, jint dstWidth, jint dstHeight, jint flip) {
+    char* destination = 0;
+    char* source = 0;
+    AndroidBitmap_lockPixels(env, src, (void**) &source);
+    AndroidBitmap_lockPixels(env, dst, (void**) &destination);
+    int i = 0;
+    for (; i < dstWidth * dstHeight * 4; i+=4) {
+        int r = source[RED];
+        int g = source[GREEN];
+        int b = source[BLUE];
+
+        destination[RED] = 255;
+        destination[GREEN] = g;
+        destination[BLUE] = b;
+    }
+    AndroidBitmap_unlockPixels(env, dst);
+    AndroidBitmap_unlockPixels(env, src);
+}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java
new file mode 100644 (file)
index 0000000..69a8f20
--- /dev/null
@@ -0,0 +1,44 @@
+
+package com.android.gallery3d.filtershow.filters;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+
+import com.android.gallery3d.filtershow.imageshow.GeometryMetadata;
+import com.android.gallery3d.filtershow.imageshow.GeometryMetadata.FLIP;
+
+public class ImageFilterGeometry extends ImageFilter {
+    private final Bitmap.Config mConfig = Bitmap.Config.ARGB_8888;
+    private GeometryMetadata mGeometry = null;
+
+    public ImageFilterGeometry() {
+        mName = "Geometry";
+    }
+
+    @Override
+    public ImageFilter clone() throws CloneNotSupportedException {
+        ImageFilterGeometry filter = (ImageFilterGeometry) super.clone();
+        return filter;
+    }
+
+    public void setGeometryMetadata(GeometryMetadata m){
+        mGeometry = m;
+    }
+
+    native protected void nativeApplyFilterFlip(Bitmap src, int srcWidth, int srcHeight,
+            Bitmap dst, int dstWidth, int dstHeight, int flip);
+
+    @Override
+    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+        if(mGeometry.getFlipType() == FLIP.NONE){
+            return bitmap;
+        }
+        Bitmap flipBitmap = bitmap.copy(mConfig, true);
+        nativeApplyFilterFlip(bitmap, bitmap.getWidth(), bitmap.getHeight(), flipBitmap,
+                flipBitmap.getWidth(), flipBitmap.getHeight(), 1);
+        return flipBitmap;
+    }
+
+}
index 1f16625..f3d64a5 100644 (file)
 
 package com.android.gallery3d.filtershow.imageshow;
 
+import android.graphics.Bitmap;
 import android.graphics.RectF;
 
+import com.android.gallery3d.filtershow.filters.ImageFilterGeometry;
+
 /**
  * This class holds metadata about an image's geometry. Specifically: rotation,
  * scaling, cropping, and image boundaries. It maintains the invariant that the
@@ -28,6 +31,7 @@ import android.graphics.RectF;
 public class GeometryMetadata {
     // Applied in order: rotate, crop, scale.
     // Do not scale saved image (presumably?).
+    private static final ImageFilterGeometry mImageFilter = new ImageFilterGeometry();
     private float mScaleFactor = 0;
     private float mRotation = 0;
     private float mStraightenRotation = 0;
@@ -47,6 +51,11 @@ public class GeometryMetadata {
         set(g);
     }
 
+    public Bitmap apply(Bitmap original, float scaleFactor, boolean highQuality){
+        mImageFilter.setGeometryMetadata(this);
+        return mImageFilter.apply(original, scaleFactor, highQuality);
+    }
+
     public GeometryMetadata(float scale, float rotation, float straighten, RectF cropBounds,
             RectF photoBounds, FLIP flipType) {
         mScaleFactor = scale;
index be08e70..830f3cb 100644 (file)
@@ -55,13 +55,6 @@ public class ImagePreset {
         mGeoData.set(source.mGeoData);
     }
 
-    private Bitmap applyGeometry(Bitmap original, float scaleFactor, boolean highQuality) {
-        Bitmap bitmap = original;
-
-        // TODO: put geometry filters
-        return bitmap;
-    }
-
     public boolean isFx() {
         return mIsFxPreset;
     }
@@ -143,7 +136,7 @@ public class ImagePreset {
 
     public Bitmap apply(Bitmap original) {
         // First we apply any transform -- 90 rotate, flip, straighten, crop
-        Bitmap bitmap = applyGeometry(original, mScaleFactor, mIsHighQuality);
+        Bitmap bitmap = mGeoData.apply(original, mScaleFactor, mIsHighQuality);
 
         // TODO -- apply borders separately
         ImageFilter borderFilter = null;