commit 59540ba23237dd638b61ecc80c74476e0507805f
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Apr 18 16:07:53 2017 +0100

    Convert (almost) all remaining Apps to the new API which avoids memory leaks with Surfaces.
    
    Remaining problematic Apps: 15. FBO 16. Star Wars (both leak Tree FBOs) 22. SurfaceView (does not work at all after going to background)

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index e67fbd9..311446a 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -46,6 +46,7 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
 {
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
+   private DistortedTexture mTexture;
    private DistortedScreen mScreen;
    private AroundTheWorldEffectsManager mManager;
    private int mObjWidth, mObjHeight;
@@ -126,13 +127,11 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
       mObjWidth = bitmap.getWidth();
       mObjHeight= bitmap.getHeight();
 
-      DistortedTexture texture = new DistortedTexture(mObjWidth,mObjHeight);
-      texture.setTexture(bitmap);
-
-      MeshFlat mesh = new MeshFlat(30,30*mObjHeight/mObjWidth);
+      if( mTexture==null ) mTexture = new DistortedTexture(mObjWidth,mObjHeight);
+      mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      mScreen.attach(texture, mEffects, mesh );
+      mScreen.attach(mTexture, mEffects, new MeshFlat(30,30*mObjHeight/mObjWidth));
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
       DistortedEffects.enableEffect(EffectNames.SINK);
diff --git a/src/main/java/org/distorted/examples/blur/BlurRenderer.java b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
index 8b8a34f..af63e25 100644
--- a/src/main/java/org/distorted/examples/blur/BlurRenderer.java
+++ b/src/main/java/org/distorted/examples/blur/BlurRenderer.java
@@ -48,6 +48,7 @@ import javax.microedition.khronos.opengles.GL10;
 class BlurRenderer implements GLSurfaceView.Renderer
 {
     private GLSurfaceView mView;
+    private DistortedTexture mTexture;
     private DistortedEffects mEffects;
     private DistortedEffectsPostprocess mPostEffects;
     private DistortedScreen mScreen;
@@ -137,11 +138,11 @@ class BlurRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
 
-      DistortedTexture texture = new DistortedTexture(bmpWidth,bmpHeight);
-      texture.setTexture(bitmap);
+      if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
+      mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      DistortedNode node = new DistortedNode(texture,mEffects,mMesh);
+      DistortedNode node = new DistortedNode(mTexture,mEffects,mMesh);
       node.setPostprocessEffects(mPostEffects);
       mScreen.attach(node);
 
diff --git a/src/main/java/org/distorted/examples/fbo/FBORenderer.java b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
index aabaf85..c255df2 100644
--- a/src/main/java/org/distorted/examples/fbo/FBORenderer.java
+++ b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
@@ -53,6 +53,7 @@ class FBORenderer implements GLSurfaceView.Renderer
 {
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
+   private DistortedTexture mLisaTexture, mGridTexture;
    private DistortedScreen mScreen;
    private DistortedNode mRoot;
    private int lisaHeight, lisaWidth;
@@ -157,16 +158,16 @@ class FBORenderer implements GLSurfaceView.Renderer
       int gridWidth = bitmap2.getWidth();
       int gridHeight= bitmap2.getHeight();
 
-      DistortedTexture lisa = new DistortedTexture(lisaWidth,lisaHeight);
-      DistortedTexture grid = new DistortedTexture(gridWidth,gridHeight);
-      lisa.setTexture(bitmap1);
-      grid.setTexture(bitmap2);
+      if( mLisaTexture==null ) mLisaTexture = new DistortedTexture(lisaWidth,lisaHeight);
+      if( mGridTexture==null ) mGridTexture = new DistortedTexture(gridWidth,gridHeight);
+      mLisaTexture.setTexture(bitmap1);
+      mGridTexture.setTexture(bitmap2);
       DistortedEffects gridEffects = new DistortedEffects();
 
       mEffects.abortAllEffects();
 
-      mRoot = new DistortedNode(lisa, mEffects,new MeshFlat(1,1));
-      mRoot.attach(grid,gridEffects,new MeshCubes(10,10,false));
+      mRoot = new DistortedNode(mLisaTexture, mEffects,new MeshFlat(1,1));
+      mRoot.attach(mGridTexture,gridEffects,new MeshCubes(10,10,false));
 
       setDepthPriv();
 
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
index 85c1024..2305348 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorRenderer.java
@@ -21,7 +21,6 @@ package org.distorted.examples.mirror;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.examples.R;
@@ -127,6 +126,9 @@ class MirrorRenderer implements GLSurfaceView.Renderer
         mScreenW = width;
         mScreenH = height;
 
+        if( mOffScreen1!=null ) mOffScreen1.markForDeletion();
+        if( mOffScreen2!=null ) mOffScreen2.markForDeletion();
+
         mOffScreen1 = new DistortedFramebuffer(mScreenW,mScreenH);
         mOffScreen2 = new DistortedFramebuffer( (int)(MIRROR_SCALE*mScreenW), (int)(MIRROR_SCALE*mScreenH) );
 
@@ -186,8 +188,8 @@ class MirrorRenderer implements GLSurfaceView.Renderer
       mHeadW   = bitmapH.getWidth();
       mHeadH   = bitmapH.getHeight();
 
-      mTextureMirror = new DistortedTexture(mMirrorW,mMirrorH);
-      mTextureHead   = new DistortedTexture(mHeadW, mHeadH);
+      if( mTextureMirror==null ) mTextureMirror = new DistortedTexture(mMirrorW,mMirrorH);
+      if( mTextureHead  ==null ) mTextureHead   = new DistortedTexture(mHeadW, mHeadH);
 
       mTextureMirror.setTexture(bitmapM);
       mTextureHead.setTexture(bitmapH);
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index a76af14..f798bd9 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -57,6 +57,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
   private GLSurfaceView mView;
   private DistortedEffects mEffects;
   private DistortedFramebuffer mOffscreen;
+  private DistortedTexture mTexture;
   private DistortedScreen mScreen;
   private Static1D s0;
   private Dynamic3D mScaleDyn;
@@ -242,15 +243,15 @@ class SaveRenderer implements GLSurfaceView.Renderer
     bmpWidth  = bitmap.getWidth();
 
     MeshFlat mesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
-    DistortedTexture texture = new DistortedTexture(bmpWidth,bmpHeight);
-    texture.setTexture(bitmap);
+    if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
+    mTexture.setTexture(bitmap);
 
-    mOffscreen = new DistortedFramebuffer( (int)(mScale*bmpWidth) , (int)(mScale*bmpHeight) );
+    if( mOffscreen==null ) mOffscreen = new DistortedFramebuffer( (int)(mScale*bmpWidth) , (int)(mScale*bmpHeight) );
 
     mOffscreen.detachAll();
-    mOffscreen.attach(texture,mEffects,mesh);
+    mOffscreen.attach(mTexture,mEffects,mesh);
     mScreen.detachAll();
-    mScreen.attach(texture,mEffects,mesh);
+    mScreen.attach(mTexture,mEffects,mesh);
 
     DistortedEffects.enableEffect(EffectNames.SINK);
 
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
index 2daed00..ff45820 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsRenderer.java
@@ -204,6 +204,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     double angleA = (90.0f - FOV_ANGLE/2)*Math.PI/180;
     double angleB = (90.0f - FOV_ANGLE/2 +CRAWL_ANGLE)*Math.PI/180;
 
+    if( mCrawlBackgroundTexture!=null ) mCrawlBackgroundTexture.markForDeletion();
     mCrawlBackgroundTexture = new DistortedTexture(w,(int)(h*Math.sin(angleA)/Math.sin(angleB)));
        
     int randomA, randomX, randomY, randomTime;
@@ -286,7 +287,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     paint.setTypeface(tf);     
  
     ///// create GFFA ///////////////////
-    mGFFATexture  = new DistortedTexture(GFFA_WIDTH,GFFA_HEIGHT);
+    if( mGFFATexture==null ) mGFFATexture  = new DistortedTexture(GFFA_WIDTH,GFFA_HEIGHT);
     bitmapGFFA = Bitmap.createBitmap(GFFA_WIDTH,GFFA_HEIGHT,Bitmap.Config.ARGB_8888);
     bitmapGFFA.eraseColor(0x00000000);
     Canvas gffaCanvas = new Canvas(bitmapGFFA);
@@ -299,11 +300,11 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     mGFFATexture.setTexture(bitmapGFFA);
       
     ///// create Logo ///////////////////
-    mLogoTexture  = new DistortedTexture(bitmapLogo.getWidth(),bitmapLogo.getHeight());
+    if( mLogoTexture==null ) mLogoTexture  = new DistortedTexture(bitmapLogo.getWidth(),bitmapLogo.getHeight());
     mLogoTexture.setTexture(bitmapLogo);
 
     ///// create CRAWL //////////////////
-    mCrawlTexture = new DistortedTexture(CRAWL_WIDTH,CRAWL_HEIGHT);
+    if( mCrawlTexture==null ) mCrawlTexture = new DistortedTexture(CRAWL_WIDTH,CRAWL_HEIGHT);
     bitmapText = Bitmap.createBitmap(CRAWL_WIDTH,CRAWL_HEIGHT,Bitmap.Config.ARGB_8888);
     bitmapText.eraseColor(0x00000000);
     Canvas textCanvas = new Canvas(bitmapText);
@@ -317,7 +318,7 @@ class StarWarsRenderer implements GLSurfaceView.Renderer, EffectListener
     mCrawlTexture.setTexture(bitmapText);
       
     ///// create Stars ///////////////////
-    mStarTexture = new DistortedTexture(bitmapStar.getWidth(),bitmapStar.getHeight());
+    if( mStarTexture==null ) mStarTexture = new DistortedTexture(bitmapStar.getWidth(),bitmapStar.getHeight());
     mStarTexture.setTexture(bitmapStar);
 
     gffaID = mGFFAEffects.getID();
