diff options
author | nicolasroard <nicolasroard@google.com> | 2013-03-07 15:16:59 -0800 |
---|---|---|
committer | nicolasroard <nicolasroard@google.com> | 2013-03-08 17:18:32 -0800 |
commit | 8f87def525800a584ea38bff209ceb1e80e95078 (patch) | |
tree | 70e7aaa69512560a1d938467daf5a18f74b5f2d4 /src/com/android/gallery3d/filtershow/cache | |
parent | b04ff63a0c3b6dab780ead467586d3a52363a6d2 (diff) | |
download | android_packages_apps_Snap-8f87def525800a584ea38bff209ceb1e80e95078.tar.gz android_packages_apps_Snap-8f87def525800a584ea38bff209ceb1e80e95078.tar.bz2 android_packages_apps_Snap-8f87def525800a584ea38bff209ceb1e80e95078.zip |
Memory usage improvements, speed improvement
- free filters resources agressively
- implements multiple rendering pipelines
- some cleanup
Change-Id: Ib9ed268b0b2662d0bf5c049adcf046b556954c37
Diffstat (limited to 'src/com/android/gallery3d/filtershow/cache')
5 files changed, 15 insertions, 165 deletions
diff --git a/src/com/android/gallery3d/filtershow/cache/BitmapCache.java b/src/com/android/gallery3d/filtershow/cache/BitmapCache.java deleted file mode 100644 index ba623c39a..000000000 --- a/src/com/android/gallery3d/filtershow/cache/BitmapCache.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * 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. - */ - -package com.android.gallery3d.filtershow.cache; - -import android.graphics.Bitmap; - -import com.android.gallery3d.filtershow.presets.ImagePreset; - -import java.nio.ByteBuffer; - -public class BitmapCache { - - private static final String LOGTAG = "BitmapCache"; - static int mNbItems = 20; - private final Bitmap[] mBitmaps = new Bitmap[mNbItems]; - private final Object[] mKeys = new Object[mNbItems]; - private final long[] mIndices = new long[mNbItems]; - private final boolean[] mBusyStatus = new boolean[mNbItems]; - - private Bitmap mOriginalBitmap = null; - private ByteBuffer mBuffer = null; - private final Bitmap.Config mConfig = Bitmap.Config.ARGB_8888; - private long mIndex = 0; - - public void setOriginalBitmap(Bitmap original) { - if (original == null) { - return; - } - mOriginalBitmap = original.copy(mConfig, true); - int size = 4 * original.getWidth() * original.getHeight(); - mBuffer = ByteBuffer.allocate(size); - mOriginalBitmap.copyPixelsToBuffer(mBuffer); - mBuffer.rewind(); - mOriginalBitmap.copyPixelsFromBuffer(mBuffer); - for (int i = 0; i < mNbItems; i++) { - mBitmaps[i] = mOriginalBitmap.copy(mConfig, true); - } - } - - private int getOldestPosition() { - long minIndex = mIndices[0]; - int current = 0; - for (int i = 1; i < mNbItems; i++) { - if (!mBusyStatus[i] && minIndex > mIndices[i]) { - minIndex = mIndices[i]; - current = i; - } - } - return current; - } - - public Bitmap put(ImagePreset preset) { - int pos = getOldestPosition(); - return put(preset, pos); - } - - public Bitmap put(ImagePreset preset, int pos) { - mBitmaps[pos] = mOriginalBitmap.copy(mConfig, true); - Bitmap bitmap = mBitmaps[pos]; - bitmap = preset.apply(bitmap); - mKeys[pos] = preset; - mIndices[pos] = mIndex++; - return bitmap; - } - - public int reservePosition(ImagePreset preset) { - for (int i = 1; i < mNbItems; i++) { - if (mKeys[i] == preset && mBusyStatus[i]) { - return -1; - } - } - int pos = getOldestPosition(); - mBusyStatus[pos] = true; - mKeys[pos] = preset; - return pos; - } - - public void processPosition(int pos) { - ImagePreset preset = (ImagePreset) mKeys[pos]; - mBitmaps[pos] = mOriginalBitmap.copy(mConfig, true); - Bitmap bitmap = mBitmaps[pos]; - bitmap = preset.apply(bitmap); - mIndices[pos] = mIndex++; - } - - public void unlockPosition(int pos) { - mBusyStatus[pos] = false; - } - - public Bitmap get(ImagePreset preset) { - int foundPosition = -1; - int currentIndice = 0; - for (int i = 0; i < mNbItems; i++) { - if (mKeys[i] == preset && mBitmaps[i] != null) { - if (mIndices[i] > currentIndice) { - foundPosition = i; - } - } - } - if (foundPosition != -1) { - mIndices[foundPosition] = mIndex++; - return mBitmaps[foundPosition]; - } - return null; - } - - public void reset(ImagePreset preset) { - for (int i = 0; i < mNbItems; i++) { - if (mKeys[i] == preset && !mBusyStatus[i]) { - mBitmaps[i] = null; - } - } - } -} diff --git a/src/com/android/gallery3d/filtershow/cache/Cache.java b/src/com/android/gallery3d/filtershow/cache/Cache.java deleted file mode 100644 index 7a3ce9d98..000000000 --- a/src/com/android/gallery3d/filtershow/cache/Cache.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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. - */ - -package com.android.gallery3d.filtershow.cache; - -import android.graphics.Bitmap; - -import com.android.gallery3d.filtershow.imageshow.ImageShow; -import com.android.gallery3d.filtershow.presets.ImagePreset; - -public interface Cache { - public void setOriginalBitmap(Bitmap bitmap); - - public void reset(ImagePreset preset); - - public void prepare(ImagePreset preset); - - public Bitmap get(ImagePreset preset); - - public void addObserver(ImageShow observer); -} diff --git a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java index 17c19ebe0..39b39695c 100644 --- a/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java +++ b/src/com/android/gallery3d/filtershow/cache/FilteringPipeline.java @@ -125,7 +125,9 @@ public class FilteringPipeline implements Handler.Callback { public synchronized void setOriginal(Bitmap bitmap) { mOriginalBitmap = bitmap; Log.v(LOGTAG,"setOriginal, size " + bitmap.getWidth() + " x " + bitmap.getHeight()); - updateOriginalAllocation(MasterImage.getImage().getPreset()); + ImagePreset preset = MasterImage.getImage().getPreset(); + preset.setupEnvironment(); + updateOriginalAllocation(preset); updatePreviewBuffer(); } @@ -203,7 +205,7 @@ public class FilteringPipeline implements Handler.Callback { } Message msg = mProcessingHandler.obtainMessage(COMPUTE_PRESET); msg.obj = MasterImage.getImage().getPreset(); - mProcessingHandler.sendMessage(msg); + mProcessingHandler.sendMessageAtFrontOfQueue(msg); } private void setPresetParameters(ImagePreset preset) { @@ -247,6 +249,7 @@ public class FilteringPipeline implements Handler.Callback { Bitmap bitmap = request.getBitmap(); ImagePreset preset = request.getImagePreset(); setPresetParameters(preset); + preset.setupEnvironment(); if (request.getType() == RenderingRequest.PARTIAL_RENDERING) { bitmap = MasterImage.getImage().getImageLoader().getScaleOneImageForPreset(null, preset, @@ -282,7 +285,10 @@ public class FilteringPipeline implements Handler.Callback { || request.getType() == RenderingRequest.PARTIAL_RENDERING) { Bitmap bmp = preset.apply(bitmap); request.setBitmap(bmp); + + FiltersManager.getManager().freeFilterResources(preset); } + if (request.getType() == RenderingRequest.FILTERS_RENDERING) { FiltersManager.getManager().resetBitmapsRS(); } @@ -296,6 +302,9 @@ public class FilteringPipeline implements Handler.Callback { String thread = Thread.currentThread().getName(); long time = System.currentTimeMillis(); + setPresetParameters(preset); + preset.setupEnvironment(FiltersManager.getPreviewManager()); + if (updateOriginalAllocation(preset)) { buffer.updateBitmaps(mResizedOriginalBitmap); } @@ -309,8 +318,8 @@ public class FilteringPipeline implements Handler.Callback { } mOriginalAllocation.copyTo(bitmap); - setPresetParameters(preset); bitmap = preset.apply(bitmap); + FiltersManager.getPreviewManager().freeFilterResources(preset); time = System.currentTimeMillis() - time; time2 = System.currentTimeMillis() - time2; diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java index a8191cfd8..6cf462269 100644 --- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java +++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java @@ -394,6 +394,7 @@ public class ImageLoader { float scaleFactor = imagePreset.getScaleFactor(); float scale = (float) bmp.getWidth() / (float) getOriginalBounds().width(); imagePreset.setScaleFactor(scale); + imagePreset.setupEnvironment(); bmp = imagePreset.apply(bmp); imagePreset.setScaleFactor(scaleFactor); mZoomCache.setImage(imagePreset, bounds, bmp); @@ -551,6 +552,7 @@ public class ImageLoader { Log.w(LOGTAG, "Failed to save image!"); return null; } + param.setupEnvironment(); bitmap = param.applyGeometry(bitmap); bitmap = param.apply(bitmap); noBitmap = false; diff --git a/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java b/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java index e81f47fe1..3cc61f9f0 100644 --- a/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java +++ b/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java @@ -54,6 +54,7 @@ public class RenderingRequest { if (type == FULL_RENDERING || type == GEOMETRY_RENDERING || type == ICON_RENDERING) { + preset.setupEnvironment(); bitmap = preset.applyGeometry(source); } else if (type != PARTIAL_RENDERING) { bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), mConfig); |