From: Owen Lin Date: Tue, 23 Oct 2012 04:41:23 +0000 (+0800) Subject: Use TiledTexture for thumbnails. X-Git-Tag: android-x86-6.0-r3~68^2~28^2~213^2~19^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2~428^2~2^2~766^2~88 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=adee31f0;p=android-x86%2Fpackages-apps-Camera2.git Use TiledTexture for thumbnails. 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 --- diff --git a/src/com/android/gallery3d/data/ImageCacheService.java b/src/com/android/gallery3d/data/ImageCacheService.java index d42e9521d..527d6c8cd 100644 --- a/src/com/android/gallery3d/data/ImageCacheService.java +++ b/src/com/android/gallery3d/data/ImageCacheService.java @@ -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; diff --git a/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java b/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java index d95a523c0..80dfc919f 100644 --- a/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java +++ b/src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java @@ -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); } } } diff --git a/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java b/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java index 233a8003d..70d7c273a 100644 --- a/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java +++ b/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java @@ -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; } diff --git a/src/com/android/gallery3d/ui/AlbumSlidingWindow.java b/src/com/android/gallery3d/ui/AlbumSlidingWindow.java index d3ad3048e..678c43251 100644 --- a/src/com/android/gallery3d/ui/AlbumSlidingWindow.java +++ b/src/com/android/gallery3d/ui/AlbumSlidingWindow.java @@ -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); } diff --git a/src/com/android/gallery3d/ui/AlbumSlotRenderer.java b/src/com/android/gallery3d/ui/AlbumSlotRenderer.java index 4bf10e7f3..ce5b7ac24 100644 --- a/src/com/android/gallery3d/ui/AlbumSlotRenderer.java +++ b/src/com/android/gallery3d/ui/AlbumSlotRenderer.java @@ -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; } diff --git a/src/com/android/gallery3d/ui/FadeInTexture.java b/src/com/android/gallery3d/ui/FadeInTexture.java index 648bdcf0a..c6a9811f6 100644 --- a/src/com/android/gallery3d/ui/FadeInTexture.java +++ b/src/com/android/gallery3d/ui/FadeInTexture.java @@ -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); } diff --git a/src/com/android/gallery3d/ui/FadeOutTexture.java b/src/com/android/gallery3d/ui/FadeOutTexture.java index 47e6acb54..7050e535e 100644 --- a/src/com/android/gallery3d/ui/FadeOutTexture.java +++ b/src/com/android/gallery3d/ui/FadeOutTexture.java @@ -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 diff --git a/src/com/android/gallery3d/ui/FadeTexture.java b/src/com/android/gallery3d/ui/FadeTexture.java index cbf507352..5236d3639 100644 --- a/src/com/android/gallery3d/ui/FadeTexture.java +++ b/src/com/android/gallery3d/ui/FadeTexture.java @@ -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; } diff --git a/src/com/android/gallery3d/ui/TiledTexture.java b/src/com/android/gallery3d/ui/TiledTexture.java index 6e9ad9ea8..8598a3fff 100644 --- a/src/com/android/gallery3d/ui/TiledTexture.java +++ b/src/com/android/gallery3d/ui/TiledTexture.java @@ -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; + } } diff --git a/src/com/android/gallery3d/util/GalleryUtils.java b/src/com/android/gallery3d/util/GalleryUtils.java index 62f22355e..547e2dda0 100644 --- a/src/com/android/gallery3d/util/GalleryUtils.java +++ b/src/com/android/gallery3d/util/GalleryUtils.java @@ -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) {