From 0c1b4c6422a4d2d9b81cc0946d1c9675440a94e2 Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Mon, 8 Jul 2013 18:11:49 -0700 Subject: Refactoring ImageLoader. - Moves state (history, loadlisteners, bitmaps, etc.) from ImageLoader to MasterImage. - Makes ImageLoader into a utility class. Change-Id: I7a8a988c61848694a86a4b2919bf8f30bfd2be8c --- .../gallery3d/filtershow/EditorPlaceHolder.java | 7 +- .../gallery3d/filtershow/FilterShowActivity.java | 51 +++-- .../gallery3d/filtershow/cache/ImageLoader.java | 207 ++++----------------- .../gallery3d/filtershow/editors/Editor.java | 4 - .../gallery3d/filtershow/editors/EditorCrop.java | 3 +- .../gallery3d/filtershow/editors/EditorFlip.java | 3 +- .../gallery3d/filtershow/editors/EditorRotate.java | 3 +- .../filtershow/editors/EditorStraighten.java | 3 +- .../gallery3d/filtershow/filters/ImageFilter.java | 5 +- .../filtershow/filters/ImageFilterDownsample.java | 3 +- .../filtershow/filters/ImageFilterDraw.java | 5 +- .../filtershow/filters/ImageFilterTinyPlanet.java | 4 +- .../filtershow/imageshow/GeometryMetadata.java | 2 +- .../gallery3d/filtershow/imageshow/ImageShow.java | 18 +- .../filtershow/imageshow/ImageVignette.java | 4 +- .../filtershow/imageshow/MasterImage.java | 121 +++++++++--- .../filtershow/pipeline/CachingPipeline.java | 12 +- .../filtershow/pipeline/FilteringPipeline.java | 3 +- .../gallery3d/filtershow/pipeline/ImagePreset.java | 13 +- .../filtershow/pipeline/RenderingRequest.java | 1 - 20 files changed, 203 insertions(+), 269 deletions(-) (limited to 'src/com/android/gallery3d') diff --git a/src/com/android/gallery3d/filtershow/EditorPlaceHolder.java b/src/com/android/gallery3d/filtershow/EditorPlaceHolder.java index 30d4ddefa..7faa3d3ad 100644 --- a/src/com/android/gallery3d/filtershow/EditorPlaceHolder.java +++ b/src/com/android/gallery3d/filtershow/EditorPlaceHolder.java @@ -18,7 +18,6 @@ public class EditorPlaceHolder { private FrameLayout mContainer = null; private HashMap mEditors = new HashMap(); private Vector mOldViews = new Vector(); - private ImageLoader mImageLoader = null; public EditorPlaceHolder(FilterShowActivity activity) { mActivity = activity; @@ -47,7 +46,7 @@ public class EditorPlaceHolder { try { editor.createEditor(mActivity, mContainer); - editor.setImageLoader(mImageLoader); + editor.getImageShow().bindAsImageLoadListener(); mContainer.setVisibility(View.VISIBLE); mContainer.removeAllViews(); View eview = editor.getTopLevelView(); @@ -81,10 +80,6 @@ public class EditorPlaceHolder { } } - public void setImageLoader(ImageLoader imageLoader) { - mImageLoader = imageLoader; - } - public Editor getEditor(int editorId) { return mEditors.get(editorId); } diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 4394cdee5..c29709b91 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -20,6 +20,7 @@ import android.app.ActionBar; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.ContentValues; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -27,6 +28,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Point; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; @@ -111,7 +113,6 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL public static final String TINY_PLANET_ACTION = "com.android.camera.action.TINY_PLANET"; public static final String LAUNCH_FULLSCREEN = "launch-fullscreen"; - private ImageLoader mImageLoader = null; private ImageShow mImageShow = null; private View mSaveButton = null; @@ -251,7 +252,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL mEditorPlaceHolder.hide(); - mImageShow.setImageLoader(mImageLoader); + mImageShow.bindAsImageLoadListener(); fillFx(); fillBorders(); @@ -262,7 +263,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL } public void setupStatePanel() { - mImageLoader.setHistoryManager(mMasterImage.getHistory()); + MasterImage.getImage().setHistoryManager(mMasterImage.getHistory()); } private void fillFilters() { @@ -330,7 +331,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL mEditorPlaceHolder.setContainer((FrameLayout) findViewById(R.id.editorContainer)); EditorManager.addEditors(mEditorPlaceHolder); mEditorPlaceHolder.setOldViews(mImageViews); - mEditorPlaceHolder.setImageLoader(mImageLoader); + } private void fillEditors() { @@ -498,16 +499,29 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL private class LoadHighresBitmapTask extends AsyncTask { @Override protected Boolean doInBackground(Void... params) { - mImageLoader.loadHighResBitmap(); + MasterImage master = MasterImage.getImage(); + Rect originalBounds = master.getOriginalBounds(); + if (master.supportsHighRes()) { + int highresPreviewSize = master.getOriginalBitmapLarge().getWidth() * 2; + if (highresPreviewSize > originalBounds.width()) { + highresPreviewSize = originalBounds.width(); + } + Bitmap originalHires = ImageLoader.loadOrientedScaledBitmap(master, + master.getActivity(), master.getUri(), highresPreviewSize, false, + master.getOrientation()); + master.setOriginalBitmapHighres(originalHires); + master.warnListeners(); + } return true; } @Override protected void onPostExecute(Boolean result) { - Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres(); + Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres(); if (highresBitmap != null) { FilteringPipeline pipeline = FilteringPipeline.getPipeline(); - float highResPreviewScale = (float) highresBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width(); + float highResPreviewScale = (float) highresBitmap.getWidth() + / (float) MasterImage.getImage().getOriginalBounds().width(); pipeline.setHighResPreviewScaleFactor(highResPreviewScale); } } @@ -522,10 +536,10 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL @Override protected Boolean doInBackground(Uri... params) { - if (!mImageLoader.loadBitmap(params[0], mBitmapSize)) { + if (!MasterImage.getImage().loadBitmap(params[0], mBitmapSize)) { return false; } - publishProgress(mImageLoader.queryLightCycle360()); + publishProgress(ImageLoader.queryLightCycle360(MasterImage.getImage().getActivity())); return true; } @@ -560,10 +574,11 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL final View imageShow = findViewById(R.id.imageShow); imageShow.setVisibility(View.VISIBLE); - Bitmap largeBitmap = mImageLoader.getOriginalBitmapLarge(); + Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge(); FilteringPipeline pipeline = FilteringPipeline.getPipeline(); pipeline.setOriginal(largeBitmap); - float previewScale = (float) largeBitmap.getWidth() / (float) mImageLoader.getOriginalBounds().width(); + float previewScale = (float) largeBitmap.getWidth() + / (float) MasterImage.getImage().getOriginalBounds().width(); pipeline.setPreviewScaleFactor(previewScale); if (!mShowingTinyPlanet) { mCategoryFiltersAdapter.removeTinyPlanet(); @@ -698,7 +713,7 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setType(SharedImageProvider.MIME_TYPE); - mSharedOutputFile = SaveCopyTask.getNewFile(this, mImageLoader.getUri()); + mSharedOutputFile = SaveCopyTask.getNewFile(this, MasterImage.getImage().getUri()); Uri uri = Uri.withAppendedPath(SharedImageProvider.CONTENT_URI, Uri.encode(mSharedOutputFile.getAbsolutePath())); intent.putExtra(Intent.EXTRA_STREAM, uri); @@ -752,16 +767,16 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL } FiltersManager.setResources(getResources()); if (!mLoading) { - Bitmap largeBitmap = mImageLoader.getOriginalBitmapLarge(); + Bitmap largeBitmap = MasterImage.getImage().getOriginalBitmapLarge(); FilteringPipeline pipeline = FilteringPipeline.getPipeline(); pipeline.setOriginal(largeBitmap); float previewScale = (float) largeBitmap.getWidth() / - (float) mImageLoader.getOriginalBounds().width(); + (float) MasterImage.getImage().getOriginalBounds().width(); pipeline.setPreviewScaleFactor(previewScale); - Bitmap highresBitmap = mImageLoader.getOriginalBitmapHighres(); + Bitmap highresBitmap = MasterImage.getImage().getOriginalBitmapHighres(); if (highresBitmap != null) { float highResPreviewScale = (float) highresBitmap.getWidth() / - (float) mImageLoader.getOriginalBounds().width(); + (float) MasterImage.getImage().getOriginalBounds().width(); pipeline.setHighResPreviewScaleFactor(highResPreviewScale); } pipeline.turnOnPipeline(true); @@ -847,8 +862,6 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL public void setDefaultPreset() { // Default preset (original) ImagePreset preset = new ImagePreset(); // empty - preset.setImageLoader(mImageLoader); - mMasterImage.setPreset(preset, preset.getLastRepresentation(), true); } @@ -905,7 +918,6 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL } public void setupMasterImage() { - mImageLoader = new ImageLoader(this, getApplicationContext()); HistoryManager historyManager = new HistoryManager(); StateAdapter imageStateAdapter = new StateAdapter(this, 0); @@ -914,7 +926,6 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL mMasterImage.setHistoryManager(historyManager); mMasterImage.setStateAdapter(imageStateAdapter); mMasterImage.setActivity(this); - mMasterImage.setImageLoader(mImageLoader); if (Runtime.getRuntime().maxMemory() > LIMIT_SUPPORTS_HIGHRES) { mMasterImage.setSupportsHighRes(true); diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java index 85cebab4d..ca8c7a392 100644 --- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java +++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java @@ -32,12 +32,9 @@ import android.util.Log; import com.adobe.xmp.XMPException; import com.adobe.xmp.XMPMeta; -import com.android.gallery3d.R; import com.android.gallery3d.common.Utils; import com.android.gallery3d.exif.ExifInterface; import com.android.gallery3d.filtershow.FilterShowActivity; -import com.android.gallery3d.filtershow.history.HistoryManager; -import com.android.gallery3d.filtershow.imageshow.ImageShow; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.ImagePreset; import com.android.gallery3d.filtershow.tools.SaveCopyTask; @@ -47,24 +44,10 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.util.Vector; -import java.util.concurrent.locks.ReentrantLock; - -// TODO: this class has waaaay to much bitmap copying. Cleanup. -public class ImageLoader { +public final class ImageLoader { private static final String LOGTAG = "ImageLoader"; - private final Vector mListeners = new Vector(); - private Bitmap mOriginalBitmapSmall = null; - private Bitmap mOriginalBitmapLarge = null; - private Bitmap mOriginalBitmapHighres = null; - private Bitmap mBackgroundBitmap = null; - - private int mOrientation = 0; - private HistoryManager mHistoryManager = null; - - private FilterShowActivity mActivity = null; public static final String JPEG_MIME_TYPE = "image/jpeg"; @@ -81,65 +64,11 @@ public class ImageLoader { public static final int ORI_TRANSVERSE = ExifInterface.Orientation.LEFT_BOTTOM; private static final int BITMAP_LOAD_BACKOUT_ATTEMPTS = 5; - private Context mContext = null; - private Uri mUri = null; - - private Rect mOriginalBounds = null; - private static int mZoomOrientation = ORI_NORMAL; - - static final int MAX_BITMAP_DIM = 900; - static final int SMALL_BITMAP_DIM = 160; - - private ReentrantLock mLoadingLock = new ReentrantLock(); - - public ImageLoader(FilterShowActivity activity, Context context) { - mActivity = activity; - mContext = context; - } - public static int getZoomOrientation() { - return mZoomOrientation; - } + public static final int MAX_BITMAP_DIM = 900; + public static final int SMALL_BITMAP_DIM = 160; - public FilterShowActivity getActivity() { - return mActivity; - } - - public void loadHighResBitmap() { - if (MasterImage.getImage().supportsHighRes()) { - int highresPreviewSize = mOriginalBitmapLarge.getWidth() * 2; - if (highresPreviewSize > mOriginalBounds.width()) { - highresPreviewSize = mOriginalBounds.width(); - } - mOriginalBitmapHighres = loadScaledBitmap(mUri, highresPreviewSize, false); - if (mOrientation > 1 && mOriginalBitmapHighres != null) { - mOriginalBitmapHighres = rotateToPortrait(mOriginalBitmapHighres, mOrientation); - } - warnListeners(); - } - } - - public boolean loadBitmap(Uri uri, int size) { - mLoadingLock.lock(); - mUri = uri; - mOrientation = getOrientation(mContext, uri); - mOriginalBitmapLarge = loadScaledBitmap(uri, size); - if (mOriginalBitmapLarge == null) { - mLoadingLock.unlock(); - return false; - } - updateBitmaps(); - mLoadingLock.unlock(); - return true; - } - - public Uri getUri() { - return mUri; - } - - public Rect getOriginalBounds() { - return mOriginalBounds; - } + private ImageLoader() {} public static int getOrientation(Context context, Uri uri) { if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { @@ -149,7 +78,6 @@ public class ImageLoader { } String path = uri.getPath(); int orientation = -1; - InputStream is = null; ExifInterface exif = new ExifInterface(); try { exif.readExif(path); @@ -194,22 +122,11 @@ public class ImageLoader { } } - private void updateBitmaps() { - if (mOrientation > 1) { - mOriginalBitmapLarge = rotateToPortrait(mOriginalBitmapLarge, mOrientation); - } - int sw = SMALL_BITMAP_DIM; - int sh = (int) (sw * (float) mOriginalBitmapLarge.getHeight() / (float) mOriginalBitmapLarge.getWidth()); - mOriginalBitmapSmall = Bitmap.createScaledBitmap(mOriginalBitmapLarge, sw, sh, true); - mZoomOrientation = mOrientation; - warnListeners(); - } - - public Bitmap decodeImage(int id, BitmapFactory.Options options) { - return BitmapFactory.decodeResource(mContext.getResources(), id, options); + public static Bitmap decodeImage(Context context, int id, BitmapFactory.Options options) { + return BitmapFactory.decodeResource(context.getResources(), id, options); } - public static Bitmap rotateToPortrait(Bitmap bitmap, int ori) { + public static Bitmap orientBitmap(Bitmap bitmap, int ori) { Matrix matrix = new Matrix(); int w = bitmap.getWidth(); int h = bitmap.getHeight(); @@ -254,10 +171,11 @@ public class ImageLoader { bitmap.getHeight(), matrix, true); } - private Bitmap loadRegionBitmap(Uri uri, BitmapFactory.Options options, Rect bounds) { + private static Bitmap loadRegionBitmap(Context context, Uri uri, BitmapFactory.Options options, + Rect bounds) { InputStream is = null; try { - is = mContext.getContentResolver().openInputStream(uri); + is = context.getContentResolver().openInputStream(uri); BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(is, false); Rect r = new Rect(0, 0, decoder.getWidth(), decoder.getHeight()); // return null if bounds are not entirely within the bitmap @@ -275,14 +193,20 @@ public class ImageLoader { return null; } - private Bitmap loadScaledBitmap(Uri uri, int size) { - return loadScaledBitmap(uri, size, true); + public static Bitmap loadOrientedScaledBitmap(MasterImage master, Context context, Uri uri, + int size, boolean enforceSize, int orientation) { + Bitmap bmap = loadScaledBitmap(master, context, uri, size, enforceSize); + if (bmap != null) { + bmap = orientBitmap(bmap, orientation); + } + return bmap; } - private Bitmap loadScaledBitmap(Uri uri, int size, boolean enforceSize) { + public static Bitmap loadScaledBitmap(MasterImage master, Context context, Uri uri, int size, + boolean enforceSize) { InputStream is = null; try { - is = mContext.getContentResolver().openInputStream(uri); + is = context.getContentResolver().openInputStream(uri); Log.v(LOGTAG, "loading uri " + uri.getPath() + " input stream: " + is); BitmapFactory.Options o = new BitmapFactory.Options(); @@ -292,7 +216,7 @@ public class ImageLoader { int width_tmp = o.outWidth; int height_tmp = o.outHeight; - mOriginalBounds = new Rect(0, 0, width_tmp, height_tmp); + master.setOriginalBounds(new Rect(0, 0, width_tmp, height_tmp)); int scale = 1; while (true) { @@ -317,7 +241,7 @@ public class ImageLoader { o2.inMutable = true; Utils.closeSilently(is); - is = mContext.getContentResolver().openInputStream(uri); + is = context.getContentResolver().openInputStream(uri); return BitmapFactory.decodeStream(is, null, o2); } catch (FileNotFoundException e) { Log.e(LOGTAG, "FileNotFoundException: " + uri); @@ -329,53 +253,8 @@ public class ImageLoader { return null; } - public Bitmap getBackgroundBitmap(Resources resources) { - if (mBackgroundBitmap == null) { - mBackgroundBitmap = BitmapFactory.decodeResource(resources, - R.drawable.filtershow_background); - } - return mBackgroundBitmap; - - } - - public Bitmap getOriginalBitmapSmall() { - return mOriginalBitmapSmall; - } - - public Bitmap getOriginalBitmapLarge() { - return mOriginalBitmapLarge; - } - - public Bitmap getOriginalBitmapHighres() { - return mOriginalBitmapHighres; - } - - public void addListener(ImageShow imageShow) { - mLoadingLock.lock(); - if (!mListeners.contains(imageShow)) { - mListeners.add(imageShow); - } - mLoadingLock.unlock(); - } - - private void warnListeners() { - mActivity.runOnUiThread(mWarnListenersRunnable); - } - - private Runnable mWarnListenersRunnable = new Runnable() { - - @Override - public void run() { - for (int i = 0; i < mListeners.size(); i++) { - ImageShow imageShow = mListeners.elementAt(i); - imageShow.imageLoaded(); - } - MasterImage.getImage().invalidatePreview(); - } - }; - - public Bitmap getScaleOneImageForPreset(Rect bounds, Rect destination) { - mLoadingLock.lock(); + public static Bitmap getScaleOneImageForPreset(Context context, Uri uri, Rect bounds, + Rect destination) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inMutable = true; if (destination != null) { @@ -389,23 +268,23 @@ public class ImageLoader { options.inSampleSize = sampleSize; } } - Bitmap bmp = loadRegionBitmap(mUri, options, bounds); - mLoadingLock.unlock(); + Bitmap bmp = loadRegionBitmap(context, uri, options, bounds); return bmp; } - public void saveImage(ImagePreset preset, final FilterShowActivity filterShowActivity, + public static void saveImage(ImagePreset preset, final FilterShowActivity filterShowActivity, File destination) { Uri selectedImageUri = filterShowActivity.getSelectedImageUri(); - new SaveCopyTask(mContext, mUri, selectedImageUri, destination, + new SaveCopyTask(filterShowActivity, MasterImage.getImage().getUri(), selectedImageUri, + destination, new SaveCopyTask.Callback() { - @Override - public void onComplete(Uri result) { - filterShowActivity.completeSaveImage(result); - } + @Override + public void onComplete(Uri result) { + filterShowActivity.completeSaveImage(result); + } - }).execute(preset); + }).execute(preset); } public static Bitmap loadMutableBitmap(Context context, Uri sourceUri) { @@ -424,7 +303,7 @@ public class ImageLoader { return null; } int orientation = ImageLoader.getOrientation(context, sourceUri); - bitmap = ImageLoader.rotateToPortrait(bitmap, orientation); + bitmap = ImageLoader.orientBitmap(bitmap, orientation); return bitmap; } @@ -503,17 +382,10 @@ public class ImageLoader { return bmap; } - public void setHistoryManager(HistoryManager historyManager) { - mHistoryManager = historyManager; - } - - public HistoryManager getHistory() { - return mHistoryManager; - } - - public XMPMeta getXmpObject() { + public static XMPMeta getXmpObject(Context context) { try { - InputStream is = mContext.getContentResolver().openInputStream(getUri()); + InputStream is = context.getContentResolver().openInputStream( + MasterImage.getImage().getUri()); return XmpUtilHelper.extractXMPMeta(is); } catch (FileNotFoundException e) { return null; @@ -525,15 +397,14 @@ public class ImageLoader { * * @return true if it is a light Cycle image that is full 360 */ - public boolean queryLightCycle360() { + public static boolean queryLightCycle360(Context context) { InputStream is = null; try { - is = mContext.getContentResolver().openInputStream(getUri()); + is = context.getContentResolver().openInputStream(MasterImage.getImage().getUri()); XMPMeta meta = XmpUtilHelper.extractXMPMeta(is); if (meta == null) { return false; } - String name = meta.getPacketHeader(); String namespace = "http://ns.google.com/photos/1.0/panorama/"; String cropWidthName = "GPano:CroppedAreaImageWidthPixels"; String fullWidthName = "GPano:FullPanoWidthPixels"; diff --git a/src/com/android/gallery3d/filtershow/editors/Editor.java b/src/com/android/gallery3d/filtershow/editors/Editor.java index 7d395ef37..9539d651b 100644 --- a/src/com/android/gallery3d/filtershow/editors/Editor.java +++ b/src/com/android/gallery3d/filtershow/editors/Editor.java @@ -188,10 +188,6 @@ public class Editor implements OnSeekBarChangeListener, SwapButton.SwapButtonLis return mImageShow; } - public void setImageLoader(ImageLoader imageLoader) { - mImageShow.setImageLoader(imageLoader); - } - public void setVisibility(int visible) { mView.setVisibility(visible); } diff --git a/src/com/android/gallery3d/filtershow/editors/EditorCrop.java b/src/com/android/gallery3d/filtershow/editors/EditorCrop.java index 24a83cd46..ec6e30b7e 100644 --- a/src/com/android/gallery3d/filtershow/editors/EditorCrop.java +++ b/src/com/android/gallery3d/filtershow/editors/EditorCrop.java @@ -28,7 +28,6 @@ import android.widget.PopupMenu; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.crop.CropExtras; import com.android.gallery3d.filtershow.imageshow.ImageCrop; -import com.android.gallery3d.filtershow.imageshow.MasterImage; public class EditorCrop extends Editor implements EditorInfo { public static final int ID = R.id.editorCrop; @@ -53,7 +52,7 @@ public class EditorCrop extends Editor implements EditorInfo { mImageCrop = new ImageCrop(context); } mView = mImageShow = mImageCrop; - mImageCrop.setImageLoader(MasterImage.getImage().getImageLoader()); + mImageCrop.bindAsImageLoadListener(); mImageCrop.setEditor(this); mImageCrop.syncLocalToMasterGeometry(); mImageCrop.setCropActionFlag(mCropActionFlag); diff --git a/src/com/android/gallery3d/filtershow/editors/EditorFlip.java b/src/com/android/gallery3d/filtershow/editors/EditorFlip.java index de6240c7a..67070045b 100644 --- a/src/com/android/gallery3d/filtershow/editors/EditorFlip.java +++ b/src/com/android/gallery3d/filtershow/editors/EditorFlip.java @@ -25,7 +25,6 @@ import android.widget.LinearLayout; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.imageshow.ImageFlip; -import com.android.gallery3d.filtershow.imageshow.MasterImage; public class EditorFlip extends Editor implements EditorInfo { public static final String LOGTAG = "EditorFlip"; @@ -43,7 +42,7 @@ public class EditorFlip extends Editor implements EditorInfo { mImageFlip = new ImageFlip(context); } mView = mImageShow = mImageFlip; - mImageFlip.setImageLoader(MasterImage.getImage().getImageLoader()); + mImageFlip.bindAsImageLoadListener(); mImageFlip.setEditor(this); mImageFlip.syncLocalToMasterGeometry(); } diff --git a/src/com/android/gallery3d/filtershow/editors/EditorRotate.java b/src/com/android/gallery3d/filtershow/editors/EditorRotate.java index a637c08ff..e66be2cc1 100644 --- a/src/com/android/gallery3d/filtershow/editors/EditorRotate.java +++ b/src/com/android/gallery3d/filtershow/editors/EditorRotate.java @@ -25,7 +25,6 @@ import android.widget.LinearLayout; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.imageshow.ImageRotate; -import com.android.gallery3d.filtershow.imageshow.MasterImage; public class EditorRotate extends Editor implements EditorInfo { public static final String LOGTAG = "EditorRotate"; @@ -43,7 +42,7 @@ public class EditorRotate extends Editor implements EditorInfo { mImageRotate = new ImageRotate(context); } mView = mImageShow = mImageRotate; - mImageRotate.setImageLoader(MasterImage.getImage().getImageLoader()); + mImageRotate.bindAsImageLoadListener(); mImageRotate.setEditor(this); mImageRotate.syncLocalToMasterGeometry(); } diff --git a/src/com/android/gallery3d/filtershow/editors/EditorStraighten.java b/src/com/android/gallery3d/filtershow/editors/EditorStraighten.java index dbc6ca05d..40333aa00 100644 --- a/src/com/android/gallery3d/filtershow/editors/EditorStraighten.java +++ b/src/com/android/gallery3d/filtershow/editors/EditorStraighten.java @@ -23,7 +23,6 @@ import android.widget.FrameLayout; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; import com.android.gallery3d.filtershow.imageshow.ImageStraighten; -import com.android.gallery3d.filtershow.imageshow.MasterImage; public class EditorStraighten extends Editor implements EditorInfo { public static final int ID = R.id.editorStraighten; @@ -50,7 +49,7 @@ public class EditorStraighten extends Editor implements EditorInfo { mImageStraighten = new ImageStraighten(context); } mView = mImageShow = mImageStraighten; - mImageStraighten.setImageLoader(MasterImage.getImage().getImageLoader()); + mImageStraighten.bindAsImageLoadListener(); mImageStraighten.setEditor(this); mImageStraighten.syncLocalToMasterGeometry(); } diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java index 05fdffbf7..050dc436b 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java @@ -23,6 +23,7 @@ import android.support.v8.renderscript.Allocation; import android.widget.Toast; import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; +import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.FilterEnvironment; import com.android.gallery3d.filtershow.pipeline.ImagePreset; @@ -91,8 +92,8 @@ public abstract class ImageFilter implements Cloneable { ImagePreset preset = getEnvironment().getImagePreset(); GeometryMetadata geo = getEnvironment().getImagePreset().getGeometry(); Matrix originalToScreen = geo.getOriginalToScreen(true, - preset.getImageLoader().getOriginalBounds().width(), - preset.getImageLoader().getOriginalBounds().height(), + MasterImage.getImage().getOriginalBounds().width(), + MasterImage.getImage().getOriginalBounds().height(), w, h); return originalToScreen; } diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java index 20ed96cfd..efb9cde71 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java @@ -22,6 +22,7 @@ import android.graphics.Rect; import com.android.gallery3d.R; import com.android.gallery3d.filtershow.cache.ImageLoader; +import com.android.gallery3d.filtershow.imageshow.MasterImage; public class ImageFilterDownsample extends SimpleImageFilter { private static final String SERIALIZATION_NAME = "DOWNSAMPLE"; @@ -58,7 +59,7 @@ public class ImageFilterDownsample extends SimpleImageFilter { int p = getParameters().getValue(); // size of original precached image - Rect size = mImageLoader.getOriginalBounds(); + Rect size = MasterImage.getImage().getOriginalBounds(); int orig_w = size.width(); int orig_h = size.height(); diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java index 2f1bbb0c7..0458a2221 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDraw.java @@ -29,6 +29,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import com.android.gallery3d.R; +import com.android.gallery3d.filtershow.cache.ImageLoader; import com.android.gallery3d.filtershow.filters.FilterDrawRepresentation.StrokeData; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.FilterEnvironment; @@ -127,11 +128,13 @@ public class ImageFilterDraw extends ImageFilter { public Brush(int brushID) { mBrushID = brushID; } + public Bitmap getBrush() { if (mBrush == null) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.ALPHA_8; - mBrush = MasterImage.getImage().getImageLoader().decodeImage(mBrushID, opt); + mBrush = ImageLoader.decodeImage(MasterImage.getImage().getActivity(), mBrushID, + opt); mBrush = mBrush.extractAlpha(); } return mBrush; diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java index 6022ddac2..77250bd7a 100644 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterTinyPlanet.java @@ -23,6 +23,8 @@ import android.graphics.RectF; import com.adobe.xmp.XMPException; import com.adobe.xmp.XMPMeta; import com.android.gallery3d.app.Log; +import com.android.gallery3d.filtershow.cache.ImageLoader; +import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.pipeline.ImagePreset; /** @@ -77,7 +79,7 @@ public class ImageFilterTinyPlanet extends SimpleImageFilter { ImagePreset preset = getEnvironment().getImagePreset(); Bitmap mBitmapOut = null; if (preset != null) { - XMPMeta xmp = preset.getImageLoader().getXmpObject(); + XMPMeta xmp = ImageLoader.getXmpObject(MasterImage.getImage().getActivity()); // Do nothing, just use bitmapIn as is if we don't have XMP. if(xmp != null) { bitmapIn = applyXmp(bitmapIn, xmp, w); diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java index af18372eb..0d0ed5f46 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java +++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java @@ -339,7 +339,7 @@ public class GeometryMetadata extends FilterRepresentation { float imageWidth = cropBounds.width(); float imageHeight = cropBounds.height(); - int orientation = ImageLoader.getZoomOrientation(); + int orientation = MasterImage.getImage().getZoomOrientation(); Matrix imageRotation = getMatrixOriginalOrientation(orientation, originalWidth, originalHeight); if (orientation == ImageLoader.ORI_ROTATE_90 || diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index 73a1ebf7d..8b9d57cb9 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -175,12 +175,12 @@ public class ImageShow extends View implements OnGestureListener, protected Matrix getImageToScreenMatrix(boolean reflectRotation) { GeometryMetadata geo = getImagePreset().getGeometry(); if (geo == null || mImageLoader == null - || mImageLoader.getOriginalBounds() == null) { + || MasterImage.getImage().getOriginalBounds() == null) { return new Matrix(); } Matrix m = geo.getOriginalToScreen(reflectRotation, - mImageLoader.getOriginalBounds().width(), - mImageLoader.getOriginalBounds().height(), getWidth(), getHeight()); + MasterImage.getImage().getOriginalBounds().width(), + MasterImage.getImage().getOriginalBounds().height(), getWidth(), getHeight()); Point translate = MasterImage.getImage().getTranslation(); float scaleFactor = MasterImage.getImage().getScaleFactor(); m.postTranslate(translate.x, translate.y); @@ -360,12 +360,8 @@ public class ImageShow extends View implements OnGestureListener, canvas.restore(); } - public void setImageLoader(ImageLoader loader) { - mImageLoader = loader; - if (mImageLoader != null) { - mImageLoader.addListener(this); - MasterImage.getImage().setImageLoader(mImageLoader); - } + public void bindAsImageLoadListener() { + MasterImage.getImage().addListener(this); } private void imageSizeChanged(Bitmap image) { @@ -386,7 +382,7 @@ public class ImageShow extends View implements OnGestureListener, public void updateImage() { invalidate(); - Bitmap bitmap = mImageLoader.getOriginalBitmapLarge(); + Bitmap bitmap = MasterImage.getImage().getOriginalBitmapLarge(); if (bitmap != null) { imageSizeChanged(bitmap); } @@ -398,7 +394,7 @@ public class ImageShow extends View implements OnGestureListener, } public void saveImage(FilterShowActivity filterShowActivity, File file) { - mImageLoader.saveImage(getImagePreset(), filterShowActivity, file); + ImageLoader.saveImage(getImagePreset(), filterShowActivity, file); } diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageVignette.java b/src/com/android/gallery3d/filtershow/imageshow/ImageVignette.java index 7ce9e5186..518969ee1 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageVignette.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageVignette.java @@ -108,8 +108,8 @@ public class ImageVignette extends ImageShow { float[] c = new float[] { mVignetteRep.getCenterX(), mVignetteRep.getCenterY() }; if (Float.isNaN(c[0])) { - float cx = mImageLoader.getOriginalBounds().width() / 2; - float cy = mImageLoader.getOriginalBounds().height() / 2; + float cx = MasterImage.getImage().getOriginalBounds().width() / 2; + float cy = MasterImage.getImage().getOriginalBounds().height() / 2; float rx = Math.min(cx, cy) * .8f; float ry = rx; mVignetteRep.setCenter(cx, cy); diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index 0890b7cd0..7b11cf35e 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -21,6 +21,7 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; +import android.net.Uri; import android.os.Handler; import android.os.Message; @@ -43,6 +44,8 @@ import java.util.Vector; public class MasterImage implements RenderingRequestCaller { + + private static final String LOGTAG = "MasterImage"; private boolean DEBUG = false; private static final boolean DISABLEZOOM = false; @@ -59,12 +62,20 @@ public class MasterImage implements RenderingRequestCaller { private SharedBuffer mPreviewBuffer = new SharedBuffer(); private SharedPreset mPreviewPreset = new SharedPreset(); + private Bitmap mOriginalBitmapSmall = null; + private Bitmap mOriginalBitmapLarge = null; + private Bitmap mOriginalBitmapHighres = null; + private int mOrientation; + private Rect mOriginalBounds; + private final Vector mLoadListeners = new Vector(); + private Uri mUri = null; + private int mZoomOrientation = ImageLoader.ORI_NORMAL; + private Bitmap mGeometryOnlyBitmap = null; private Bitmap mFiltersOnlyBitmap = null; private Bitmap mPartialBitmap = null; private Bitmap mHighresBitmap = null; - private ImageLoader mLoader = null; private HistoryManager mHistory = null; private StateAdapter mState = null; @@ -114,6 +125,84 @@ public class MasterImage implements RenderingRequestCaller { return sMasterImage; } + public Bitmap getOriginalBitmapSmall() { + return mOriginalBitmapSmall; + } + + public Bitmap getOriginalBitmapLarge() { + return mOriginalBitmapLarge; + } + + public Bitmap getOriginalBitmapHighres() { + return mOriginalBitmapHighres; + } + + public void setOriginalBitmapHighres(Bitmap mOriginalBitmapHighres) { + this.mOriginalBitmapHighres = mOriginalBitmapHighres; + } + + public int getOrientation() { + return mOrientation; + } + + public Rect getOriginalBounds() { + return mOriginalBounds; + } + + public void setOriginalBounds(Rect r) { + mOriginalBounds = r; + } + + public Uri getUri() { + return mUri; + } + + public void setUri(Uri uri) { + mUri = uri; + } + + public int getZoomOrientation() { + return mZoomOrientation; + } + + public void addListener(ImageShow imageShow) { + if (!mLoadListeners.contains(imageShow)) { + mLoadListeners.add(imageShow); + } + } + + public void warnListeners() { + mActivity.runOnUiThread(mWarnListenersRunnable); + } + + private Runnable mWarnListenersRunnable = new Runnable() { + @Override + public void run() { + for (int i = 0; i < mLoadListeners.size(); i++) { + ImageShow imageShow = mLoadListeners.elementAt(i); + imageShow.imageLoaded(); + } + invalidatePreview(); + } + }; + + public boolean loadBitmap(Uri uri, int size) { + setUri(uri); + mOrientation = ImageLoader.getOrientation(mActivity, uri); + mOriginalBitmapLarge = ImageLoader.loadOrientedScaledBitmap(this, mActivity, uri, size, + true, mOrientation); + if (mOriginalBitmapLarge == null) { + return false; + } + int sw = ImageLoader.SMALL_BITMAP_DIM; + int sh = (int) (sw * (float) mOriginalBitmapLarge.getHeight() / (float) mOriginalBitmapLarge + .getWidth()); + mOriginalBitmapSmall = Bitmap.createScaledBitmap(mOriginalBitmapLarge, sw, sh, true); + mZoomOrientation = mOrientation; + warnListeners(); + return true; + } + public void setSupportsHighRes(boolean value) { mSupportsHighRes = value; } @@ -129,8 +218,8 @@ public class MasterImage implements RenderingRequestCaller { mActivity = activity; } - public ImageLoader getLoader() { - return mLoader; + public FilterShowActivity getActivity() { + return mActivity; } public synchronized ImagePreset getPreset() { @@ -152,7 +241,6 @@ public class MasterImage implements RenderingRequestCaller { preset.showFilters(); } mPreset = preset; - mPreset.setImageLoader(mLoader); setGeometry(); mPreset.fillImageStateAdapter(mState); if (addToHistory) { @@ -169,7 +257,7 @@ public class MasterImage implements RenderingRequestCaller { } private void setGeometry() { - Bitmap image = mLoader.getOriginalBitmapLarge(); + Bitmap image = getOriginalBitmapLarge(); if (image == null) { return; } @@ -211,14 +299,6 @@ public class MasterImage implements RenderingRequestCaller { mState = adapter; } - public void setImageLoader(ImageLoader loader) { - mLoader = loader; - } - - public ImageLoader getImageLoader() { - return mLoader; - } - public void setCurrentFilter(ImageFilter filter) { mCurrentFilter = filter; } @@ -304,7 +384,7 @@ public class MasterImage implements RenderingRequestCaller { if (force || mGeometryOnlyPreset == null || !newPreset.same(mGeometryOnlyPreset)) { mGeometryOnlyPreset = newPreset; - RenderingRequest.post(mLoader.getOriginalBitmapLarge(), + RenderingRequest.post(getOriginalBitmapLarge(), mGeometryOnlyPreset, RenderingRequest.GEOMETRY_RENDERING, this); } } @@ -315,7 +395,7 @@ public class MasterImage implements RenderingRequestCaller { if (force || mFiltersOnlyPreset == null || !newPreset.same(mFiltersOnlyPreset)) { mFiltersOnlyPreset = newPreset; - RenderingRequest.post(mLoader.getOriginalBitmapLarge(), + RenderingRequest.post(MasterImage.getImage().getOriginalBitmapLarge(), mFiltersOnlyPreset, RenderingRequest.FILTERS_RENDERING, this); } } @@ -369,14 +449,13 @@ public class MasterImage implements RenderingRequestCaller { private Matrix getImageToScreenMatrix(boolean reflectRotation) { GeometryMetadata geo = mPreset.getGeometry(); - if (geo == null || mLoader == null - || mLoader.getOriginalBounds() == null + if (geo == null || getOriginalBounds() == null || mImageShowSize.x == 0) { return new Matrix(); } Matrix m = geo.getOriginalToScreen(reflectRotation, - mLoader.getOriginalBounds().width(), - mLoader.getOriginalBounds().height(), mImageShowSize.x, mImageShowSize.y); + getOriginalBounds().width(), + getOriginalBounds().height(), mImageShowSize.x, mImageShowSize.y); Point translate = getTranslation(); float scaleFactor = getScaleFactor(); m.postTranslate(translate.x, translate.y); @@ -518,11 +597,11 @@ public class MasterImage implements RenderingRequestCaller { } public Bitmap getThumbnailBitmap() { - return mLoader.getOriginalBitmapSmall(); + return getOriginalBitmapSmall(); } public Bitmap getLargeThumbnailBitmap() { - return mLoader.getOriginalBitmapLarge(); + return getOriginalBitmapLarge(); } public float getMaxScaleFactor() { diff --git a/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java b/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java index 88cf8ede2..a7580a835 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java +++ b/src/com/android/gallery3d/filtershow/pipeline/CachingPipeline.java @@ -238,12 +238,9 @@ public class CachingPipeline implements PipelineInterface { mFiltersManager.freeFilterResources(preset); if (request.getType() == RenderingRequest.PARTIAL_RENDERING) { - ImageLoader loader = MasterImage.getImage().getImageLoader(); - if (loader == null) { - Log.w(LOGTAG, "loader not yet setup, cannot handle: " + getType(request)); - return; - } - bitmap = loader.getScaleOneImageForPreset(request.getBounds(), + MasterImage master = MasterImage.getImage(); + bitmap = ImageLoader.getScaleOneImageForPreset(master.getActivity(), + master.getUri(), request.getBounds(), request.getDestination()); if (bitmap == null) { Log.w(LOGTAG, "could not get bitmap for: " + getType(request)); @@ -252,8 +249,7 @@ public class CachingPipeline implements PipelineInterface { } if (request.getType() == RenderingRequest.HIGHRES_RENDERING) { - ImageLoader loader = MasterImage.getImage().getImageLoader(); - bitmap = loader.getOriginalBitmapHighres(); + bitmap = MasterImage.getImage().getOriginalBitmapHighres(); if (bitmap != null) { bitmap = preset.applyGeometry(bitmap, mEnvironment); } diff --git a/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java b/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java index 1fec62197..a302b1907 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java +++ b/src/com/android/gallery3d/filtershow/pipeline/FilteringPipeline.java @@ -169,8 +169,7 @@ public class FilteringPipeline implements Handler.Callback { } if (request.getType() == RenderingRequest.HIGHRES_RENDERING) { type = COMPUTE_HIGHRES_RENDERING_REQUEST; - ImageLoader imageLoader = MasterImage.getImage().getImageLoader(); - if (imageLoader.getOriginalBitmapHighres() == null) { + if (MasterImage.getImage().getOriginalBitmapHighres() == null) { return; } } diff --git a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java index c78bc1ef4..78a4d211d 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java @@ -46,8 +46,6 @@ public class ImagePreset { private static final String LOGTAG = "ImagePreset"; - private ImageLoader mImageLoader = null; - private Vector mFilters = new Vector(); protected boolean mIsFxPreset = false; @@ -81,7 +79,6 @@ public class ImagePreset { } catch (java.lang.CloneNotSupportedException e) { Log.v(LOGTAG, "Exception trying to clone: " + e); } - mImageLoader = source.getImageLoader(); } public FilterRepresentation getFilterRepresentation(int position) { @@ -226,14 +223,6 @@ public class ImagePreset { } } - public ImageLoader getImageLoader() { - return mImageLoader; - } - - public void setImageLoader(ImageLoader mImageLoader) { - this.mImageLoader = mImageLoader; - } - public boolean equals(ImagePreset preset) { if (!same(preset)) { return false; @@ -525,7 +514,7 @@ public class ImagePreset { } public boolean canDoPartialRendering() { - if (ImageLoader.getZoomOrientation() != ImageLoader.ORI_NORMAL) { + if (MasterImage.getImage().getZoomOrientation() != ImageLoader.ORI_NORMAL) { return false; } for (int i = 0; i < mFilters.size(); i++) { diff --git a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java index 8306f388c..c2d3f1b50 100644 --- a/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java +++ b/src/com/android/gallery3d/filtershow/pipeline/RenderingRequest.java @@ -70,7 +70,6 @@ public class RenderingRequest { request.setBitmap(bitmap); ImagePreset passedPreset = new ImagePreset(preset); - passedPreset.setImageLoader(MasterImage.getImage().getImageLoader()); request.setOriginalImagePreset(preset); request.setScaleFactor(MasterImage.getImage().getScaleFactor()); -- cgit v1.2.3