summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorByunghun Jeon <bjeon@codeaurora.org>2015-09-02 10:47:03 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2015-10-13 06:46:48 -0700
commit8dac365eb932979db5ed64f24d3cda653611c907 (patch)
tree6e1fb038e43e396d0c1823dff71824efbcba2bc8
parent04fc14ffefedadaf13bb14f2f91426a2eb0d45a1 (diff)
downloadandroid_packages_apps_Gallery2-8dac365eb932979db5ed64f24d3cda653611c907.tar.gz
android_packages_apps_Gallery2-8dac365eb932979db5ed64f24d3cda653611c907.tar.bz2
android_packages_apps_Gallery2-8dac365eb932979db5ed64f24d3cda653611c907.zip
Gallery2: Use bitmap cache to reduce memory footprint
Use the bitmap cache mechanism to reuse bitmap memory and reduce memory usage. CRs-Fixed: 892007 Change-Id: I277906b55c1f62ac0fdf036b001e53935b2d407d
-rw-r--r--res/values/filtershow_strings.xml1
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilter.java2
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java92
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java73
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java111
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/MasterImage.java30
-rw-r--r--src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java2
-rw-r--r--src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java7
8 files changed, 148 insertions, 170 deletions
diff --git a/res/values/filtershow_strings.xml b/res/values/filtershow_strings.xml
index fc75fb9b9..3a7a86354 100644
--- a/res/values/filtershow_strings.xml
+++ b/res/values/filtershow_strings.xml
@@ -340,5 +340,6 @@
<string name="fusion_pick_point">Pick Segment</string>
<string name="fusion_pick_underlay">Pick Underlay</string>
+ <string name="dualcam_no_segment_toast">No segment found at this point</string>
</resources>
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
index 1fcd3008c..1a32e46e0 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
@@ -35,7 +35,7 @@ public abstract class ImageFilter implements Cloneable {
// TODO: Temporary, for dogfood note memory issues with toasts for better
// feedback. Remove this when filters actually work in low memory
// situations.
- private static Activity sActivity = null;
+ protected static Activity sActivity = null;
public static void setActivityForMemoryToasts(Activity activity) {
sActivity = activity;
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java
index bc181e33d..1e89f3361 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamFusion.java
@@ -37,18 +37,20 @@ import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.Rect;
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.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.FilterEnvironment;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
public class ImageFilterDualCamFusion extends ImageFilter {
private static final String TAG = ImageFilterDualCamFusion.class.getSimpleName();
+ private static Toast sSegmentToast;
private FilterDualCamFusionRepresentation mParameters;
private Paint mPaint = new Paint();
- private Bitmap mFilteredBitmap = null;
- private Point mPoint = null;
public ImageFilterDualCamFusion() {
mName = "Fusion";
@@ -68,14 +70,6 @@ public class ImageFilterDualCamFusion extends ImageFilter {
}
@Override
- public void freeResources() {
- if (mFilteredBitmap != null)
- mFilteredBitmap.recycle();
- mFilteredBitmap = null;
- mPoint = null;
- }
-
- @Override
public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) {
if (getParameters() == null) {
return bitmap;
@@ -84,53 +78,53 @@ public class ImageFilterDualCamFusion extends ImageFilter {
Point point = getParameters().getPoint();
if(!point.equals(-1,-1)) {
- long startTime = System.currentTimeMillis();
- Log.e(TAG, "dual cam fusion - start processing: " + startTime);
-
- if(!point.equals(mPoint)) {
- mPoint = point;
-
- if(mFilteredBitmap == null) {
- Rect originalBounds = MasterImage.getImage().getOriginalBounds();
- int origW = originalBounds.width();
- int origH = originalBounds.height();
+ Bitmap filteredBitmap = null;
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
+ int origW = originalBounds.width();
+ int origH = originalBounds.height();
+
+ filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(origW, origH, BitmapCache.FILTERS);
+ filteredBitmap.setHasAlpha(true);
+
+ boolean result = DualCameraNativeEngine.getInstance().getForegroundImg(point.x, point.y, filteredBitmap);
+
+ if(result == false) {
+ Log.e(TAG, "Imagelib API failed");
+ sActivity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if(sSegmentToast == null) {
+ sSegmentToast = Toast.makeText(sActivity, R.string.dualcam_no_segment_toast, Toast.LENGTH_SHORT);
+ }
+ sSegmentToast.show();
+ }
+ });
+ return bitmap;
+ } else {
- mFilteredBitmap = Bitmap.createBitmap(origW, origH, Bitmap.Config.ARGB_8888);
- mFilteredBitmap.setHasAlpha(true);
+ mPaint.reset();
+ if(quality == FilterEnvironment.QUALITY_FINAL) {
+ mPaint.setAntiAlias(true);
+ mPaint.setFilterBitmap(true);
+ mPaint.setDither(true);
}
+ bitmap.setHasAlpha(true);
- boolean result = DualCameraNativeEngine.getInstance().getForegroundImg(mPoint.x, mPoint.y,
- mFilteredBitmap);
+ Canvas canvas = new Canvas(bitmap);
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
- if(result == false) {
- Log.e(TAG, "Imagelib API failed");
- return bitmap;
+ canvas.drawColor(0, PorterDuff.Mode.CLEAR);
+ if(getEnvironment().getImagePreset().getDoApplyGeometry()) {
+ Matrix originalToScreen = getOriginalToScreenMatrix(w, h);
+ canvas.drawBitmap(filteredBitmap, originalToScreen, null);
+ } else {
+ canvas.drawBitmap(filteredBitmap, null, new Rect(0,0,w,h), null);
}
- }
- mPaint.reset();
- if(quality == FilterEnvironment.QUALITY_FINAL) {
- mPaint.setAntiAlias(true);
- mPaint.setFilterBitmap(true);
- mPaint.setDither(true);
+ MasterImage.getImage().getBitmapCache().cache(filteredBitmap);
}
-
- bitmap.setHasAlpha(true);
-
- Canvas canvas = new Canvas(bitmap);
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
- canvas.drawColor(0, PorterDuff.Mode.CLEAR);
- if(getEnvironment().getImagePreset().getDoApplyGeometry()) {
- Matrix originalToScreen = getOriginalToScreenMatrix(w, h);
- canvas.drawBitmap(mFilteredBitmap, originalToScreen, null);
- } else {
- canvas.drawBitmap(mFilteredBitmap, null, new Rect(0,0,w,h), null);
- }
-
- Log.e(TAG, "dual cam fusion - finish processing: " + (System.currentTimeMillis()-startTime));
}
return bitmap;
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java
index b0acb1a70..3f12982a8 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java
@@ -38,20 +38,22 @@ import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
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.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.FilterEnvironment;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
public class ImageFilterDualCamSketch extends ImageFilter {
private static final String TAG = ImageFilterDualCamSketch.class.getSimpleName();
+ private static Toast sSegmentToast;
private FilterDualCamSketchRepresentation mParameters;
private Paint mPaint = new Paint();
- private Bitmap mFilteredBitmap = null;
private Bitmap mSketchBm = null;
private int mSketchResId = 0;
- private Point mPoint = null;
private Resources mResources = null;
public FilterRepresentation getDefaultRepresentation() {
@@ -73,15 +75,11 @@ public class ImageFilterDualCamSketch extends ImageFilter {
@Override
public void freeResources() {
- if(mFilteredBitmap != null)
- mFilteredBitmap.recycle();
if (mSketchBm != null)
mSketchBm.recycle();
- mFilteredBitmap = null;
mSketchBm = null;
mSketchResId = 0;
- mPoint = null;
}
@Override
@@ -106,42 +104,49 @@ public class ImageFilterDualCamSketch extends ImageFilter {
return bitmap;
}
- if(!point.equals(mPoint)) {
- mPoint = point;
+ boolean result = false;
+ Bitmap filteredBitmap = null;
- boolean result = false;
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
+ int origW = originalBounds.width();
+ int origH = originalBounds.height();
- if(mFilteredBitmap == null) {
- Rect originalBounds = MasterImage.getImage().getOriginalBounds();
- int origW = originalBounds.width();
- int origH = originalBounds.height();
+ filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(origW, origH, BitmapCache.FILTERS);
- mFilteredBitmap = Bitmap.createBitmap(origW, origH, Bitmap.Config.ARGB_8888);
- }
+ result = DualCameraNativeEngine.getInstance().applySketch(mSketchBm, point.x, point.y, filteredBitmap);
- result = DualCameraNativeEngine.getInstance().applySketch(mSketchBm, mPoint.x, mPoint.y, mFilteredBitmap);
+ if(result == false) {
+ Log.e(TAG, "Imagelib API failed");
+ sActivity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if(sSegmentToast == null) {
+ sSegmentToast = Toast.makeText(sActivity, R.string.dualcam_no_segment_toast, Toast.LENGTH_SHORT);
+ }
+ sSegmentToast.show();
+ }
+ });
+ return bitmap;
+ } else {
- if(result == false) {
- Log.e(TAG, "Imagelib API failed");
- return bitmap;
+ if(quality == FilterEnvironment.QUALITY_FINAL) {
+ mPaint.reset();
+ mPaint.setAntiAlias(true);
+ mPaint.setFilterBitmap(true);
+ mPaint.setDither(true);
}
- }
- if(quality == FilterEnvironment.QUALITY_FINAL) {
- mPaint.reset();
- mPaint.setAntiAlias(true);
- mPaint.setFilterBitmap(true);
- mPaint.setDither(true);
- }
+ Canvas canvas = new Canvas(bitmap);
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ if(getEnvironment().getImagePreset().getDoApplyGeometry()) {
+ Matrix originalToScreen = getOriginalToScreenMatrix(w, h);
+ canvas.drawBitmap(filteredBitmap, originalToScreen, mPaint);
+ } else {
+ canvas.drawBitmap(filteredBitmap, null, new Rect(0,0,w,h), mPaint);
+ }
- Canvas canvas = new Canvas(bitmap);
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
- if(getEnvironment().getImagePreset().getDoApplyGeometry()) {
- Matrix originalToScreen = getOriginalToScreenMatrix(w, h);
- canvas.drawBitmap(mFilteredBitmap, originalToScreen, mPaint);
- } else {
- canvas.drawBitmap(mFilteredBitmap, null, new Rect(0,0,w,h), mPaint);
+ 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 31e7d0318..2e341708f 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java
@@ -36,20 +36,20 @@ import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
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.imageshow.MasterImage;
import com.android.gallery3d.filtershow.pipeline.FilterEnvironment;
import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine;
public class ImageFilterDualCamera extends ImageFilter {
private static final String TAG = ImageFilterDualCamera.class.getSimpleName();
+ private static Toast sSegmentToast;
private FilterDualCamBasicRepresentation mParameters;
private Paint mPaint = new Paint();
- private Bitmap mFilteredBitmap = null;
- private Point mPoint = null;
- private int mIntensity = -1;
public FilterRepresentation getDefaultRepresentation() {
return null;
@@ -65,16 +65,6 @@ public class ImageFilterDualCamera extends ImageFilter {
}
@Override
- public void freeResources() {
- if(mFilteredBitmap != null)
- mFilteredBitmap.recycle();
-
- mFilteredBitmap = null;
- mPoint = null;
- mIntensity = -1;
- }
-
- @Override
public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) {
if (getParameters() == null) {
return bitmap;
@@ -82,60 +72,67 @@ public class ImageFilterDualCamera extends ImageFilter {
Point point = getParameters().getPoint();
int intensity = getParameters().getValue();
+ Bitmap filteredBitmap = null;
if(!point.equals(-1,-1)) {
- // if parameters change, generate new filtered bitmap
- if(!point.equals(mPoint) || mIntensity != intensity) {
- mPoint = point;
- mIntensity = intensity;
-
- if(mFilteredBitmap == null) {
- Rect originalBounds = MasterImage.getImage().getOriginalBounds();
- int origW = originalBounds.width();
- int origH = originalBounds.height();
+ Rect originalBounds = MasterImage.getImage().getOriginalBounds();
+ int origW = originalBounds.width();
+ int origH = originalBounds.height();
+
+ filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(origW, origH, BitmapCache.FILTERS);
+
+ boolean result = false;
+
+ switch(mParameters.getTextId()) {
+ case R.string.focus:
+ result = DualCameraNativeEngine.getInstance().applyFocus(point.x, point.y, intensity,
+ filteredBitmap);
+ break;
+ case R.string.halo:
+ result = DualCameraNativeEngine.getInstance().applyHalo(point.x, point.y, intensity,
+ filteredBitmap);
+ break;
+ case R.string.blur:
+ result = DualCameraNativeEngine.getInstance().applyBokeh(point.x, point.y, intensity,
+ filteredBitmap);
+ break;
+ }
- mFilteredBitmap = Bitmap.createBitmap(origW, origH, Bitmap.Config.ARGB_8888);
- }
+ if(result == false) {
+ Log.e(TAG, "Imagelib API failed");
+ sActivity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if(sSegmentToast == null) {
+ sSegmentToast = Toast.makeText(sActivity, R.string.dualcam_no_segment_toast, Toast.LENGTH_SHORT);
+ }
+ sSegmentToast.show();
+ }
+ });
+
+ return bitmap;
+ } else {
- boolean result = false;
-
- switch(mParameters.getTextId()) {
- case R.string.focus:
- result = DualCameraNativeEngine.getInstance().applyFocus(mPoint.x, mPoint.y, mIntensity,
- mFilteredBitmap);
- break;
- case R.string.halo:
- result = DualCameraNativeEngine.getInstance().applyHalo(mPoint.x, mPoint.y, mIntensity,
- mFilteredBitmap);
- break;
- case R.string.blur:
- result = DualCameraNativeEngine.getInstance().applyBokeh(mPoint.x, mPoint.y, mIntensity,
- mFilteredBitmap);
- break;
+ if(quality == FilterEnvironment.QUALITY_FINAL) {
+ mPaint.reset();
+ mPaint.setAntiAlias(true);
+ mPaint.setFilterBitmap(true);
+ mPaint.setDither(true);
}
- if(result == false) {
- Log.e(TAG, "Imagelib API failed");
- return bitmap;
+ Canvas canvas = new Canvas(bitmap);
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ if(getEnvironment().getImagePreset().getDoApplyGeometry()) {
+ Matrix originalToScreen = getOriginalToScreenMatrix(w, h);
+ canvas.drawBitmap(filteredBitmap, originalToScreen, mPaint);
+ } else {
+ canvas.drawBitmap(filteredBitmap, null, new Rect(0,0,w,h), mPaint);
}
- }
- if(quality == FilterEnvironment.QUALITY_FINAL) {
- mPaint.reset();
- mPaint.setAntiAlias(true);
- mPaint.setFilterBitmap(true);
- mPaint.setDither(true);
- }
+ MasterImage.getImage().getBitmapCache().cache(filteredBitmap);
- Canvas canvas = new Canvas(bitmap);
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
- if(getEnvironment().getImagePreset().getDoApplyGeometry()) {
- Matrix originalToScreen = getOriginalToScreenMatrix(w, h);
- canvas.drawBitmap(mFilteredBitmap, originalToScreen, mPaint);
- } else {
- canvas.drawBitmap(mFilteredBitmap, null, new Rect(0,0,w,h), mPaint);
}
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index 2ef0b8362..ae6621406 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -876,17 +876,6 @@ public class MasterImage implements RenderingRequestCaller {
return false;
}
- int primaryWidth = primaryBm.getWidth();
- int primaryHeight = primaryBm.getHeight();
- int primaryStride = primaryBm.getRowBytes();
-
- Log.v(LOGTAG, "primary info: " + primaryWidth + "x" + primaryHeight + ", s:" + primaryStride);
-
- ByteBuffer primaryMpoBuffer = ByteBuffer.allocateDirect(primaryBm.getByteCount());
- primaryBm.copyPixelsToBuffer(primaryMpoBuffer);
- primaryBm.recycle();
- primaryBm = null;
-
// check for pre-generated dm file
String mpoFilepath = ImageLoader.getLocalPathFromUri(getActivity(), getUri());
String depthFilepath = MpoParser.getDepthmapFilepath(mpoFilepath);
@@ -905,25 +894,20 @@ public class MasterImage implements RenderingRequestCaller {
auxiliaryMpoData = null;
if(auxiliaryBm == null) {
+ primaryBm.recycle();
+ primaryBm = null;
return false;
}
- int auxiliaryWidth = auxiliaryBm.getWidth();
- int auxiliaryHeight = auxiliaryBm.getHeight();
- int auxiliaryStride = auxiliaryBm.getRowBytes();
-
- Log.v(LOGTAG, "auxiliary info: " + auxiliaryWidth + "x" + auxiliaryHeight + ", s:" + auxiliaryStride);
+ DualCameraNativeEngine.getInstance().initDepthMap(
+ primaryBm, auxiliaryBm, mpoFilepath,
+ DualCameraNativeEngine.getInstance().getCalibFilepath(mActivity));
- ByteBuffer auxiliaryMpoBuffer = ByteBuffer.allocateDirect(auxiliaryBm.getByteCount());
- auxiliaryBm.copyPixelsToBuffer(auxiliaryMpoBuffer);
+ primaryBm.recycle();
+ primaryBm = null;
auxiliaryBm.recycle();
auxiliaryBm = null;
- DualCameraNativeEngine.getInstance().initDepthMap(
- primaryMpoBuffer, primaryWidth, primaryHeight, primaryStride,
- auxiliaryMpoBuffer, auxiliaryWidth, auxiliaryHeight, auxiliaryStride,
- mpoFilepath, DualCameraNativeEngine.getInstance().getCalibFilepath(mActivity));
-
Point size = new Point();
boolean result = DualCameraNativeEngine.getInstance().getDepthMapSize(size);
if(result) {
diff --git a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java
index f57383a8c..c2912ed78 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/CacheProcessing.java
@@ -28,7 +28,7 @@ import java.util.Vector;
public class CacheProcessing {
private static final String LOGTAG = "CacheProcessing";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final boolean NO_CACHING = false;
private Vector<CacheStep> mSteps = new Vector<CacheStep>();
diff --git a/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java b/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java
index 60b4d67e9..7764ececb 100644
--- a/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java
+++ b/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java
@@ -78,12 +78,9 @@ public class DualCameraNativeEngine {
return calibFile.getAbsolutePath();
}
- native public void initDepthMap(ByteBuffer primaryRGBA, int primaryWidth, int primaryHeight, int primaryStride,
- ByteBuffer auxiliaryRGBA, int auxiliaryWidth, int auxiliaryHeight, int auxiliaryStride,
- String mpoFilepath, String calibFilepath);
+ native public boolean initDepthMap(Bitmap primaryRGBA, Bitmap auxiliaryRGBA, String mpoFilepath, String calibFilepath);
- native public void loadDepthMap(ByteBuffer primaryRGBA, int primaryWidth, int primaryHeight, int primaryStride,
- ByteBuffer depthMap, int depthMapWidth, int depthMapHeight, int depthMapStride);
+ native public boolean loadDepthMap(Bitmap primaryRGBA, Bitmap depthMap);
native public void releaseDepthMap();