summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/tools/SaveImage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow/tools/SaveImage.java')
-rw-r--r--src/com/android/gallery3d/filtershow/tools/SaveImage.java118
1 files changed, 79 insertions, 39 deletions
diff --git a/src/com/android/gallery3d/filtershow/tools/SaveImage.java b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
index d4cc3b02a..f04466f1b 100644
--- a/src/com/android/gallery3d/filtershow/tools/SaveImage.java
+++ b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
@@ -16,12 +16,26 @@
package com.android.gallery3d.filtershow.tools;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.sql.Date;
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
@@ -35,6 +49,7 @@ import com.android.gallery3d.common.Utils;
import com.android.gallery3d.exif.ExifInterface;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.cache.ImageLoader;
+import com.android.gallery3d.filtershow.filters.FilterDualCamFusionRepresentation;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.filters.FiltersManager;
import com.android.gallery3d.filtershow.imageshow.MasterImage;
@@ -43,16 +58,6 @@ import com.android.gallery3d.filtershow.pipeline.ImagePreset;
import com.android.gallery3d.filtershow.pipeline.ProcessingService;
import com.android.gallery3d.util.XmpUtilHelper;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.TimeZone;
-
/**
* Handles saving edited photo
*/
@@ -179,12 +184,12 @@ public class SaveImage {
querySourceFromContentResolver(contentResolver,
srcContentUri, queryProjection,
new ContentResolverQueryCallback() {
- @Override
- public void onCursorResult(Cursor cursor) {
- fullPath[0] = cursor.getString(0);
- }
- }
- );
+ @Override
+ public void onCursorResult(Cursor cursor) {
+ fullPath[0] = cursor.getString(0);
+ }
+ });
+
if (fullPath[0] != null) {
// Construct the auxiliary directory given the source file's path.
// Then select and delete all the files starting with the same name
@@ -415,6 +420,38 @@ public class SaveImage {
"Saving");
bitmap = pipeline.renderFinalImage(bitmap, preset);
+
+ // Check for Fusion
+ FilterDualCamFusionRepresentation fusionRep = (FilterDualCamFusionRepresentation) preset.getFilterWithSerializationName(
+ FilterDualCamFusionRepresentation.SERIALIZATION_NAME);
+
+ if(fusionRep != null && fusionRep.hasUnderlay()) {
+ // fusion. decode underlay image and get dest rect
+ Uri underLayUri = Uri.parse(fusionRep.getUnderlay());
+ Bitmap underlay = ImageLoader.loadBitmapWithBackouts(mContext, underLayUri, sampleSize);
+ RectF destRect = new RectF();
+ Rect imageBounds = MasterImage.getImage().getImageBounds();
+ Rect underlayBounds = MasterImage.getImage().getFusionBounds();
+ float underlayScaleFactor = (float)underlay.getWidth() / (float)underlayBounds.width();
+
+ destRect.left = (imageBounds.left - underlayBounds.left) * underlayScaleFactor;
+ destRect.right = (imageBounds.right - underlayBounds.left) * underlayScaleFactor;
+ destRect.top = (imageBounds.top - underlayBounds.top) * underlayScaleFactor;
+ destRect.bottom = (imageBounds.bottom - underlayBounds.top) * underlayScaleFactor;
+
+ Canvas canvas = new Canvas(underlay);
+ Paint paint = new Paint();
+ paint.reset();
+ paint.setAntiAlias(true);
+ paint.setFilterBitmap(true);
+ paint.setDither(true);
+
+ canvas.drawBitmap(bitmap, null, destRect, paint);
+
+ bitmap.recycle();
+ bitmap = underlay;
+ }
+
updateProgress();
Object xmp = getPanoramaXMPData(newSourceUri, preset);
@@ -542,8 +579,11 @@ public class SaveImage {
if (preset.contains(FilterRepresentation.TYPE_TINYPLANET)){
flatten = true;
}
+
+ float scaleFactor = 1f;
+
Intent processIntent = ProcessingService.getSaveIntent(filterShowActivity, preset,
- destination, selectedImageUri, sourceImageUri, flatten, 90, 1f, true);
+ destination, selectedImageUri, sourceImageUri, flatten, 90, scaleFactor, true);
filterShowActivity.startService(processIntent);
@@ -595,7 +635,7 @@ public class SaveImage {
* @return The file object. Return null if srcUri is invalid or not a local
* file.
*/
- private static File getLocalFileFromUri(Context context, Uri srcUri) {
+ public static File getLocalFileFromUri(Context context, Uri srcUri) {
if (srcUri == null) {
Log.e(LOGTAG, "srcUri is null.");
return null;
@@ -615,13 +655,13 @@ public class SaveImage {
querySource(context, srcUri, new String[] {
ImageColumns.DATA
},
- new ContentResolverQueryCallback() {
+ new ContentResolverQueryCallback() {
- @Override
- public void onCursorResult(Cursor cursor) {
- file[0] = new File(cursor.getString(0));
- }
- });
+ @Override
+ public void onCursorResult(Cursor cursor) {
+ file[0] = new File(cursor.getString(0));
+ }
+ });
}
} else if (scheme.equals(ContentResolver.SCHEME_FILE)) {
file[0] = new File(srcUri.getPath());
@@ -695,7 +735,7 @@ public class SaveImage {
}
private static ContentValues getContentValues(Context context, Uri sourceUri,
- File file, long time) {
+ File file, long time) {
final ContentValues values = new ContentValues();
time /= 1000;
@@ -720,20 +760,20 @@ public class SaveImage {
SaveImage.querySource(context, sourceUri, projection,
new ContentResolverQueryCallback() {
- @Override
- public void onCursorResult(Cursor cursor) {
- values.put(Images.Media.DATE_TAKEN, cursor.getLong(0));
-
- double latitude = cursor.getDouble(1);
- double longitude = cursor.getDouble(2);
- // TODO: Change || to && after the default location
- // issue is fixed.
- if ((latitude != 0f) || (longitude != 0f)) {
- values.put(Images.Media.LATITUDE, latitude);
- values.put(Images.Media.LONGITUDE, longitude);
- }
- }
- });
+ @Override
+ public void onCursorResult(Cursor cursor) {
+ values.put(Images.Media.DATE_TAKEN, cursor.getLong(0));
+
+ double latitude = cursor.getDouble(1);
+ double longitude = cursor.getDouble(2);
+ // TODO: Change || to && after the default location
+ // issue is fixed.
+ if ((latitude != 0f) || (longitude != 0f)) {
+ values.put(Images.Media.LATITUDE, latitude);
+ values.put(Images.Media.LONGITUDE, longitude);
+ }
+ }
+ });
return values;
}