diff --git a/new3d/src/com/android/gallery3d/ui/GLCanvas.java b/new3d/src/com/android/gallery3d/ui/GLCanvas.java
index 78fdfe3..7135a0e 100644
--- a/new3d/src/com/android/gallery3d/ui/GLCanvas.java
+++ b/new3d/src/com/android/gallery3d/ui/GLCanvas.java
@@ -100,14 +100,14 @@
     public void drawMixed(BasicTexture from, BasicTexture to,
             float ratio, int x, int y, int width, int height, float alpha);
 
-    // Copies the specified rectangle to the RawTexture.
-    public void copyTexture2D(
-            RawTexture texture, int x, int y, int width, int height);
+    // Return a texture copied from the specified rectangle.
+    public BasicTexture copyTexture(int x, int y, int width, int height);
 
     // TODO: Remove this or document it.
     public void releaseTextures(Collection<? extends BasicTexture> c);
 
-    // Gets the underlying GL instance. This is used when
+    // Gets the underlying GL instance. This is used only when direct access to
+    // GL is needed.
     public GL11 getGLInstance();
 
     // Binds the texture to the canvas for the following drawing calls. This
diff --git a/new3d/src/com/android/gallery3d/ui/GLCanvasImp.java b/new3d/src/com/android/gallery3d/ui/GLCanvasImp.java
index 23e0ba9..eadf43a 100644
--- a/new3d/src/com/android/gallery3d/ui/GLCanvasImp.java
+++ b/new3d/src/com/android/gallery3d/ui/GLCanvasImp.java
@@ -408,7 +408,7 @@
     }
 
     private void drawBoundTexture(
-            BasicTexture texture, int x, int y, int width, int height) {
+            BasicTexture texture, int x, int y, int width, int height, float alpha) {
         // Test whether it has been rotated or flipped, if so, glDrawTexiOES
         // won't work
         if (isMatrixRotatedOrFlipped(mMatrixValues)) {
@@ -425,7 +425,7 @@
             y = (int) points[1];
             width = (int) points[2] - x;
             height = (int) points[3] - y;
-            mGLState.setTextureAlpha(mAlpha);
+            mGLState.setTextureAlpha(alpha);
             if (width > 0 && height > 0) {
                 ((GL11Ext) mGL).glDrawTexiOES(x, y, 0, width, height);
             }
@@ -444,7 +444,7 @@
 
         mGLState.setBlendEnabled(!texture.isOpaque() || alpha < OPAQUE_ALPHA);
         texture.bind(this);
-        drawBoundTexture(texture, x, y, width, height);
+        drawBoundTexture(texture, x, y, width, height, alpha);
     }
 
     public void drawMixed(BasicTexture from, BasicTexture to,
@@ -501,7 +501,7 @@
         gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA);
 
         // Draw the combined texture.
-        drawBoundTexture(to, x, y, width, height);
+        drawBoundTexture(to, x, y, width, height, mAlpha);
 
         // Disable TEXTURE1.
         gl.glDisable(GL11.GL_TEXTURE_2D);
@@ -520,8 +520,7 @@
                 || matrix[MSCALE_X] < 0 || matrix[MSCALE_Y] > 0;
     }
 
-    public void copyTexture2D(
-            RawTexture texture, int x, int y, int width, int height) {
+    public BasicTexture copyTexture(int x, int y, int width, int height) {
 
         if (isMatrixRotatedOrFlipped(mMatrixValues)) {
             throw new IllegalArgumentException("cannot support rotated matrix");
@@ -537,6 +536,7 @@
         int newHeight = Util.nextPowerOf2(height);
         int glError = GL11.GL_NO_ERROR;
 
+        RawTexture texture = RawTexture.newInstance(gl);
         gl.glBindTexture(GL11.GL_TEXTURE_2D, texture.getId());
 
         int[] cropRect = {0,  0, width, height};
@@ -551,7 +551,7 @@
         gl.glTexParameterf(GL11.GL_TEXTURE_2D,
                 GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
         gl.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0,
-                GL11.GL_RGBA, x, y, newWidth, newHeight, 0);
+                GL11.GL_RGB, x, y, newWidth, newHeight, 0);
         glError = gl.glGetError();
 
         if (glError == GL11.GL_OUT_OF_MEMORY) {
@@ -565,6 +565,7 @@
 
         texture.setSize(width, height);
         texture.setTextureSize(newWidth, newHeight);
+        return texture;
     }
 
     private static class GLState {
diff --git a/new3d/src/com/android/gallery3d/ui/PopupWindow.java b/new3d/src/com/android/gallery3d/ui/PopupWindow.java
index 5867433..c08c46d 100644
--- a/new3d/src/com/android/gallery3d/ui/PopupWindow.java
+++ b/new3d/src/com/android/gallery3d/ui/PopupWindow.java
@@ -35,7 +35,6 @@
     protected int mAnchorOffset;
 
     protected int mAnchorPosition;
-    private RawTexture mBackupTexture;
     private GLView mContent;
 
     protected Texture mBackground;
@@ -153,17 +152,12 @@
             mAnchor.draw(canvas, aXoffset, aYoffset);
         }
 
-        GL11 gl = canvas.getGLInstance();
-        if (mBackupTexture == null || mBackupTexture.getBoundGL() != gl) {
-            mBackupTexture = RawTexture.newInstance(gl);
-        }
-
-        RawTexture backup = mBackupTexture;
+        BasicTexture backup = null;
         try {
             // Copy the current drawing results of the triangle area into
             // "backup", so that we can restore the content after it is
             // overlaid by the background.
-            canvas.copyTexture2D(backup, aXoffset, aYoffset, aWidth, aHeight);
+            backup = canvas.copyTexture(aXoffset, aYoffset, aWidth, aHeight);
         } catch (GLOutOfMemoryException e) {
             Log.e(TAG, "out of memory", e);
         }
@@ -173,9 +167,9 @@
                     width, height - aHeight + mAnchorOffset);
         }
 
-        gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
-        backup.drawBack(canvas, aXoffset, aYoffset, aWidth, aHeight);
-        gl.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+        // restore the backup with alpha = 1
+        canvas.drawTexture(backup, aXoffset, aYoffset, aWidth, aHeight, 1f);
+        backup.deleteFromGL(canvas);
     }
 
     @Override
diff --git a/new3d/src/com/android/gallery3d/ui/RawTexture.java b/new3d/src/com/android/gallery3d/ui/RawTexture.java
index 5c633d4..dffdaa4 100644
--- a/new3d/src/com/android/gallery3d/ui/RawTexture.java
+++ b/new3d/src/com/android/gallery3d/ui/RawTexture.java
@@ -25,10 +25,6 @@
         super(gl, id, STATE_LOADED);
     }
 
-    public GL11 getBoundGL() {
-        return mGL;
-    }
-
     public static RawTexture newInstance(GL11 gl) {
         int[] textureId = new int[1];
         gl.glGenTextures(1, textureId, 0);
@@ -48,11 +44,7 @@
         canvas.bindTexture(this);
     }
 
-    public void drawBack(GLCanvas canvas, int x, int y, int w, int h) {
-        canvas.drawTexture(this, x, y, w, h, 1f);
-    }
-
     public boolean isOpaque() {
-        return false;
+        return true;
     }
 }
