diff options
-rw-r--r-- | src/com/android/gallery3d/app/AlbumPage.java | 6 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java | 10 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/AlbumSlotRenderer.java | 8 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/BasicTexture.java | 6 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/ExtTexture.java | 4 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/GLCanvasImpl.java | 4 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/GLRootView.java | 12 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/NinePatchTexture.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/PhotoFallbackEffect.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/PhotoView.java | 1 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/RawTexture.java | 4 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/TextureUploader.java | 16 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/TileImageView.java | 8 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/UploadedTexture.java | 21 | ||||
-rw-r--r-- | tests/src/com/android/gallery3d/ui/TextureTest.java | 28 |
15 files changed, 80 insertions, 52 deletions
diff --git a/src/com/android/gallery3d/app/AlbumPage.java b/src/com/android/gallery3d/app/AlbumPage.java index b5ad2a5c6..090ba0891 100644 --- a/src/com/android/gallery3d/app/AlbumPage.java +++ b/src/com/android/gallery3d/app/AlbumPage.java @@ -176,9 +176,11 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster if (!more) { mResumeEffect = null; mAlbumView.setSlotFilter(null); - } else { - invalidate(); } + // We want to render one more time even when no more effect + // required. So that the animated thumbnails could be draw + // with declarations in super.render(). + invalidate(); } canvas.restore(); } diff --git a/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java b/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java index b0e615392..ac810336d 100644 --- a/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java +++ b/src/com/android/gallery3d/ui/AlbumSetSlotRenderer.java @@ -99,9 +99,9 @@ public class AlbumSetSlotRenderer extends AbstractSlotRenderer { } } - private static Texture checkTexture(GLCanvas canvas, Texture texture) { - return ((texture == null) || ((texture instanceof UploadedTexture) - && !((UploadedTexture) texture).isContentValid(canvas))) + private static Texture checkTexture(Texture texture) { + return ((texture instanceof UploadedTexture) + && ((UploadedTexture) texture).isUploading()) ? null : texture; } @@ -142,7 +142,7 @@ public class AlbumSetSlotRenderer extends AbstractSlotRenderer { GLCanvas canvas, AlbumSetEntry entry, int width, int height) { int renderRequestFlags = 0; - Texture content = checkTexture(canvas, entry.content); + Texture content = checkTexture(entry.content); if (content == null) { content = mWaitLoadingTexture; entry.isWaitLoadingDisplayed = true; @@ -173,7 +173,7 @@ public class AlbumSetSlotRenderer extends AbstractSlotRenderer { GLCanvas canvas, AlbumSetEntry entry, int width, int height) { // We show the loading message only when the album is still loading // (Not when we are still preparing the label) - Texture content = checkTexture(canvas, entry.label); + Texture content = checkTexture(entry.label); if (entry.album == null) { content = mDataWindow.getLoadingTexture(); } diff --git a/src/com/android/gallery3d/ui/AlbumSlotRenderer.java b/src/com/android/gallery3d/ui/AlbumSlotRenderer.java index 5f1e3a132..9723f4cb3 100644 --- a/src/com/android/gallery3d/ui/AlbumSlotRenderer.java +++ b/src/com/android/gallery3d/ui/AlbumSlotRenderer.java @@ -89,9 +89,9 @@ public class AlbumSlotRenderer extends AbstractSlotRenderer { } } - private static Texture checkTexture(GLCanvas canvas, Texture texture) { - return ((texture == null) || ((texture instanceof UploadedTexture) - && !((UploadedTexture) texture).isContentValid(canvas))) + private static Texture checkTexture(Texture texture) { + return (texture instanceof UploadedTexture) + && ((UploadedTexture) texture).isUploading() ? null : texture; } @@ -104,7 +104,7 @@ public class AlbumSlotRenderer extends AbstractSlotRenderer { int renderRequestFlags = 0; - Texture content = checkTexture(canvas, entry.content); + Texture content = checkTexture(entry.content); if (content == null) { content = mWaitLoadingTexture; entry.isWaitDisplayed = true; diff --git a/src/com/android/gallery3d/ui/BasicTexture.java b/src/com/android/gallery3d/ui/BasicTexture.java index 68a5b7d32..78559270f 100644 --- a/src/com/android/gallery3d/ui/BasicTexture.java +++ b/src/com/android/gallery3d/ui/BasicTexture.java @@ -139,7 +139,7 @@ abstract class BasicTexture implements Texture { // Returns the GL texture target for this texture (e.g. GL_TEXTURE_2D). abstract protected int getTarget(); - public boolean isLoaded(GLCanvas canvas) { + public boolean isLoaded() { return mState == STATE_LOADED; } @@ -160,10 +160,10 @@ abstract class BasicTexture implements Texture { private void freeResource() { GLCanvas canvas = mCanvasRef; - if (canvas != null && isLoaded(canvas)) { + if (canvas != null && isLoaded()) { canvas.unloadTexture(this); } - mState = BasicTexture.STATE_UNLOADED; + mState = STATE_UNLOADED; setAssociatedCanvas(null); } diff --git a/src/com/android/gallery3d/ui/ExtTexture.java b/src/com/android/gallery3d/ui/ExtTexture.java index d8267d1bf..9319d8ccd 100644 --- a/src/com/android/gallery3d/ui/ExtTexture.java +++ b/src/com/android/gallery3d/ui/ExtTexture.java @@ -60,12 +60,12 @@ public class ExtTexture extends BasicTexture { GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); setAssociatedCanvas(canvas); - mState = UploadedTexture.STATE_LOADED; + mState = STATE_LOADED; } @Override protected boolean onBind(GLCanvas canvas) { - if (!isLoaded(canvas)) { + if (!isLoaded()) { uploadToCanvas(canvas); } diff --git a/src/com/android/gallery3d/ui/GLCanvasImpl.java b/src/com/android/gallery3d/ui/GLCanvasImpl.java index 1efe5af4e..ff3e9e574 100644 --- a/src/com/android/gallery3d/ui/GLCanvasImpl.java +++ b/src/com/android/gallery3d/ui/GLCanvasImpl.java @@ -661,7 +661,7 @@ public class GLCanvasImpl implements GLCanvas { // so we synchronized on the mUnboundTextures object. public boolean unloadTexture(BasicTexture t) { synchronized (mUnboundTextures) { - if (!t.isLoaded(this)) return false; + if (!t.isLoaded()) return false; mUnboundTextures.add(t.mId); return true; } @@ -786,7 +786,7 @@ public class GLCanvasImpl implements GLCanvas { } else { setSize(texture.getWidth(), texture.getHeight()); - if (!texture.isLoaded(this)) texture.prepare(this); + if (!texture.isLoaded()) texture.prepare(this); gl11ep.glFramebufferTexture2DOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES, diff --git a/src/com/android/gallery3d/ui/GLRootView.java b/src/com/android/gallery3d/ui/GLRootView.java index 8b8299287..f78e6e6bf 100644 --- a/src/com/android/gallery3d/ui/GLRootView.java +++ b/src/com/android/gallery3d/ui/GLRootView.java @@ -252,8 +252,15 @@ public class GLRootView extends GLSurfaceView // The GL Object has changed Log.i(TAG, "GLObject has changed from " + mGL + " to " + gl); } - mGL = gl; - mCanvas = new GLCanvasImpl(gl); + mRenderLock.lock(); + try { + mGL = gl; + mCanvas = new GLCanvasImpl(gl); + BasicTexture.invalidateAllTextures(); + } finally { + mRenderLock.unlock(); + } + if (DEBUG_FPS || DEBUG_PROFILE) { setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); } else { @@ -272,7 +279,6 @@ public class GLRootView extends GLSurfaceView + ", gl10: " + gl1.toString()); Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY); GalleryUtils.setRenderThread(); - BasicTexture.invalidateAllTextures(); if (DEBUG_PROFILE) { Log.d(TAG, "Start profiling"); Profile.enable(20); // take a sample every 20ms diff --git a/src/com/android/gallery3d/ui/NinePatchTexture.java b/src/com/android/gallery3d/ui/NinePatchTexture.java index 957229eb5..fa0e9cdc3 100644 --- a/src/com/android/gallery3d/ui/NinePatchTexture.java +++ b/src/com/android/gallery3d/ui/NinePatchTexture.java @@ -157,7 +157,7 @@ public class NinePatchTexture extends ResourceTexture { @Override public void draw(GLCanvas canvas, int x, int y, int w, int h) { - if (!isLoaded(canvas)) { + if (!isLoaded()) { mInstanceCache.clear(); } diff --git a/src/com/android/gallery3d/ui/PhotoFallbackEffect.java b/src/com/android/gallery3d/ui/PhotoFallbackEffect.java index cd930bdd3..3ca09ab96 100644 --- a/src/com/android/gallery3d/ui/PhotoFallbackEffect.java +++ b/src/com/android/gallery3d/ui/PhotoFallbackEffect.java @@ -87,7 +87,7 @@ public class PhotoFallbackEffect extends Animation implements SlotFilter { } private void drawEntry(GLCanvas canvas, Entry entry) { - if (!entry.texture.isLoaded(canvas)) return; + if (!entry.texture.isLoaded()) return; int w = entry.texture.getWidth(); int h = entry.texture.getHeight(); diff --git a/src/com/android/gallery3d/ui/PhotoView.java b/src/com/android/gallery3d/ui/PhotoView.java index 654fcd586..a15dd612c 100644 --- a/src/com/android/gallery3d/ui/PhotoView.java +++ b/src/com/android/gallery3d/ui/PhotoView.java @@ -1323,7 +1323,6 @@ public class PhotoView extends GLView { return mPositionController.getPosition(index); } - public PhotoFallbackEffect buildFallbackEffect(GLView root, GLCanvas canvas) { Rect location = new Rect(); Utils.assertTrue(root.getBoundsOf(this, location)); diff --git a/src/com/android/gallery3d/ui/RawTexture.java b/src/com/android/gallery3d/ui/RawTexture.java index e1af7d209..4c0d9d365 100644 --- a/src/com/android/gallery3d/ui/RawTexture.java +++ b/src/com/android/gallery3d/ui/RawTexture.java @@ -68,13 +68,13 @@ public class RawTexture extends BasicTexture { 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, null); mId = sTextureId[0]; - mState = UploadedTexture.STATE_LOADED; + mState = STATE_LOADED; setAssociatedCanvas(canvas); } @Override protected boolean onBind(GLCanvas canvas) { - if (isLoaded(canvas)) return true; + if (isLoaded()) return true; Log.w(TAG, "lost the content due to context change"); return false; } diff --git a/src/com/android/gallery3d/ui/TextureUploader.java b/src/com/android/gallery3d/ui/TextureUploader.java index ff7830fa2..714b09795 100644 --- a/src/com/android/gallery3d/ui/TextureUploader.java +++ b/src/com/android/gallery3d/ui/TextureUploader.java @@ -36,8 +36,12 @@ public class TextureUploader implements OnGLIdleListener { } public synchronized void clear() { - mFgTextures.clear(); - mBgTextures.clear(); + while (!mFgTextures.isEmpty()) { + mFgTextures.pop().setIsUploading(false); + } + while (!mBgTextures.isEmpty()) { + mBgTextures.pop().setIsUploading(false); + } } // caller should hold synchronized on "this" @@ -48,12 +52,16 @@ public class TextureUploader implements OnGLIdleListener { } public synchronized void addBgTexture(UploadedTexture t) { + if (t.isContentValid()) return; mBgTextures.addLast(t); + t.setIsUploading(true); queueSelfIfNeed(); } public synchronized void addFgTexture(UploadedTexture t) { + if (t.isContentValid()) return; mFgTextures.addLast(t); + t.setIsUploading(true); queueSelfIfNeed(); } @@ -64,7 +72,9 @@ public class TextureUploader implements OnGLIdleListener { synchronized (this) { if (deque.isEmpty()) break; t = deque.removeFirst(); - if (t.isContentValid(canvas)) continue; + t.setIsUploading(false); + if (t.isContentValid()) continue; + // this has to be protected by the synchronized block // to prevent the inner bitmap get recycled t.updateContent(canvas); diff --git a/src/com/android/gallery3d/ui/TileImageView.java b/src/com/android/gallery3d/ui/TileImageView.java index 2f8f22333..0c6086d1c 100644 --- a/src/com/android/gallery3d/ui/TileImageView.java +++ b/src/com/android/gallery3d/ui/TileImageView.java @@ -457,7 +457,7 @@ public class TileImageView extends GLView { int n = mActiveTiles.size(); for (int i = 0; i < n; i++) { Tile tile = mActiveTiles.valueAt(i); - if (!tile.isContentValid(canvas)) queueForDecode(tile); + if (!tile.isContentValid()) queueForDecode(tile); } } @@ -558,7 +558,7 @@ public class TileImageView extends GLView { tile = mUploadQueue.pop(); } if (tile == null || quota <= 0) break; - if (!tile.isContentValid(canvas)) { + if (!tile.isContentValid()) { Utils.assertTrue(tile.mTileState == STATE_DECODED); tile.updateContent(canvas); --quota; @@ -580,7 +580,7 @@ public class TileImageView extends GLView { Tile tile = getTile(tx, ty, level); if (tile != null) { - if (!tile.isContentValid(canvas)) { + if (!tile.isContentValid()) { if (tile.mTileState == STATE_DECODED) { if (mUploadQuota > 0) { --mUploadQuota; @@ -609,7 +609,7 @@ public class TileImageView extends GLView { static boolean drawTile( Tile tile, GLCanvas canvas, RectF source, RectF target) { while (true) { - if (tile.isContentValid(canvas)) { + if (tile.isContentValid()) { // offset source rectangle for the texture border. source.offset(TILE_BORDER, TILE_BORDER); canvas.drawTexture(tile, source, target); diff --git a/src/com/android/gallery3d/ui/UploadedTexture.java b/src/com/android/gallery3d/ui/UploadedTexture.java index 24c8d1db6..0fe506735 100644 --- a/src/com/android/gallery3d/ui/UploadedTexture.java +++ b/src/com/android/gallery3d/ui/UploadedTexture.java @@ -52,6 +52,9 @@ abstract class UploadedTexture extends BasicTexture { @SuppressWarnings("unused") private static final String TAG = "Texture"; private boolean mContentValid = true; + + // indicate this textures is being uploaded in background + private boolean mIsUploading = false; private boolean mOpaque = true; private boolean mThrottled = false; private static int sUploadedCount; @@ -72,6 +75,14 @@ abstract class UploadedTexture extends BasicTexture { } } + protected void setIsUploading(boolean uploading) { + mIsUploading = uploading; + } + + public boolean isUploading() { + return mIsUploading; + } + private static class BorderKey implements Cloneable { public boolean vertical; public Config config; @@ -165,8 +176,8 @@ abstract class UploadedTexture extends BasicTexture { /** * Whether the content on GPU is valid. */ - public boolean isContentValid(GLCanvas canvas) { - return isLoaded(canvas) && mContentValid; + public boolean isContentValid() { + return isLoaded() && mContentValid; } /** @@ -174,7 +185,7 @@ abstract class UploadedTexture extends BasicTexture { * @param canvas */ public void updateContent(GLCanvas canvas) { - if (!isLoaded(canvas)) { + if (!isLoaded()) { if (mThrottled && ++sUploadedCount > UPLOAD_LIMIT) { return; } @@ -284,7 +295,7 @@ abstract class UploadedTexture extends BasicTexture { // Update texture state. setAssociatedCanvas(canvas); mId = sTextureId[0]; - mState = UploadedTexture.STATE_LOADED; + mState = STATE_LOADED; mContentValid = true; } else { mState = STATE_ERROR; @@ -295,7 +306,7 @@ abstract class UploadedTexture extends BasicTexture { @Override protected boolean onBind(GLCanvas canvas) { updateContent(canvas); - return isContentValid(canvas); + return isContentValid(); } @Override diff --git a/tests/src/com/android/gallery3d/ui/TextureTest.java b/tests/src/com/android/gallery3d/ui/TextureTest.java index be2356c8e..9e34083b8 100644 --- a/tests/src/com/android/gallery3d/ui/TextureTest.java +++ b/tests/src/com/android/gallery3d/ui/TextureTest.java @@ -20,10 +20,10 @@ import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.test.suitebuilder.annotation.SmallTest; -import javax.microedition.khronos.opengles.GL11; - import junit.framework.TestCase; +import javax.microedition.khronos.opengles.GL11; + @SmallTest public class TextureTest extends TestCase { @SuppressWarnings("unused") @@ -34,7 +34,7 @@ public class TextureTest extends TestCase { int mOpaqueCalled; MyBasicTexture(GLCanvas canvas, int id) { - super(canvas, id, BasicTexture.STATE_UNLOADED); + super(canvas, id, 0); } @Override @@ -54,7 +54,7 @@ public class TextureTest extends TestCase { } void upload() { - mState = STATE_LOADED; + mState |= STATE_BIT_LOADED; } } @@ -76,13 +76,13 @@ public class TextureTest extends TestCase { assertEquals(4, texture.getTextureWidth()); assertEquals(8, texture.getTextureHeight()); - assertFalse(texture.isLoaded(canvas)); + assertFalse(texture.isLoaded()); texture.upload(); - assertTrue(texture.isLoaded(canvas)); + assertTrue(texture.isLoaded()); // For a different GL, it's not loaded. GLCanvas canvas2 = new GLCanvasImpl(new GLStub()); - assertFalse(texture.isLoaded(canvas2)); + assertFalse(texture.isLoaded()); assertEquals(0, texture.mOnBindCalled); assertEquals(0, texture.mOpaqueCalled); @@ -143,20 +143,20 @@ public class TextureTest extends TestCase { assertEquals(0, texture.mGetCalled); texture.draw(canvas, 0, 0); assertEquals(1, texture.mGetCalled); - assertTrue(texture.isLoaded(canvas)); - assertTrue(texture.isContentValid(canvas)); + assertTrue(texture.isLoaded()); + assertTrue(texture.isContentValid()); // invalidate content and it should be freed. texture.invalidateContent(); - assertFalse(texture.isContentValid(canvas)); + assertFalse(texture.isContentValid()); assertEquals(1, texture.mFreeCalled); - assertTrue(texture.isLoaded(canvas)); // But it's still loaded + assertTrue(texture.isLoaded()); // But it's still loaded // draw it again and the bitmap should be fetched again. texture.draw(canvas, 0, 0); assertEquals(2, texture.mGetCalled); - assertTrue(texture.isLoaded(canvas)); - assertTrue(texture.isContentValid(canvas)); + assertTrue(texture.isLoaded()); + assertTrue(texture.isContentValid()); // recycle the texture and it should be freed again. texture.recycle(); @@ -168,7 +168,7 @@ public class TextureTest extends TestCase { class MyTextureForMixed extends BasicTexture { MyTextureForMixed(GLCanvas canvas, int id) { - super(canvas, id, BasicTexture.STATE_UNLOADED); + super(canvas, id, 0); } @Override |