diff --git a/src/com/android/gallery3d/filtershow/cache/DelayedPresetCache.java b/src/com/android/gallery3d/filtershow/cache/DelayedPresetCache.java
index 8acb539..361190b 100644
--- a/src/com/android/gallery3d/filtershow/cache/DelayedPresetCache.java
+++ b/src/com/android/gallery3d/filtershow/cache/DelayedPresetCache.java
@@ -14,7 +14,7 @@
     private final static int COMPUTE_PRESET = 1;
 
     private Handler mProcessingHandler = null;
-    private Handler mUIHandler = new Handler() {
+    private final Handler mUIHandler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
@@ -41,13 +41,14 @@
         return false;
     }
 
-    public DelayedPresetCache(int size) {
-        super(size);
+    public DelayedPresetCache(ImageLoader loader, int size) {
+        super(loader, size);
         mHandlerThread = new HandlerThread("ImageProcessing", Process.THREAD_PRIORITY_BACKGROUND);
         mHandlerThread.start();
         mProcessingHandler = new Handler(mHandlerThread.getLooper(), this);
     }
 
+    @Override
     protected void willCompute(CachedPreset cache) {
         if (cache == null) {
             return;
diff --git a/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java b/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java
index 1ba8356..67bd49b 100644
--- a/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java
+++ b/src/com/android/gallery3d/filtershow/cache/DirectPresetCache.java
@@ -1,23 +1,23 @@
 
 package com.android.gallery3d.filtershow.cache;
 
-import java.util.Vector;
-
 import android.graphics.Bitmap;
-import android.util.Log;
 
 import com.android.gallery3d.filtershow.imageshow.ImageShow;
 import com.android.gallery3d.filtershow.presets.ImagePreset;
 
+import java.util.Vector;
+
 public class DirectPresetCache implements Cache {
 
     private static final String LOGTAG = "DirectPresetCache";
     private Bitmap mOriginalBitmap = null;
-    private Vector<ImageShow> mObservers = new Vector<ImageShow>();
-    private Vector<CachedPreset> mCache = new Vector<CachedPreset>();
+    private final Vector<ImageShow> mObservers = new Vector<ImageShow>();
+    private final Vector<CachedPreset> mCache = new Vector<CachedPreset>();
     private int mCacheSize = 1;
-    private Bitmap.Config mBitmapConfig = Bitmap.Config.ARGB_8888;
+    private final Bitmap.Config mBitmapConfig = Bitmap.Config.ARGB_8888;
     private long mGlobalAge = 0;
+    private ImageLoader mLoader = null;
 
     protected class CachedPreset {
         private Bitmap mBitmap = null;
@@ -34,10 +34,12 @@
         }
     }
 
-    public DirectPresetCache(int size) {
+    public DirectPresetCache(ImageLoader loader, int size) {
+        mLoader = loader;
         mCacheSize = size;
     }
 
+    @Override
     public void setOriginalBitmap(Bitmap bitmap) {
         mOriginalBitmap = bitmap;
         notifyObservers();
@@ -50,6 +52,7 @@
         }
     }
 
+    @Override
     public void addObserver(ImageShow observer) {
         if (!mObservers.contains(observer)) {
             mObservers.add(observer);
@@ -66,6 +69,7 @@
         return null;
     }
 
+    @Override
     public Bitmap get(ImagePreset preset) {
         // Log.v(LOGTAG, "get preset " + preset.name() + " : " + preset);
         CachedPreset cache = getCachedPreset(preset);
@@ -77,6 +81,7 @@
         return null;
     }
 
+    @Override
     public void reset(ImagePreset preset) {
         CachedPreset cache = getCachedPreset(preset);
         if (cache != null && !cache.mBusy) {
@@ -120,10 +125,16 @@
     protected void compute(CachedPreset cache) {
         cache.mBitmap = null;
         cache.mBitmap = mOriginalBitmap.copy(mBitmapConfig, true);
-        cache.mPreset.apply(cache.mBitmap);
+        float scaleFactor = (float) cache.mBitmap.getWidth() / (float) mLoader.getOriginalBounds().width();
+        if (scaleFactor < 1.0f) {
+            cache.mPreset.setIsHighQuality(false);
+        }
+        cache.mPreset.setScaleFactor(scaleFactor);
+        cache.mBitmap = cache.mPreset.apply(cache.mBitmap);
         cache.mAge = mGlobalAge++;
     }
 
+    @Override
     public void prepare(ImagePreset preset) {
         // Log.v(LOGTAG, "prepare preset " + preset.name() + " : " + preset);
         CachedPreset cache = getCachedPreset(preset);
diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
index 8dd81d4..c0c3103 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -32,6 +32,9 @@
     protected boolean mVerticalFlip = false;
     protected RectF mCrop = null;
 
+    private float mScaleFactor = 1.0f;
+    private boolean mIsHighQuality = false;
+
     public ImagePreset() {
         setup();
     }
@@ -50,6 +53,9 @@
 
         mStraightenRotate = source.mStraightenRotate;
         mStraightenZoom = source.mStraightenZoom;
+
+        mScaleFactor = source.mScaleFactor;
+        mIsHighQuality = source.mIsHighQuality;
     }
 
     public void setStraightenRotation(float rotate, float zoom) {
@@ -57,7 +63,7 @@
         mStraightenZoom = zoom;
     }
 
-    private Bitmap applyGeometry(Bitmap original) {
+    private Bitmap applyGeometry(Bitmap original, float scaleFactor, boolean highQuality) {
         Bitmap bitmap = original;
 
         if (mFullRotate != FullRotate.ZERO) {
@@ -67,7 +73,7 @@
         if (mStraightenRotate != 0) {
             // TODO: keep the instances around
             ImageFilter straighten = new ImageFilterStraighten(mStraightenRotate, mStraightenZoom);
-            straighten.apply(bitmap);
+            bitmap = straighten.apply(bitmap, scaleFactor, highQuality);
             straighten = null;
         }
 
@@ -154,7 +160,7 @@
 
     public Bitmap apply(Bitmap original) {
         // First we apply any transform -- 90 rotate, flip, straighten, crop
-        Bitmap bitmap = applyGeometry(original);
+        Bitmap bitmap = applyGeometry(original, mScaleFactor, mIsHighQuality);
 
         // TODO -- apply borders separately
         ImageFilter borderFilter = null;
@@ -164,11 +170,11 @@
                 // TODO don't use the name as an id
                 borderFilter = filter;
             } else {
-                filter.apply(bitmap);
+                bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality);
             }
         }
         if (borderFilter != null) {
-            borderFilter.apply(bitmap);
+            bitmap = borderFilter.apply(bitmap, mScaleFactor, mIsHighQuality);
         }
         if (mEndPoint != null) {
             mEndPoint.updateFilteredImage(bitmap);
@@ -185,4 +191,19 @@
         imageStateAdapter.notifyDataSetChanged();
     }
 
+    public float getScaleFactor() {
+        return mScaleFactor;
+    }
+
+    public boolean isHighQuality() {
+        return mIsHighQuality;
+    }
+
+    public void setIsHighQuality(boolean value) {
+        mIsHighQuality = value;
+    }
+
+    public void setScaleFactor(float value) {
+        mScaleFactor = value;
+    }
 }
