diff options
Diffstat (limited to 'src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java')
-rw-r--r-- | src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java new file mode 100644 index 000000000..ce672f211 --- /dev/null +++ b/src/com/android/gallery3d/ui/PreparePageFadeoutTexture.java @@ -0,0 +1,85 @@ +package com.android.gallery3d.ui; + +import android.os.ConditionVariable; + +import com.android.gallery3d.app.AbstractGalleryActivity; +import com.android.gallery3d.glrenderer.GLCanvas; +import com.android.gallery3d.glrenderer.RawTexture; +import com.android.gallery3d.ui.GLRoot.OnGLIdleListener; + +public class PreparePageFadeoutTexture implements OnGLIdleListener { + private static final long TIMEOUT = 200; + public static final String KEY_FADE_TEXTURE = "fade_texture"; + + private RawTexture mTexture; + private ConditionVariable mResultReady = new ConditionVariable(false); + private boolean mCancelled = false; + private GLView mRootPane; + + public PreparePageFadeoutTexture(GLView rootPane) { + if (rootPane == null) { + mCancelled = true; + return; + } + int w = rootPane.getWidth(); + int h = rootPane.getHeight(); + if (w == 0 || h == 0) { + mCancelled = true; + return; + } + mTexture = new RawTexture(w, h, true); + mRootPane = rootPane; + } + + public boolean isCancelled() { + return mCancelled; + } + + public synchronized RawTexture get() { + if (mCancelled) { + return null; + } else if (mResultReady.block(TIMEOUT)) { + return mTexture; + } else { + mCancelled = true; + return null; + } + } + + @Override + public boolean onGLIdle(GLCanvas canvas, boolean renderRequested) { + if (!mCancelled) { + try { + canvas.beginRenderTarget(mTexture); + mRootPane.render(canvas); + canvas.endRenderTarget(); + } catch (RuntimeException e) { + mTexture = null; + } + } else { + mTexture = null; + } + mResultReady.open(); + return false; + } + + public static void prepareFadeOutTexture(AbstractGalleryActivity activity, + GLView rootPane) { + PreparePageFadeoutTexture task = new PreparePageFadeoutTexture(rootPane); + if (task.isCancelled()) return; + GLRoot root = activity.getGLRoot(); + RawTexture texture = null; + root.unlockRenderThread(); + try { + root.addOnGLIdleListener(task); + texture = task.get(); + } finally { + root.lockRenderThread(); + } + + if (texture == null) { + return; + } + activity.getTransitionStore().put(KEY_FADE_TEXTURE, texture); + } +} |