summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java42
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java39
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java38
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java73
4 files changed, 153 insertions, 39 deletions
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java
index 690add018..3390898c8 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java
@@ -36,14 +36,16 @@ import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.util.Log;
import android.widget.Toast;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.cache.BitmapCache;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils;
-import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils.GeometryHolder;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.FilterEnvironment;
import com.android.gallery3d.filtershow.pipeline.ImagePreset;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
@@ -82,23 +84,35 @@ public class ImageFilterDualCamFusion extends ImageFilter {
if(!point.equals(-1,-1)) {
Bitmap filteredBitmap = null;
+ boolean result = false;
+ int orientation = MasterImage.getImage().getOrientation();
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
int filteredW;
int filteredH;
if(quality == FilterEnvironment.QUALITY_FINAL) {
- Rect originalBounds = MasterImage.getImage().getOriginalBounds();
filteredW = originalBounds.width();
filteredH = originalBounds.height();
} else {
Bitmap originalBmp = MasterImage.getImage().getOriginalBitmapHighres();
filteredW = originalBmp.getWidth();
filteredH = originalBmp.getHeight();
+
+ // image is rotated
+ if (orientation == ImageLoader.ORI_ROTATE_90 ||
+ orientation == ImageLoader.ORI_ROTATE_270 ||
+ orientation == ImageLoader.ORI_TRANSPOSE ||
+ orientation == ImageLoader.ORI_TRANSVERSE) {
+ int tmp = filteredW;
+ filteredW = filteredH;
+ filteredH = tmp;
+ }
}
filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(filteredW, filteredH, BitmapCache.FILTERS);
filteredBitmap.setHasAlpha(true);
- boolean result = DualCameraNativeEngine.getInstance().getForegroundImg(point.x, point.y,
+ result = DualCameraNativeEngine.getInstance().getForegroundImg(point.x, point.y,
quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap);
if(result == false) {
@@ -116,8 +130,8 @@ public class ImageFilterDualCamFusion extends ImageFilter {
} else {
mPaint.reset();
+ mPaint.setAntiAlias(true);
if(quality == FilterEnvironment.QUALITY_FINAL) {
- mPaint.setAntiAlias(true);
mPaint.setFilterBitmap(true);
mPaint.setDither(true);
}
@@ -128,16 +142,24 @@ public class ImageFilterDualCamFusion extends ImageFilter {
ImagePreset preset = getEnvironment().getImagePreset();
int bmWidth = bitmap.getWidth();
int bmHeight = bitmap.getHeight();
-
- canvas.drawColor(0, PorterDuff.Mode.CLEAR);
+ GeometryHolder holder;
if(preset.getDoApplyGeometry()) {
- GeometryHolder holder = GeometryMathUtils.unpackGeometry(preset.getGeometryFilters());
- GeometryMathUtils.drawTransformedCropped(holder, canvas, filteredBitmap, bmWidth, bmHeight);
+ holder = GeometryMathUtils.unpackGeometry(preset.getGeometryFilters());
} else {
- canvas.drawBitmap(filteredBitmap, null,
- new Rect(0, 0,bmWidth, bmHeight), mPaint);
+ holder = new GeometryHolder();
}
+ RectF crop = new RectF();
+ Matrix m = GeometryMathUtils.getOriginalToScreen(holder, crop, true,
+ filteredW, filteredH, bmWidth, bmHeight);
+
+ canvas.drawColor(0, PorterDuff.Mode.CLEAR);
+
+ canvas.save();
+ canvas.clipRect(crop);
+ canvas.drawBitmap(filteredBitmap, m, mPaint);
+ canvas.restore();
+
MasterImage.getImage().getBitmapCache().cache(filteredBitmap);
}
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java
index 25faefc34..d9ae16967 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java
@@ -35,14 +35,16 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.util.Log;
import android.widget.Toast;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.cache.BitmapCache;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils;
-import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils.GeometryHolder;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.FilterEnvironment;
import com.android.gallery3d.filtershow.pipeline.ImagePreset;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
@@ -77,21 +79,31 @@ public class ImageFilterDualCamSketch extends ImageFilter {
if(!point.equals(-1,-1)) {
Bitmap filteredBitmap = null;
boolean result = false;
+ int orientation = MasterImage.getImage().getOrientation();
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
int filteredW;
int filteredH;
if(quality == FilterEnvironment.QUALITY_FINAL) {
- Rect originalBounds = MasterImage.getImage().getOriginalBounds();
filteredW = originalBounds.width();
filteredH = originalBounds.height();
} else {
Bitmap originalBmp = MasterImage.getImage().getOriginalBitmapHighres();
filteredW = originalBmp.getWidth();
filteredH = originalBmp.getHeight();
+
+ // image is rotated
+ if (orientation == ImageLoader.ORI_ROTATE_90 ||
+ orientation == ImageLoader.ORI_ROTATE_270 ||
+ orientation == ImageLoader.ORI_TRANSPOSE ||
+ orientation == ImageLoader.ORI_TRANSVERSE) {
+ int tmp = filteredW;
+ filteredW = filteredH;
+ filteredH = tmp;
+ }
}
filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(filteredW, filteredH, BitmapCache.FILTERS);
-
result = DualCameraNativeEngine.getInstance().applySketch(point.x, point.y,
quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap);
@@ -109,9 +121,9 @@ public class ImageFilterDualCamSketch extends ImageFilter {
return bitmap;
} else {
+ mPaint.reset();
+ mPaint.setAntiAlias(true);
if(quality == FilterEnvironment.QUALITY_FINAL) {
- mPaint.reset();
- mPaint.setAntiAlias(true);
mPaint.setFilterBitmap(true);
mPaint.setDither(true);
}
@@ -120,15 +132,22 @@ public class ImageFilterDualCamSketch extends ImageFilter {
ImagePreset preset = getEnvironment().getImagePreset();
int bmWidth = bitmap.getWidth();
int bmHeight = bitmap.getHeight();
-
+ GeometryHolder holder;
if(preset.getDoApplyGeometry()) {
- GeometryHolder holder = GeometryMathUtils.unpackGeometry(preset.getGeometryFilters());
- GeometryMathUtils.drawTransformedCropped(holder, canvas, filteredBitmap, bmWidth, bmHeight);
+ holder = GeometryMathUtils.unpackGeometry(preset.getGeometryFilters());
} else {
- canvas.drawBitmap(filteredBitmap, null,
- new Rect(0, 0,bmWidth, bmHeight), mPaint);
+ holder = new GeometryHolder();
}
+ RectF crop = new RectF();
+ Matrix m = GeometryMathUtils.getOriginalToScreen(holder, crop, true,
+ filteredW, filteredH, bmWidth, bmHeight);
+
+ canvas.save();
+ canvas.clipRect(crop);
+ canvas.drawBitmap(filteredBitmap, m, mPaint);
+ canvas.restore();
+
MasterImage.getImage().getBitmapCache().cache(filteredBitmap);
}
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java
index 0082ec388..c8206d511 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java
@@ -35,14 +35,16 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.util.Log;
import android.widget.Toast;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.cache.BitmapCache;
+import com.android.gallery3d.filtershow.cache.ImageLoader;
import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils;
-import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.imageshow.GeometryMathUtils.GeometryHolder;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.FilterEnvironment;
import com.android.gallery3d.filtershow.pipeline.ImagePreset;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
@@ -81,17 +83,28 @@ public class ImageFilterDualCamera extends ImageFilter {
float intensity = (float)value / (float)maxValue;
Bitmap filteredBitmap = null;
boolean result = false;
+ int orientation = MasterImage.getImage().getOrientation();
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
int filteredW;
int filteredH;
if(quality == FilterEnvironment.QUALITY_FINAL) {
- Rect originalBounds = MasterImage.getImage().getOriginalBounds();
filteredW = originalBounds.width();
filteredH = originalBounds.height();
} else {
Bitmap originalBmp = MasterImage.getImage().getOriginalBitmapHighres();
filteredW = originalBmp.getWidth();
filteredH = originalBmp.getHeight();
+
+ // image is rotated
+ if (orientation == ImageLoader.ORI_ROTATE_90 ||
+ orientation == ImageLoader.ORI_ROTATE_270 ||
+ orientation == ImageLoader.ORI_TRANSPOSE ||
+ orientation == ImageLoader.ORI_TRANSVERSE) {
+ int tmp = filteredW;
+ filteredW = filteredH;
+ filteredH = tmp;
+ }
}
filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(filteredW, filteredH, BitmapCache.FILTERS);
@@ -122,9 +135,9 @@ public class ImageFilterDualCamera extends ImageFilter {
return bitmap;
} else {
+ mPaint.reset();
+ mPaint.setAntiAlias(true);
if(quality == FilterEnvironment.QUALITY_FINAL) {
- mPaint.reset();
- mPaint.setAntiAlias(true);
mPaint.setFilterBitmap(true);
mPaint.setDither(true);
}
@@ -133,15 +146,22 @@ public class ImageFilterDualCamera extends ImageFilter {
ImagePreset preset = getEnvironment().getImagePreset();
int bmWidth = bitmap.getWidth();
int bmHeight = bitmap.getHeight();
-
+ GeometryHolder holder;
if(preset.getDoApplyGeometry()) {
- GeometryHolder holder = GeometryMathUtils.unpackGeometry(preset.getGeometryFilters());
- GeometryMathUtils.drawTransformedCropped(holder, canvas, filteredBitmap, bmWidth, bmHeight);
+ holder = GeometryMathUtils.unpackGeometry(preset.getGeometryFilters());
} else {
- canvas.drawBitmap(filteredBitmap, null,
- new Rect(0, 0,bmWidth, bmHeight), mPaint);
+ holder = new GeometryHolder();
}
+ RectF crop = new RectF();
+ Matrix m = GeometryMathUtils.getOriginalToScreen(holder, crop, true,
+ filteredW, filteredH, bmWidth, bmHeight);
+
+ canvas.save();
+ canvas.clipRect(crop);
+ canvas.drawBitmap(filteredBitmap, m, mPaint);
+ canvas.restore();
+
MasterImage.getImage().getBitmapCache().cache(filteredBitmap);
}
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java
index 958170c78..f236675df 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMathUtils.java
@@ -370,16 +370,41 @@ public final class GeometryMathUtils {
}
public static Matrix getOriginalToScreen(GeometryHolder holder, boolean rotate,
- float originalWidth,
- float originalHeight, float viewWidth, float viewHeight) {
+ float originalWidth, float originalHeight, float viewWidth, float viewHeight) {
+ return getOriginalToScreen(holder, null, rotate, originalWidth, originalHeight, viewWidth, viewHeight);
+ }
+
+ public static Matrix getOriginalToScreen(GeometryHolder holder, RectF outCrop,
+ boolean rotate, float originalWidth, float originalHeight,
+ float viewWidth, float viewHeight) {
+ RectF crop = new RectF();
+ Matrix m;
int orientation = MasterImage.getImage().getZoomOrientation();
- int rotation = getRotationForOrientation(orientation);
- Rotation prev = holder.rotation;
- rotation = (rotation + prev.value()) % 360;
- holder.rotation = Rotation.fromValue(rotation);
- Matrix m = getCropSelectionToScreenMatrix(null, holder, (int) originalWidth,
- (int) originalHeight, (int) viewWidth, (int) viewHeight);
- holder.rotation = prev;
+
+ if (orientation == ImageLoader.ORI_ROTATE_90 ||
+ orientation == ImageLoader.ORI_ROTATE_270 ||
+ orientation == ImageLoader.ORI_TRANSPOSE ||
+ orientation == ImageLoader.ORI_TRANSVERSE) {
+
+ crop = getTrueCropRect(holder, (int)originalHeight, (int)originalWidth);
+ } else {
+ crop = getTrueCropRect(holder, (int)originalWidth, (int)originalHeight);
+ }
+
+ float scale = scale(crop.width(), crop.height(), viewWidth, viewHeight);
+
+ m = getFullGeometryMatrix(holder, (int)originalWidth, (int)originalHeight);
+ if(orientation != ImageLoader.ORI_NORMAL) {
+ addOrientationToMatrix(m, (int)originalWidth, (int)originalHeight, orientation);
+ }
+
+ m.postScale(scale, scale);
+ GeometryMathUtils.scaleRect(crop, scale);
+ m.postTranslate(viewWidth / 2f - crop.centerX(), viewHeight / 2f - crop.centerY());
+ crop.offset(viewWidth / 2f - crop.centerX(), viewHeight / 2f - crop.centerY());
+ if(outCrop != null) {
+ outCrop.set(crop);
+ }
return m;
}
@@ -426,7 +451,7 @@ public final class GeometryMathUtils {
}
// Gives matrix for rotated, straightened, mirrored bitmap centered at 0,0.
- private static Matrix getFullGeometryMatrix(GeometryHolder holder, int bitmapWidth,
+ public static Matrix getFullGeometryMatrix(GeometryHolder holder, int bitmapWidth,
int bitmapHeight) {
float centerX = bitmapWidth / 2f;
float centerY = bitmapHeight / 2f;
@@ -490,4 +515,32 @@ public final class GeometryMathUtils {
return getCropSelectionToScreenMatrix(outCrop, holder, bitmapWidth, bitmapHeight,
viewWidth, viewHeight);
}
+
+ public static void addOrientationToMatrix(Matrix matrix, int w, int h, int orientation) {
+ switch (orientation) {
+ case ImageLoader.ORI_ROTATE_90:
+ matrix.preRotate(90, w/2, h/2);
+ break;
+ case ImageLoader.ORI_ROTATE_180:
+ matrix.preRotate(180, w/2, h/2);
+ break;
+ case ImageLoader.ORI_ROTATE_270:
+ matrix.preRotate(270, w/2, h/2);
+ break;
+ case ImageLoader.ORI_FLIP_HOR:
+ matrix.preScale(-1, 1);
+ break;
+ case ImageLoader.ORI_FLIP_VERT:
+ matrix.preScale(1, -1);
+ break;
+ case ImageLoader.ORI_TRANSPOSE:
+ matrix.preScale(1, -1);
+ matrix.preRotate(90, w / 2f, h / 2f);
+ break;
+ case ImageLoader.ORI_TRANSVERSE:
+ matrix.preScale(1, -1);
+ matrix.preRotate(270, w / 2f, h / 2f);
+ break;
+ }
+ }
}