From b75da4c91e16bbd83cd839207224c0645a6ecefd Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Fri, 22 Mar 2013 22:02:37 -0700 Subject: [PATCH] Moves ownership of the environment to the pipeline Change-Id: I256e679a6f47831ebf00fe57d38b9c0372be38ec --- .../gallery3d/filtershow/FilterShowActivity.java | 2 - .../filtershow/cache/CachingPipeline.java | 47 ++++--- .../gallery3d/filtershow/cache/ImageLoader.java | 57 +++------ .../filtershow/cache/RenderingRequest.java | 7 +- .../filtershow/filters/BaseFiltersManager.java | 2 +- .../gallery3d/filtershow/imageshow/ImageZoom.java | 139 --------------------- .../gallery3d/filtershow/presets/ImagePreset.java | 56 ++------- 7 files changed, 64 insertions(+), 246 deletions(-) delete mode 100644 src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index a64283911..14a51392c 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -68,7 +68,6 @@ import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; import com.android.gallery3d.filtershow.imageshow.ImageCrop; import com.android.gallery3d.filtershow.imageshow.ImageShow; import com.android.gallery3d.filtershow.imageshow.ImageTinyPlanet; -import com.android.gallery3d.filtershow.imageshow.ImageZoom; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.presets.ImagePreset; import com.android.gallery3d.filtershow.provider.SharedImageProvider; @@ -356,7 +355,6 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, ImageShow.setDefaultBackgroundColor(res.getColor(R.color.background_screen)); // TODO: get those values from XML. - ImageZoom.setZoomedSize(getPixelsFromDip(256)); FramedTextButton.setTextSize((int) getPixelsFromDip(14)); FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4)); FramedTextButton.setTriangleSize((int) getPixelsFromDip(10)); diff --git a/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java b/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java index 1190ea4f8..f2b17fc0c 100644 --- a/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java +++ b/src/com/android/gallery3d/filtershow/cache/CachingPipeline.java @@ -24,6 +24,7 @@ import com.android.gallery3d.filtershow.filters.FiltersManager; import com.android.gallery3d.filtershow.filters.ImageFilterRS; import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; import com.android.gallery3d.filtershow.imageshow.MasterImage; +import com.android.gallery3d.filtershow.presets.FilterEnvironment; import com.android.gallery3d.filtershow.presets.ImagePreset; public class CachingPipeline { @@ -36,6 +37,8 @@ public class CachingPipeline { private volatile Bitmap mOriginalBitmap = null; private volatile Bitmap mResizedOriginalBitmap = null; + private FilterEnvironment mEnvironment = new FilterEnvironment(); + private volatile Allocation mOriginalAllocation = null; private volatile Allocation mFiltersOnlyOriginalAllocation = null; @@ -108,18 +111,19 @@ public class CachingPipeline { return "UNKNOWN TYPE!"; } - private void setPresetParameters(ImagePreset preset) { - preset.setScaleFactor(mPreviewScaleFactor); - preset.setQuality(ImagePreset.QUALITY_PREVIEW); - preset.setupEnvironment(mFiltersManager); - preset.getEnvironment().setCachingPipeline(this); + private void setupEnvironment(ImagePreset preset) { + mEnvironment.setCachingPipeline(this); + mEnvironment.setFiltersManager(mFiltersManager); + mEnvironment.setScaleFactor(mPreviewScaleFactor); + mEnvironment.setQuality(ImagePreset.QUALITY_PREVIEW); + mEnvironment.setImagePreset(preset); } public void setOriginal(Bitmap bitmap) { mOriginalBitmap = bitmap; Log.v(LOGTAG,"setOriginal, size " + bitmap.getWidth() + " x " + bitmap.getHeight()); ImagePreset preset = MasterImage.getImage().getPreset(); - preset.setupEnvironment(mFiltersManager); + setupEnvironment(preset); updateOriginalAllocation(preset); } @@ -149,7 +153,7 @@ public class CachingPipeline { } Allocation originalAllocation = mOriginalAllocation; - mResizedOriginalBitmap = preset.applyGeometry(originalBitmap); + mResizedOriginalBitmap = preset.applyGeometry(originalBitmap, mEnvironment); mOriginalAllocation = Allocation.createFromBitmap(RS, mResizedOriginalBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); if (originalAllocation != null) { @@ -173,7 +177,7 @@ public class CachingPipeline { Bitmap bitmap = request.getBitmap(); ImagePreset preset = request.getImagePreset(); - setPresetParameters(preset); + setupEnvironment(preset); mFiltersManager.freeFilterResources(preset); if (request.getType() == RenderingRequest.PARTIAL_RENDERING) { @@ -182,8 +186,8 @@ public class CachingPipeline { Log.w(LOGTAG, "loader not yet setup, cannot handle: " + getType(request)); return; } - bitmap = loader.getScaleOneImageForPreset(null, preset, - request.getBounds(), request.getDestination(), false); + bitmap = loader.getScaleOneImageForPreset(request.getBounds(), + request.getDestination()); if (bitmap == null) { Log.w(LOGTAG, "could not get bitmap for: " + getType(request)); return; @@ -213,7 +217,7 @@ public class CachingPipeline { || request.getType() == RenderingRequest.FILTERS_RENDERING || request.getType() == RenderingRequest.ICON_RENDERING || request.getType() == RenderingRequest.PARTIAL_RENDERING) { - Bitmap bmp = preset.apply(bitmap); + Bitmap bmp = preset.apply(bitmap, mEnvironment); request.setBitmap(bmp); mFiltersManager.freeFilterResources(preset); } @@ -221,10 +225,20 @@ public class CachingPipeline { } public synchronized Bitmap renderFinalImage(Bitmap bitmap, ImagePreset preset) { - setPresetParameters(preset); + setupEnvironment(preset); + mEnvironment.setQuality(ImagePreset.QUALITY_FINAL); + mEnvironment.setScaleFactor(1.0f); + mFiltersManager.freeFilterResources(preset); + bitmap = preset.applyGeometry(bitmap, mEnvironment); + bitmap = preset.apply(bitmap, mEnvironment); + return bitmap; + } + + public synchronized Bitmap renderGeometryIcon(Bitmap bitmap, ImagePreset preset) { + setupEnvironment(preset); + mEnvironment.setQuality(ImagePreset.QUALITY_PREVIEW); mFiltersManager.freeFilterResources(preset); - bitmap = preset.applyGeometry(bitmap); - bitmap = preset.apply(bitmap); + bitmap = preset.applyGeometry(bitmap, mEnvironment); return bitmap; } @@ -236,7 +250,7 @@ public class CachingPipeline { String thread = Thread.currentThread().getName(); long time = System.currentTimeMillis(); - setPresetParameters(preset); + setupEnvironment(preset); mFiltersManager.freeFilterResources(preset); Bitmap resizedOriginalBitmap = mResizedOriginalBitmap; @@ -254,7 +268,7 @@ public class CachingPipeline { } mOriginalAllocation.copyTo(bitmap); - bitmap = preset.apply(bitmap); + bitmap = preset.apply(bitmap, mEnvironment); mFiltersManager.freeFilterResources(preset); @@ -321,4 +335,5 @@ public class CachingPipeline { public String getName() { return mName; } + } diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java index ef3e3d5ce..a6a0bcf84 100644 --- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java +++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java @@ -40,6 +40,7 @@ import com.android.gallery3d.exif.ExifTag; import com.android.gallery3d.exif.ExifInterface; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.HistoryAdapter; +import com.android.gallery3d.filtershow.filters.FiltersManager; import com.android.gallery3d.filtershow.imageshow.ImageShow; import com.android.gallery3d.filtershow.presets.ImagePreset; import com.android.gallery3d.filtershow.tools.BitmapTask; @@ -358,51 +359,28 @@ public class ImageLoader { } }; - // FIXME: this currently does the loading + filtering on the UI thread -- - // need to move this to a background thread. - public Bitmap getScaleOneImageForPreset(ImageShow caller, ImagePreset imagePreset, Rect bounds, - Rect destination, boolean force) { + public Bitmap getScaleOneImageForPreset(Rect bounds, Rect destination) { mLoadingLock.lock(); - Bitmap bmp = mZoomCache.getImage(imagePreset, bounds); - if (force || bmp == null) { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inMutable = true; - if (destination != null) { - if (bounds.width() > destination.width()) { - int sampleSize = 1; - int w = bounds.width(); - while (w > destination.width()) { - sampleSize *= 2; - w /= sampleSize; - } - options.inSampleSize = sampleSize; + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inMutable = true; + if (destination != null) { + if (bounds.width() > destination.width()) { + int sampleSize = 1; + int w = bounds.width(); + while (w > destination.width()) { + sampleSize *= 2; + w /= sampleSize; } - } - bmp = loadRegionBitmap(mUri, options, bounds); - if (destination != null) { - mLoadingLock.unlock(); - return bmp; - } - if (bmp != null) { - 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); - mLoadingLock.unlock(); - return bmp; + options.inSampleSize = sampleSize; } } + Bitmap bmp = loadRegionBitmap(mUri, options, bounds); mLoadingLock.unlock(); return bmp; } public void saveImage(ImagePreset preset, final FilterShowActivity filterShowActivity, File destination) { - preset.setQuality(ImagePreset.QUALITY_FINAL); - preset.setScaleFactor(1.0f); new SaveCopyTask(mContext, mUri, destination, new SaveCopyTask.Callback() { @Override @@ -510,9 +488,6 @@ public class ImageLoader { public void returnFilteredResult(ImagePreset preset, final FilterShowActivity filterShowActivity) { - preset.setQuality(ImagePreset.QUALITY_FINAL); - preset.setScaleFactor(1.0f); - BitmapTask.Callbacks cb = new BitmapTask.Callbacks() { @Override @@ -545,9 +520,9 @@ public class ImageLoader { Log.w(LOGTAG, "Failed to save image!"); return null; } - param.setupEnvironment(); - bitmap = param.applyGeometry(bitmap); - bitmap = param.apply(bitmap); + CachingPipeline pipeline = new CachingPipeline( + FiltersManager.getManager(), "Saving"); + bitmap = pipeline.renderFinalImage(bitmap, param); noBitmap = false; } catch (java.lang.OutOfMemoryError e) { // Try 5 times before failing for good. diff --git a/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java b/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java index 3cc61f9f0..138abb0c9 100644 --- a/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java +++ b/src/com/android/gallery3d/filtershow/cache/RenderingRequest.java @@ -19,7 +19,9 @@ package com.android.gallery3d.filtershow.cache; import android.graphics.Bitmap; import android.graphics.Rect; import com.android.gallery3d.app.Log; +import com.android.gallery3d.filtershow.filters.FiltersManager; import com.android.gallery3d.filtershow.imageshow.MasterImage; +import com.android.gallery3d.filtershow.presets.FilterEnvironment; import com.android.gallery3d.filtershow.presets.ImagePreset; public class RenderingRequest { @@ -54,8 +56,9 @@ public class RenderingRequest { if (type == FULL_RENDERING || type == GEOMETRY_RENDERING || type == ICON_RENDERING) { - preset.setupEnvironment(); - bitmap = preset.applyGeometry(source); + CachingPipeline pipeline = new CachingPipeline( + FiltersManager.getManager(), "Icon"); + bitmap = pipeline.renderGeometryIcon(source, preset); } else if (type != PARTIAL_RENDERING) { bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), mConfig); } diff --git a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java index d84c9f2bd..b5c4de048 100644 --- a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java +++ b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java @@ -65,7 +65,7 @@ public abstract class BaseFiltersManager { if (preset == null) { return; } - Vector usedFilters = preset.getUsedFilters(); + Vector usedFilters = preset.getUsedFilters(this); for (Class c : mFilters.keySet()) { ImageFilter filter = mFilters.get(c); if (!usedFilters.contains(filter)) { diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java b/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java deleted file mode 100644 index eb568c303..000000000 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java +++ /dev/null @@ -1,139 +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.imageshow; - -import android.content.Context; -import android.graphics.*; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import com.android.gallery3d.filtershow.cache.ImageLoader; - -public class ImageZoom extends ImageShow { - private static final String LOGTAG = "ImageZoom"; - private boolean mTouchDown = false; - private boolean mZoomedIn = false; - private Rect mZoomBounds = null; - private static float mMaxSize = 512; - - public ImageZoom(Context context) { - super(context); - } - - public ImageZoom(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public static void setZoomedSize(float size) { - mMaxSize = size; - } - - @Override - public void resetParameter() { - super.resetParameter(); - mZoomedIn = false; - mTouchDown = false; - } - - public void onTouchDown(float x, float y) { - if (mZoomedIn || mTouchDown) { - return; - } - mTouchDown = true; - GeometryMetadata geo = getImagePreset().mGeoData; - Matrix originalToScreen = geo.getOriginalToScreen(true, - mImageLoader.getOriginalBounds().width(), - mImageLoader.getOriginalBounds().height(), - getWidth(), getHeight()); - float[] point = new float[2]; - point[0] = x; - point[1] = y; - Matrix inverse = new Matrix(); - originalToScreen.invert(inverse); - inverse.mapPoints(point); - - float ratio = (float) getWidth() / (float) getHeight(); - float mh = mMaxSize; - float mw = ratio * mh; - Point touch = getTouchPoint(); - RectF zoomRect = new RectF(touch.x - mw, touch.y - mh, touch.x + mw, touch.y + mw); - inverse.mapRect(zoomRect); - zoomRect.set(zoomRect.centerX() - mw, zoomRect.centerY() - mh, - zoomRect.centerX() + mw, zoomRect.centerY() + mh); - mZoomBounds = new Rect((int) zoomRect.left, (int) zoomRect.top, - (int) zoomRect.right, (int) zoomRect.bottom); - invalidate(); - } - - public void onTouchUp() { - mTouchDown = false; - } - - @Override - public void onDraw(Canvas canvas) { - drawBackground(canvas); - - Bitmap filteredImage = null; - if ((mZoomedIn || mTouchDown) && mImageLoader != null) { - filteredImage = mImageLoader.getScaleOneImageForPreset(this, getImagePreset(), - mZoomBounds, null, false); - } else { - filteredImage = getFilteredImage(); - } - canvas.save(); - if (mZoomedIn || mTouchDown) { - int orientation = ImageLoader.getZoomOrientation(); - switch (orientation) { - case ImageLoader.ORI_ROTATE_90: { - canvas.rotate(90, getWidth() / 2, getHeight() / 2); - break; - } - case ImageLoader.ORI_ROTATE_270: { - canvas.rotate(270, getWidth() / 2, getHeight() / 2); - break; - } - case ImageLoader.ORI_TRANSPOSE: { - canvas.rotate(90, getWidth() / 2, getHeight() / 2); - canvas.scale(1, -1); - break; - } - case ImageLoader.ORI_TRANSVERSE: { - canvas.rotate(270, getWidth() / 2, getHeight() / 2); - canvas.scale(1, -1); - break; - } - } - } - drawImage(canvas, filteredImage); - canvas.restore(); - - drawToast(canvas); - } - - @Override - public boolean onDoubleTap(MotionEvent event) { - - if (!mZoomedIn) { - onTouchDown(event.getX(), event.getY()); - } else { - onTouchUp(); - } - mZoomedIn = !mZoomedIn; - invalidate(); - return false; - } -} diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java index b75ac64fb..b2dd6b711 100644 --- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java @@ -22,6 +22,7 @@ import android.util.Log; import com.android.gallery3d.filtershow.ImageStateAdapter; import com.android.gallery3d.filtershow.cache.ImageLoader; +import com.android.gallery3d.filtershow.filters.BaseFiltersManager; import com.android.gallery3d.filtershow.filters.FilterRepresentation; import com.android.gallery3d.filtershow.filters.FiltersManager; import com.android.gallery3d.filtershow.filters.ImageFilter; @@ -35,11 +36,9 @@ public class ImagePreset { private static final String LOGTAG = "ImagePreset"; private FilterRepresentation mBorder = null; - private float mScaleFactor = 1.0f; public static final int QUALITY_ICON = 0; public static final int QUALITY_PREVIEW = 1; public static final int QUALITY_FINAL = 2; - private int mQuality = QUALITY_PREVIEW; private ImageLoader mImageLoader = null; private Vector mFilters = new Vector(); @@ -57,8 +56,6 @@ public class ImagePreset { private Bitmap mPreviewImage; - private FilterEnvironment mEnvironment = new FilterEnvironment(); - public ImagePreset() { setup(); } @@ -412,42 +409,31 @@ public class ImagePreset { // do nothing here } - public void setupEnvironment() { - setupEnvironment(FiltersManager.getManager()); - } - - public void setupEnvironment(FiltersManager filtersManager) { - getEnvironment().setImagePreset(this); - getEnvironment().setScaleFactor(mScaleFactor); - getEnvironment().setQuality(mQuality); - getEnvironment().setFiltersManager(filtersManager); - } - - public Bitmap apply(Bitmap original) { + public Bitmap apply(Bitmap original, FilterEnvironment environment) { Bitmap bitmap = original; - bitmap = applyFilters(bitmap, -1, -1); - return applyBorder(bitmap); + bitmap = applyFilters(bitmap, -1, -1, environment); + return applyBorder(bitmap, environment); } - public Bitmap applyGeometry(Bitmap bitmap) { + public Bitmap applyGeometry(Bitmap bitmap, FilterEnvironment environment) { // Apply any transform -- 90 rotate, flip, straighten, crop // Returns a new bitmap. if (mDoApplyGeometry) { mGeoData.synchronizeRepresentation(); - bitmap = mEnvironment.applyRepresentation(mGeoData, bitmap); + bitmap = environment.applyRepresentation(mGeoData, bitmap); } return bitmap; } - public Bitmap applyBorder(Bitmap bitmap) { + public Bitmap applyBorder(Bitmap bitmap, FilterEnvironment environment) { if (mBorder != null && mDoApplyGeometry) { mBorder.synchronizeRepresentation(); - bitmap = mEnvironment.applyRepresentation(mBorder, bitmap); + bitmap = environment.applyRepresentation(mBorder, bitmap); } return bitmap; } - public Bitmap applyFilters(Bitmap bitmap, int from, int to) { + public Bitmap applyFilters(Bitmap bitmap, int from, int to, FilterEnvironment environment) { if (mDoApplyFilters) { if (from < 0) { from = 0; @@ -461,7 +447,7 @@ public class ImagePreset { representation = mFilters.elementAt(i); representation.synchronizeRepresentation(); } - bitmap = mEnvironment.applyRepresentation(representation, bitmap); + bitmap = environment.applyRepresentation(representation, bitmap); } } @@ -500,22 +486,6 @@ public class ImagePreset { imageStateAdapter.notifyDataSetChanged(); } - public float getScaleFactor() { - return mScaleFactor; - } - - public int getQuality() { - return mQuality; - } - - public void setQuality(int value) { - mQuality = value; - } - - public void setScaleFactor(float value) { - mScaleFactor = value; - } - public void setPartialRendering(boolean partialRendering, Rect bounds) { mPartialRendering = partialRendering; mPartialRenderingBounds = bounds; @@ -537,18 +507,14 @@ public class ImagePreset { mPreviewImage = previewImage; } - public Vector getUsedFilters() { + public Vector getUsedFilters(BaseFiltersManager filtersManager) { Vector usedFilters = new Vector(); for (int i = 0; i < mFilters.size(); i++) { FilterRepresentation representation = mFilters.elementAt(i); - FiltersManager filtersManager = getEnvironment().getFiltersManager(); ImageFilter filter = filtersManager.getFilterForRepresentation(representation); usedFilters.add(filter); } return usedFilters; } - public FilterEnvironment getEnvironment() { - return mEnvironment; - } } -- 2.11.0