OSDN Git Service

Use TiledTexture for thumbnails.
authorOwen Lin <owenlin@google.com>
Tue, 23 Oct 2012 04:41:23 +0000 (12:41 +0800)
committerHung-ying Tyan <tyanh@google.com>
Wed, 24 Oct 2012 07:13:48 +0000 (15:13 +0800)
1. Use TiledTexture for thumbnails to prevent jank in uploading big
   thumbnails. (e.g., 512 * 512)
2. Use larger thumbnails (DISPLAY_LONG_SIDE / 5).

bug: 7381302

Change-Id: I7661d648373e893b40b2a0304037171760091e00

src/com/android/gallery3d/data/ImageCacheService.java
src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java
src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java
src/com/android/gallery3d/ui/AlbumSlidingWindow.java
src/com/android/gallery3d/ui/AlbumSlotRenderer.java
src/com/android/gallery3d/ui/FadeInTexture.java
src/com/android/gallery3d/ui/FadeOutTexture.java
src/com/android/gallery3d/ui/FadeTexture.java
src/com/android/gallery3d/ui/TiledTexture.java
src/com/android/gallery3d/util/GalleryUtils.java

index d42e952..527d6c8 100644 (file)
@@ -35,7 +35,7 @@ public class ImageCacheService {
     private static final String IMAGE_CACHE_FILE = "imgcache";
     private static final int IMAGE_CACHE_MAX_ENTRIES = 5000;
     private static final int IMAGE_CACHE_MAX_BYTES = 200 * 1024 * 1024;
-    private static final int IMAGE_CACHE_VERSION = 6;
+    private static final int IMAGE_CACHE_VERSION = 7;
 
     private BlobCache mCache;
 
index d95a523..80dfc91 100644 (file)
@@ -58,7 +58,9 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
     private final ThreadPool mThreadPool;
     private final AlbumLabelMaker mLabelMaker;
     private final String mLoadingText;
-    private final TextureUploader mTextureUploader;
+
+    private final TiledTexture.Uploader mContentUploader;
+    private final TextureUploader mLabelUploader;
 
     private int mActiveRequestCount = 0;
     private boolean mIsActive = false;
@@ -71,7 +73,7 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
         public MediaItem coverItem;
         public Texture content;
         public BitmapTexture labelTexture;
-        public BitmapTexture bitmapTexture;
+        public TiledTexture bitmapTexture;
         public Path setPath;
         public String title;
         public int totalCount;
@@ -96,7 +98,8 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
 
         mLabelMaker = new AlbumLabelMaker(activity.getAndroidContext(), labelSpec);
         mLoadingText = activity.getAndroidContext().getString(R.string.loading);
-        mTextureUploader = new TextureUploader(activity.getGLRoot());
+        mContentUploader = new TiledTexture.Uploader(activity.getGLRoot());
+        mLabelUploader = new TextureUploader(activity.getGLRoot());
 
         mHandler = new SynchronizedHandler(activity.getGLRoot()) {
             @Override
@@ -297,25 +300,26 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
         if (index < mContentStart || index >= mContentEnd) return;
         AlbumSetEntry entry = mData[index % mData.length];
         if (entry.bitmapTexture != null) {
-            mTextureUploader.addBgTexture(entry.bitmapTexture);
+            mContentUploader.addTexture(entry.bitmapTexture);
         }
         if (entry.labelTexture != null) {
-            mTextureUploader.addBgTexture(entry.labelTexture);
+            mLabelUploader.addBgTexture(entry.labelTexture);
         }
     }
 
     private void updateTextureUploadQueue() {
         if (!mIsActive) return;
-        mTextureUploader.clear();
+        mContentUploader.clear();
+        mLabelUploader.clear();
 
         // Upload foreground texture
         for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) {
             AlbumSetEntry entry = mData[i % mData.length];
             if (entry.bitmapTexture != null) {
-                mTextureUploader.addFgTexture(entry.bitmapTexture);
+                mContentUploader.addTexture(entry.bitmapTexture);
             }
             if (entry.labelTexture != null) {
-                mTextureUploader.addFgTexture(entry.labelTexture);
+                mLabelUploader.addFgTexture(entry.labelTexture);
             }
         }
 
@@ -389,7 +393,9 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
 
     public void pause() {
         mIsActive = false;
-        mTextureUploader.clear();
+        mLabelUploader.clear();
+        mContentUploader.clear();
+        TiledTexture.freeResources();
         for (int i = mContentStart, n = mContentEnd; i < n; ++i) {
             freeSlotContent(i);
         }
@@ -398,6 +404,7 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
 
     public void resume() {
         mIsActive = true;
+        TiledTexture.prepareResources();
         for (int i = mContentStart, n = mContentEnd; i < n; ++i) {
             prepareSlotContent(i);
         }
@@ -440,17 +447,17 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
             if (bitmap == null) return; // error or recycled
 
             AlbumSetEntry entry = mData[mSlotIndex % mData.length];
-            BitmapTexture texture = new BitmapTexture(bitmap);
+            TiledTexture texture = new TiledTexture(bitmap);
             entry.bitmapTexture = texture;
             entry.content = texture;
 
             if (isActiveSlot(mSlotIndex)) {
-                mTextureUploader.addFgTexture(texture);
+                mContentUploader.addTexture(texture);
                 --mActiveRequestCount;
                 if (mActiveRequestCount == 0) requestNonactiveImages();
                 if (mListener != null) mListener.onContentChanged();
             } else {
-                mTextureUploader.addBgTexture(texture);
+                mContentUploader.addTexture(texture);
             }
         }
     }
@@ -514,12 +521,12 @@ public class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener {
             entry.labelTexture = texture;
 
             if (isActiveSlot(mSlotIndex)) {
-                mTextureUploader.addFgTexture(texture);
+                mLabelUploader.addFgTexture(texture);
                 --mActiveRequestCount;
                 if (mActiveRequestCount == 0) requestNonactiveImages();
                 if (mListener != null) mListener.onContentChanged();
             } else {
-                mTextureUploader.addBgTexture(texture);
+                mLabelUploader.addBgTexture(texture);
             }
         }
     }
index 233a800..70d7c27 100644 (file)
@@ -106,13 +106,20 @@ public class AlbumSetSlotRenderer extends AbstractSlotRenderer {
         }
     }
 
-    private static Texture checkTexture(Texture texture) {
+    private static Texture checkLabelTexture(Texture texture) {
         return ((texture instanceof UploadedTexture)
                 && ((UploadedTexture) texture).isUploading())
                 ? null
                 : texture;
     }
 
+    private static Texture checkContentTexture(Texture texture) {
+        return ((texture instanceof TiledTexture)
+                && !((TiledTexture) texture).isReady())
+                ? null
+                : texture;
+    }
+
     @Override
     public int renderSlot(GLCanvas canvas, int index, int pass, int width, int height) {
         AlbumSetEntry entry = mDataWindow.get(index);
@@ -155,7 +162,7 @@ public class AlbumSetSlotRenderer extends AbstractSlotRenderer {
             GLCanvas canvas, AlbumSetEntry entry, int width, int height) {
         int renderRequestFlags = 0;
 
-        Texture content = checkTexture(entry.content);
+        Texture content = checkContentTexture(entry.content);
         if (content == null) {
             content = mWaitLoadingTexture;
             entry.isWaitLoadingDisplayed = true;
@@ -175,7 +182,7 @@ public class AlbumSetSlotRenderer extends AbstractSlotRenderer {
 
     protected int renderLabel(
             GLCanvas canvas, AlbumSetEntry entry, int width, int height) {
-        Texture content = checkTexture(entry.labelTexture);
+        Texture content = checkLabelTexture(entry.labelTexture);
         if (content == null) {
             content = mWaitLoadingTexture;
         }
index d3ad304..678c432 100644 (file)
@@ -50,7 +50,7 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
         public int rotation;
         public int mediaType;
         public boolean isWaitDisplayed;
-        public BitmapTexture bitmapTexture;
+        public TiledTexture bitmapTexture;
         public Texture content;
         private BitmapLoader contentLoader;
         private PanoSupportListener mPanoSupportListener;
@@ -60,7 +60,7 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
     private final AlbumEntry mData[];
     private final SynchronizedHandler mHandler;
     private final JobLimiter mThreadPool;
-    private final TextureUploader mTextureUploader;
+    private final TiledTexture.Uploader mTileUploader;
 
     private int mSize;
 
@@ -103,7 +103,7 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
         };
 
         mThreadPool = new JobLimiter(activity.getThreadPool(), JOB_LIMIT);
-        mTextureUploader = new TextureUploader(activity.getGLRoot());
+        mTileUploader = new TiledTexture.Uploader(activity.getGLRoot());
     }
 
     public void setListener(Listener listener) {
@@ -181,20 +181,20 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
         if (index < mContentEnd && index >= mContentStart) {
             AlbumEntry entry = mData[index % mData.length];
             if (entry.bitmapTexture != null) {
-                mTextureUploader.addBgTexture(entry.bitmapTexture);
+                mTileUploader.addTexture(entry.bitmapTexture);
             }
         }
     }
 
     private void updateTextureUploadQueue() {
         if (!mIsActive) return;
-        mTextureUploader.clear();
+        mTileUploader.clear();
 
         // add foreground textures
         for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) {
             AlbumEntry entry = mData[i % mData.length];
             if (entry.bitmapTexture != null) {
-                mTextureUploader.addFgTexture(entry.bitmapTexture);
+                mTileUploader.addTexture(entry.bitmapTexture);
             }
         }
 
@@ -313,18 +313,17 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
         public void updateEntry() {
             Bitmap bitmap = getBitmap();
             if (bitmap == null) return; // error or recycled
-
             AlbumEntry entry = mData[mSlotIndex % mData.length];
-            entry.bitmapTexture = new BitmapTexture(bitmap);
+            entry.bitmapTexture = new TiledTexture(bitmap);
             entry.content = entry.bitmapTexture;
 
             if (isActiveSlot(mSlotIndex)) {
-                mTextureUploader.addFgTexture(entry.bitmapTexture);
+                mTileUploader.addTexture(entry.bitmapTexture);
                 --mActiveRequestCount;
                 if (mActiveRequestCount == 0) requestNonactiveImages();
                 if (mListener != null) mListener.onContentChanged();
             } else {
-                mTextureUploader.addBgTexture(entry.bitmapTexture);
+                mTileUploader.addTexture(entry.bitmapTexture);
             }
         }
     }
@@ -353,6 +352,7 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
 
     public void resume() {
         mIsActive = true;
+        TiledTexture.prepareResources();
         for (int i = mContentStart, n = mContentEnd; i < n; ++i) {
             prepareSlotContent(i);
         }
@@ -361,7 +361,8 @@ public class AlbumSlidingWindow implements AlbumDataLoader.DataListener {
 
     public void pause() {
         mIsActive = false;
-        mTextureUploader.clear();
+        mTileUploader.clear();
+        TiledTexture.freeResources();
         for (int i = mContentStart, n = mContentEnd; i < n; ++i) {
             freeSlotContent(i);
         }
index 4bf10e7..ce5b7ac 100644 (file)
@@ -89,8 +89,8 @@ public class AlbumSlotRenderer extends AbstractSlotRenderer {
     }
 
     private static Texture checkTexture(Texture texture) {
-        return (texture instanceof UploadedTexture)
-                && ((UploadedTexture) texture).isUploading()
+        return (texture instanceof TiledTexture)
+                && !((TiledTexture) texture).isReady()
                 ? null
                 : texture;
     }
index 648bdcf..c6a9811 100644 (file)
@@ -23,16 +23,18 @@ public class FadeInTexture extends FadeTexture implements Texture {
     private static final String TAG = "FadeInTexture";
 
     private final int mColor;
+    private final TiledTexture mTexture;
 
-    public FadeInTexture(int color, BasicTexture texture) {
-        super(texture);
+    public FadeInTexture(int color, TiledTexture texture) {
+        super(texture.getWidth(), texture.getHeight(), texture.isOpaque());
         mColor = color;
+        mTexture = texture;
     }
 
     @Override
     public void draw(GLCanvas canvas, int x, int y, int w, int h) {
         if (isAnimating()) {
-            canvas.drawMixed(mTexture, mColor, getRatio(), x, y, w, h);
+            mTexture.drawMixed(canvas, mColor, getRatio(), x, y, w, h);
         } else {
             mTexture.draw(canvas, x, y, w, h);
         }
index 47e6acb..7050e53 100644 (file)
@@ -22,8 +22,11 @@ public class FadeOutTexture extends FadeTexture {
     @SuppressWarnings("unused")
     private static final String TAG = "FadeOutTexture";
 
+    private final BasicTexture mTexture;
+
     public FadeOutTexture(BasicTexture texture) {
-        super(texture);
+        super(texture.getWidth(), texture.getHeight(), texture.isOpaque());
+        mTexture = texture;
     }
 
     @Override
index cbf5073..5236d36 100644 (file)
@@ -26,18 +26,16 @@ public abstract class FadeTexture implements Texture {
     // The duration of the fading animation in milliseconds
     public static final int DURATION = 180;
 
-    protected final BasicTexture mTexture;
     private final long mStartTime;
     private final int mWidth;
     private final int mHeight;
     private final boolean mIsOpaque;
     private boolean mIsAnimating;
 
-    public FadeTexture(BasicTexture texture) {
-        mTexture = texture;
-        mWidth = mTexture.getWidth();
-        mHeight = mTexture.getHeight();
-        mIsOpaque = mTexture.isOpaque();
+    public FadeTexture(int width, int height, boolean opaque) {
+        mWidth = width;
+        mHeight = height;
+        mIsOpaque = opaque;
         mStartTime = now();
         mIsAnimating = true;
     }
index 6e9ad9e..8598a3f 100644 (file)
@@ -34,7 +34,7 @@ import java.util.ArrayList;
 // split into tiles. By doing so, we may increase the time required to
 // upload the whole bitmap but we reduce the time of uploading each tile
 // so it make the animation more smooth and prevents jank.
-public class TiledTexture {
+public class TiledTexture implements Texture {
     private static final int CONTENT_SIZE = 254;
     private static final int BORDER_SIZE = 1;
     private static final int TILE_SIZE = CONTENT_SIZE + 2 * BORDER_SIZE;
@@ -162,6 +162,7 @@ public class TiledTexture {
 
     private boolean uploadNextTile(GLCanvas canvas) {
         if (mUploadIndex == mTiles.length) return true;
+
         Tile next = mTiles[mUploadIndex++];
         boolean hasBeenLoad = next.isLoaded();
         next.updateContent(canvas);
@@ -259,6 +260,7 @@ public class TiledTexture {
     }
 
     // Draws the texture on to the specified rectangle.
+    @Override
     public void draw(GLCanvas canvas, int x, int y, int width, int height) {
         RectF src = mSrcRect;
         RectF dest = mDestRect;
@@ -295,4 +297,24 @@ public class TiledTexture {
             canvas.drawTexture(t, src, dest);
         }
     }
+
+    @Override
+    public int getWidth() {
+        return mWidth;
+    }
+
+    @Override
+    public int getHeight() {
+        return mHeight;
+    }
+
+    @Override
+    public void draw(GLCanvas canvas, int x, int y) {
+        draw(canvas, x, y, mWidth, mHeight);
+    }
+
+    @Override
+    public boolean isOpaque() {
+        return false;
+    }
 }
index 62f2235..547e2dd 100644 (file)
@@ -87,11 +87,11 @@ public class GalleryUtils {
     }
 
     private static void initializeThumbnailSizes(DisplayMetrics metrics, Resources r) {
-        int maxDimensionPixels = Math.max(metrics.heightPixels, metrics.widthPixels);
-        // Never need to completely fill the screen
-        maxDimensionPixels = maxDimensionPixels / 2;
-        MediaItem.setThumbnailSizes(maxDimensionPixels, 200);
-        TiledScreenNail.setMaxSide(maxDimensionPixels);
+        int maxPixels = Math.max(metrics.heightPixels, metrics.widthPixels);
+
+        // For screen-nails, we never need to completely fill the screen
+        MediaItem.setThumbnailSizes(maxPixels / 2, maxPixels / 5);
+        TiledScreenNail.setMaxSide(maxPixels / 2);
     }
 
     public static boolean isHighResolution(Context context) {