summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOwen Lin <owenlin@google.com>2012-10-23 12:41:23 +0800
committerHung-ying Tyan <tyanh@google.com>2012-10-24 15:13:48 +0800
commit26e7a71df39c4b6923c0d36e32cc7ae0ebd72a05 (patch)
treefec298df725cc7a5e5e1456aad5874e222e79a1a /src
parentbbd30e0aab09feba5d3e038433895561ab255640 (diff)
downloadandroid_packages_apps_Snap-26e7a71df39c4b6923c0d36e32cc7ae0ebd72a05.tar.gz
android_packages_apps_Snap-26e7a71df39c4b6923c0d36e32cc7ae0ebd72a05.tar.bz2
android_packages_apps_Snap-26e7a71df39c4b6923c0d36e32cc7ae0ebd72a05.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/com/android/gallery3d/data/ImageCacheService.java2
-rw-r--r--src/com/android/gallery3d/ui/AlbumSetSlidingWindow.java35
-rw-r--r--src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java13
-rw-r--r--src/com/android/gallery3d/ui/AlbumSlidingWindow.java23
-rw-r--r--src/com/android/gallery3d/ui/AlbumSlotRenderer.java4
-rw-r--r--src/com/android/gallery3d/ui/FadeInTexture.java8
-rw-r--r--src/com/android/gallery3d/ui/FadeOutTexture.java5
-rw-r--r--src/com/android/gallery3d/ui/FadeTexture.java10
-rw-r--r--src/com/android/gallery3d/ui/TiledTexture.java24
-rw-r--r--src/com/android/gallery3d/util/GalleryUtils.java10
10 files changed, 87 insertions, 47 deletions
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) {