OSDN Git Service

Simplify and speed up thumbnail creation
authornicolasroard <nicolasroard@google.com>
Tue, 5 Mar 2013 02:44:14 +0000 (18:44 -0800)
committernicolasroard <nicolasroard@google.com>
Tue, 5 Mar 2013 02:56:47 +0000 (18:56 -0800)
Change-Id: I1423573c600a807081f81d3cb3036b690e426f9e

src/com/android/gallery3d/filtershow/FilterShowActivity.java
src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
src/com/android/gallery3d/filtershow/ui/FilterIconButton.java

index e5d3ac6..90c909c 100644 (file)
@@ -352,6 +352,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
         ImageShow.setOriginalTextSize((int) getPixelsFromDip(18));
         ImageShow.setOriginalText(res.getString(R.string.original_picture_text));
         mIconSeedSize = res.getDimensionPixelSize(R.dimen.thumbnail_size);
+        // TODO: pick correct value
+        // MasterImage.setIconSeedSize(mIconSeedSize);
 
         Drawable curveHandle = res.getDrawable(R.drawable.camera_crop);
         int curveHandleSize = (int) res.getDimension(R.dimen.crop_indicator_size);
index f96d94a..e93c371 100644 (file)
@@ -35,8 +35,11 @@ import java.util.Vector;
 public class MasterImage implements RenderingRequestCaller {
 
     private static final String LOGTAG = "MasterImage";
+    private boolean DEBUG  = false;
 
     private static MasterImage sMasterImage = null;
+    private static int sIconSeedSize = 128;
+    private Bitmap mThumbnailBitmap;
 
     private ImageFilter mCurrentFilter = null;
     private ImagePreset mPreset = null;
@@ -91,6 +94,10 @@ public class MasterImage implements RenderingRequestCaller {
         return sMasterImage;
     }
 
+    public static void setIconSeedSize(int iconSeedSize) {
+        sIconSeedSize = iconSeedSize;
+    }
+
     public void addObserver(ImageShow observer) {
         if (mObservers.contains(observer)) {
             return;
@@ -368,11 +375,59 @@ public class MasterImage implements RenderingRequestCaller {
 
     public void hasNewGeometry() {
         updatePresets(true);
+        computeThumbnailBitmap();
         for (GeometryListener listener : mGeometryListeners) {
             listener.geometryChanged();
         }
     }
 
+    private Bitmap createSquareImage(Bitmap dst, Bitmap image, Rect destination) {
+        if (image != null) {
+            Canvas canvas = new Canvas(dst);
+            int iw = image.getWidth();
+            int ih = image.getHeight();
+            int x = 0;
+            int y = 0;
+            int size = 0;
+            Rect source = null;
+            if (iw > ih) {
+                size = ih;
+                x = (int) ((iw - size) / 2.0f);
+                y = 0;
+            } else {
+                size = iw;
+                x = 0;
+                y = (int) ((ih - size) / 2.0f);
+            }
+            source = new Rect(x, y, x + size, y + size);
+            canvas.drawBitmap(image, source, destination, new Paint());
+        }
+        return dst;
+    }
+
+    public void computeThumbnailBitmap() {
+        Bitmap bmap = mLoader.getOriginalBitmapSmall();
+        if (bmap == null) {
+            return;
+        }
+        ImagePreset geoPreset = new ImagePreset(MasterImage.getImage().getGeometryPreset());
+        bmap = geoPreset.applyGeometry(bmap);
+        float w = bmap.getWidth();
+        float h = bmap.getHeight();
+        float s = Math.min(w, h);
+        float f = sIconSeedSize / s;
+        w = w * f;
+        h = h * f;
+        s = Math.min(w, h);
+        Bitmap bmap2 = Bitmap.createScaledBitmap(bmap, (int) s, (int) s, true);
+        bmap = createSquareImage(bmap2, bmap, new Rect(0, 0, (int) s, (int) s));
+        if (DEBUG) {
+            Log.v(LOGTAG, "Create thumbnail of size " + bmap.getWidth() + " x " + bmap.getHeight()
+                    + " seed size: " + sIconSeedSize);
+        }
+        mThumbnailBitmap = bmap;
+    }
+
     public float getScaleFactor() {
         return mScaleFactor;
     }
@@ -406,4 +461,8 @@ public class MasterImage implements RenderingRequestCaller {
         mTranslation.y = 0;
         needsUpdateFullResPreview();
     }
+
+    public Bitmap getThumbnailBitmap() {
+        return mThumbnailBitmap;
+    }
 }
index 752fef0..9d50d5a 100644 (file)
@@ -74,11 +74,8 @@ public class FilterIconButton extends IconButton implements View.OnClickListener
             return super.drawImage(dst, image, destination);
         }
         if (mIconBitmap == null && mPreset == null) {
-            ImageLoader loader = MasterImage.getImage().getLoader();
-            if (loader != null) {
-                ImagePreset geoPreset = new ImagePreset(MasterImage.getImage().getGeometryPreset());
-                image = geoPreset.applyGeometry(image);
-                dst = super.drawImage(dst, image, destination);
+            dst = MasterImage.getImage().getThumbnailBitmap();
+            if (dst != null) {
                 ImagePreset mPreset = new ImagePreset();
                 mPreset.addFilter(mFilterRepresentation);
                 mPreset.setDoApplyGeometry(false);