commit b0ebdf5e6a022c173d065d0eb8bdf23fcfb9d38b
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Tue Apr 18 15:30:06 2017 +0100

    Major:
    
    1) in the Library, fix the fact that some applications (those that were creating their DistortedSurface objects outside of onSurfaceCreated or onSurfaceChanged) would not render after the activity went to background (press POWER to see that).
    2) in the Apps, call the new 'Distorted.onPause()' API to fix the above problem
    
    The above fixes the problem, but it still leaks memory if an App creates its Surface in onSurfaceCreated/Changed (precisely: it leaves the old Surface in the DistortedSurface Map). Thus
    
    3) Fix the first 15 Apps to avoid the memory leak. Next Apps coming.

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java
index 6e8999d..5a3f918 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldActivity.java
@@ -58,7 +58,7 @@ public class AroundTheWorldActivity extends Activity
       {
       AroundTheWorldSurfaceView view = (AroundTheWorldSurfaceView) this.findViewById(R.id.aroundTheWorldSurfaceView);
       view.onPause();
-
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/bean/BeanActivity.java b/src/main/java/org/distorted/examples/bean/BeanActivity.java
index e7a361c..420cbeb 100644
--- a/src/main/java/org/distorted/examples/bean/BeanActivity.java
+++ b/src/main/java/org/distorted/examples/bean/BeanActivity.java
@@ -45,6 +45,7 @@ public class BeanActivity extends Activity
     @Override
     protected void onPause() 
       {
+      Distorted.onPause();
       mView.onPause();  
       super.onPause();
       }
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 152b04b..3e3ab34 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -40,7 +40,6 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -50,6 +49,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
    private DistortedScreen mScreen;
+   private DistortedTexture mTexture;
    private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -147,12 +147,11 @@ class BeanRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
       
-      DistortedTexture texture = new DistortedTexture(bmpWidth,bmpHeight);
-      texture.setTexture(bitmap);
-      MeshFlat mesh = new MeshFlat(25,25*bmpHeight/bmpWidth);
+      if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
+      mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      mScreen.attach(texture,mEffects,mesh);
+      mScreen.attach(mTexture,mEffects,new MeshFlat(25,25*bmpHeight/bmpWidth));
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
 
diff --git a/src/main/java/org/distorted/examples/blur/BlurActivity.java b/src/main/java/org/distorted/examples/blur/BlurActivity.java
index be03527..7c95a6e 100644
--- a/src/main/java/org/distorted/examples/blur/BlurActivity.java
+++ b/src/main/java/org/distorted/examples/blur/BlurActivity.java
@@ -59,7 +59,7 @@ public class BlurActivity extends Activity  implements OnSeekBarChangeListener
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.blurSurfaceView);
       view.onPause();
-      
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogActivity.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogActivity.java
index 83fb4bd..c4cc55a 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogActivity.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogActivity.java
@@ -45,6 +45,7 @@ public class CatAndDogActivity extends Activity
     @Override
     protected void onPause() 
       {
+      Distorted.onPause();
       mView.onPause();
       super.onPause();
       }
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 31ff3a6..1d24c2e 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -41,7 +41,6 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -51,6 +50,7 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
     private MeshFlat mMesh;
+    private DistortedTexture mTexture;
     private DistortedScreen mScreen;
     private int bmpHeight, bmpWidth;
 
@@ -111,11 +111,11 @@ class CatAndDogRenderer 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();
-      mScreen.attach(texture,mEffects,mMesh);
+      mScreen.attach(mTexture,mEffects,mMesh);
 
       DistortedEffects.enableEffect(EffectNames.SMOOTH_CHROMA);
       DistortedEffects.enableEffect(EffectNames.ALPHA);
diff --git a/src/main/java/org/distorted/examples/check/CheckActivity.java b/src/main/java/org/distorted/examples/check/CheckActivity.java
index 693086e..4712014 100644
--- a/src/main/java/org/distorted/examples/check/CheckActivity.java
+++ b/src/main/java/org/distorted/examples/check/CheckActivity.java
@@ -78,7 +78,8 @@ public class CheckActivity extends Activity
       {
       GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.checkSurfaceView);
       if( mView!=null ) mView.onPause();
-      
+
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index 6362e85..5152a28 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -58,6 +58,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
 
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
+    private DistortedTexture mTexture;
     private DistortedScreen mScreen;
     private int bmpHeight, bmpWidth;
 
@@ -132,12 +133,14 @@ class CheckRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
 
-      DistortedTexture texture = new DistortedTexture(bmpWidth,bmpHeight);
-      texture.setTexture(bitmap);
-      MeshFlat mesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
+      if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
+      mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      mScreen.attach(texture,mEffects,mesh);
+      mScreen.attach(mTexture,mEffects,new MeshFlat(30,30*bmpHeight/bmpWidth));
+
+      mEffects.abortEffects(EffectTypes.VERTEX);
+      mEffects.abortEffects(EffectTypes.FRAGMENT);
 
       // Try adding 2 Vertex Effects to the Bitmap.
       // This will fail if we have set maxVertexEffects to something < 2.
diff --git a/src/main/java/org/distorted/examples/cubes/CubesActivity.java b/src/main/java/org/distorted/examples/cubes/CubesActivity.java
index bdde06b..72604c6 100644
--- a/src/main/java/org/distorted/examples/cubes/CubesActivity.java
+++ b/src/main/java/org/distorted/examples/cubes/CubesActivity.java
@@ -166,7 +166,8 @@ public class CubesActivity extends Activity implements View.OnClickListener
       {
       GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.cubesSurfaceView);
       if( mView!=null ) mView.onPause();
-        
+
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/deform/DeformActivity.java b/src/main/java/org/distorted/examples/deform/DeformActivity.java
index a46367f..ecea176 100644
--- a/src/main/java/org/distorted/examples/deform/DeformActivity.java
+++ b/src/main/java/org/distorted/examples/deform/DeformActivity.java
@@ -68,7 +68,7 @@ public class DeformActivity extends Activity implements OnSeekBarChangeListener
       {
       DeformSurfaceView view = (DeformSurfaceView) this.findViewById(R.id.deformSurfaceView);
 
-      view.getRenderer().onPause();
+      Distorted.onPause();
       view.onPause();
       super.onPause();
       }
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 40da5bc..781147e 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -79,7 +79,6 @@ class DeformRenderer implements GLSurfaceView.Renderer
    private float mRadius;
 
    private EffectNames mMode = EffectNames.DISTORT;
-   private boolean bitmapCreated = false;
    private long mLastEffect = -1;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -168,13 +167,6 @@ class DeformRenderer implements GLSurfaceView.Renderer
       mRegion.set3(mRadius*scrWidth);
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   public void onPause()
-      {
-      bitmapCreated = false;
-      }
-      
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
    public void onDrawFrame(GL10 glUnused)
@@ -200,57 +192,14 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
      mRegion.set3(mRadius*scrWidth);
 
-     if( !bitmapCreated )
-       {
-       createBitmap(scrWidth/2,scrHeight/2);
-       stretchEffects.abortAllEffects();
-       fpsEffects.abortAllEffects();
-       stretchEffects.move( new Static3D(scrWidth/4,scrHeight/4,0) );
-       fpsEffects.move( new Static3D(5,5,0) );
-       bitmapCreated=true;
-
-       mScreen.detachAll();
-       mScreen.attach(stretchTexture,stretchEffects,stretchMesh);
-       mScreen.attach(fpsTexture,fpsEffects,fpsMesh);
-       }
-     else
-       {
-       stretchEffects.abortEffects(EffectTypes.VERTEX);
-       stretchEffects.abortEffects(EffectTypes.FRAGMENT);
-       stretchEffects.abortEffects(EffectNames.SHEAR);
-       }
-
-     mScreen.resize(width, height);
-     }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
-     {
-     DistortedEffects.enableEffect(EffectNames.DISTORT);
-     DistortedEffects.enableEffect(EffectNames.DEFORM);
-
-     try
-       {
-       Distorted.onCreate(mView.getContext());
-       }
-     catch(Exception ex)
-       {
-       android.util.Log.e("DeformRenderer", ex.toString() );
-       }
-     }
-    
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-   private void createBitmap(int w, int h)
-     {
      Canvas stretchCanvas;
-      
-     stretchTexture = new DistortedTexture(w,h);
+     int w=width/2;
+     int h=height/2;
+
      stretchMesh = new MeshFlat(50,50*h/w);
      Bitmap stretchBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
      stretchCanvas = new Canvas(stretchBitmap);
-      
+
      fpsW = scrWidth/5;
      fpsH = fpsW/2;
 
@@ -259,23 +208,52 @@ class DeformRenderer implements GLSurfaceView.Renderer
      mPaint.setStyle(Style.FILL);
      stretchCanvas.drawRect(0, 0, w, h, mPaint);
      mPaint.setColor(0xffffffff);
-      
+
      for(int i=0; i<=NUM_LINES ; i++ )
        {
        stretchCanvas.drawRect(w*i/NUM_LINES - 1,                 0,  w*i/NUM_LINES + 1,  h                , mPaint);
        stretchCanvas.drawRect(                0, h *i/NUM_LINES -1,  w                ,  h*i/NUM_LINES + 1, mPaint);
        }
-        
+
      touchPoint= new Static3D(0,0,0);
-        
-     fpsTexture = new DistortedTexture(fpsW,fpsH);
      fpsMesh = new MeshFlat(1,1);
 
      fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888);
      fpsCanvas = new Canvas(fpsBitmap);
-        
+
+     if( stretchTexture==null ) stretchTexture = new DistortedTexture(w,h);
      stretchTexture.setTexture(stretchBitmap);
+
+     if( fpsTexture==null ) fpsTexture = new DistortedTexture(fpsW,fpsH);
      fpsTexture.setTexture(fpsBitmap);
+
+     stretchEffects.abortAllEffects();
+     fpsEffects.abortAllEffects();
+     stretchEffects.move( new Static3D(scrWidth/4,scrHeight/4,0) );
+     fpsEffects.move( new Static3D(5,5,0) );
+
+     mScreen.detachAll();
+     mScreen.attach(stretchTexture,stretchEffects,stretchMesh);
+     mScreen.attach(fpsTexture,fpsEffects,fpsMesh);
+
+     mScreen.resize(width, height);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
+     {
+     DistortedEffects.enableEffect(EffectNames.DISTORT);
+     DistortedEffects.enableEffect(EffectNames.DEFORM);
+
+     try
+       {
+       Distorted.onCreate(mView.getContext());
+       }
+     catch(Exception ex)
+       {
+       android.util.Log.e("DeformRenderer", ex.toString() );
+       }
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsActivity.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsActivity.java
index 578aab4..6842439 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsActivity.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsActivity.java
@@ -45,6 +45,7 @@ public class DifferentBitmapsActivity extends Activity
     @Override
     protected void onPause() 
       {
+      Distorted.onPause();
       mView.onPause();  
       super.onPause();
       }
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index 4793584..14158bc 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -41,7 +41,6 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -52,6 +51,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
    
    private GLSurfaceView mView;
    private DistortedEffects[] mEffects;
+   private DistortedTexture[] mTexture;
    private DistortedScreen mScreen;
    private int bmpHeight, bmpWidth;
     
@@ -156,19 +156,23 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
       
       bmpHeight = bitmap0.getHeight();
       bmpWidth  = bitmap0.getWidth();
-      
-      DistortedTexture[] texture = new DistortedTexture[NUM];
-      for(int i=0; i<NUM; i++)
-        texture[i] = new DistortedTexture(bmpWidth,bmpHeight);
-      
-      texture[0].setTexture(bitmap0);
-      texture[1].setTexture(bitmap1);
-      texture[2].setTexture(bitmap2);
+
+      if( mTexture==null )
+        {
+        mTexture = new DistortedTexture[NUM];
+
+        for(int i=0; i<NUM; i++)
+          mTexture[i] = new DistortedTexture(bmpWidth,bmpHeight);
+        }
+
+      mTexture[0].setTexture(bitmap0);
+      mTexture[1].setTexture(bitmap1);
+      mTexture[2].setTexture(bitmap2);
 
       MeshFlat mesh = new MeshFlat(30,30*bmpHeight/bmpWidth);
 
       mScreen.detachAll();
-      for(int i=NUM-1; i>=0; i--) mScreen.attach(texture[i], mEffects[i], mesh);
+      for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture[i], mEffects[i], mesh);
 
       DistortedEffects.enableEffect(EffectNames.SINK);
       DistortedEffects.enableEffect(EffectNames.DISTORT);
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsActivity.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsActivity.java
index d835750..887c2ff 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsActivity.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsActivity.java
@@ -45,6 +45,7 @@ public class DifferentEffectsActivity extends Activity
     @Override
     protected void onPause() 
       {
+      Distorted.onPause();
       mView.onPause();  
       super.onPause();
       }
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 34b0896..4a074aa 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -42,7 +42,6 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -53,6 +52,7 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
    
    private GLSurfaceView mView;
    private DistortedEffects[] mEffects;
+   private DistortedTexture mTexture;
    private DistortedScreen mScreen;
    private int bmpHeight, bmpWidth;
     
@@ -163,11 +163,11 @@ class DifferentEffectsRenderer 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);
 
      mScreen.detachAll();
-     for(int i=NUM-1; i>=0; i--) mScreen.attach(texture, mEffects[i], mesh);
+     for(int i=NUM-1; i>=0; i--) mScreen.attach(mTexture, mEffects[i], mesh);
 
      DistortedEffects.enableEffect(EffectNames.SINK);
      DistortedEffects.enableEffect(EffectNames.DISTORT);
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java b/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java
index de826df..2ca3ad9 100644
--- a/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicActivity.java
@@ -87,7 +87,8 @@ public class DynamicActivity extends Activity implements OnSeekBarChangeListener
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.dynamicSurfaceView);
       view.onPause();
-         
+
+      Distorted.onPause();
       super.onPause();
       }
     
diff --git a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
index dbbc40e..cfdac4a 100644
--- a/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
+++ b/src/main/java/org/distorted/examples/dynamic/DynamicRenderer.java
@@ -26,7 +26,6 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.DistortedEffects;
@@ -87,6 +86,7 @@ class DynamicRenderer implements GLSurfaceView.Renderer
      texW = width;
      texH = height;
 
+     if( mTexture!=null ) mTexture.markForDeletion();
      mTexture= new DistortedTexture(texW,texH);
      mBitmap = Bitmap.createBitmap(texW,texH, Bitmap.Config.ARGB_8888);
      mCanvas = new Canvas(mBitmap);
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
index b6b7b88..ef97c3a 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueActivity.java
@@ -121,7 +121,8 @@ public class EffectQueueActivity extends Activity implements AdapterView.OnItemS
     {
     GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.effects2dSurfaceView);
     mView.onPause();
-      
+
+    Distorted.onPause();
     super.onPause();
     }
     
diff --git a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
index afb5164..3fb43d5 100644
--- a/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
+++ b/src/main/java/org/distorted/examples/effectqueue/EffectQueueRenderer.java
@@ -26,7 +26,6 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.DistortedEffects;
diff --git a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
index e9be52e..aa0602c 100644
--- a/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
+++ b/src/main/java/org/distorted/examples/effects3d/Effects3DActivity.java
@@ -615,6 +615,8 @@ public class Effects3DActivity extends Activity
     {
     GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.effects3dSurfaceView);
     if( mView!=null ) mView.onPause();
+
+    Distorted.onPause();
     super.onPause();
     }
 
diff --git a/src/main/java/org/distorted/examples/fbo/FBOActivity.java b/src/main/java/org/distorted/examples/fbo/FBOActivity.java
index f78add5..311f63f 100644
--- a/src/main/java/org/distorted/examples/fbo/FBOActivity.java
+++ b/src/main/java/org/distorted/examples/fbo/FBOActivity.java
@@ -54,6 +54,7 @@ public class FBOActivity extends Activity
       FBOSurfaceView view = (FBOSurfaceView) this.findViewById(R.id.fboSurfaceView);
 
       view.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/flag/FlagActivity.java b/src/main/java/org/distorted/examples/flag/FlagActivity.java
index 4d6f8e0..01282dc 100644
--- a/src/main/java/org/distorted/examples/flag/FlagActivity.java
+++ b/src/main/java/org/distorted/examples/flag/FlagActivity.java
@@ -102,6 +102,7 @@ public class FlagActivity extends Activity implements SeekBar.OnSeekBarChangeLis
       GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.flagSurfaceView);
       mView.onPause();
 
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/girl/GirlActivity.java b/src/main/java/org/distorted/examples/girl/GirlActivity.java
index 0fd7659..56ad119 100644
--- a/src/main/java/org/distorted/examples/girl/GirlActivity.java
+++ b/src/main/java/org/distorted/examples/girl/GirlActivity.java
@@ -72,7 +72,8 @@ public class GirlActivity extends Activity  implements OnSeekBarChangeListener
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.girlSurfaceView);
       view.onPause();
-      
+
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index b704b95..bc9f8dc 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -42,7 +42,6 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -52,6 +51,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
     private DistortedScreen mScreen;
+    private DistortedTexture mTexture;
     private Static3D v0,v1,v2,v3;
     private Static1D dBegin, dMiddle, dEnd, s0;
     private int bmpHeight, bmpWidth;
@@ -204,12 +204,11 @@ class GirlRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       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);
 
       mScreen.detachAll();
-      mScreen.attach(texture,mEffects,mesh);
+      mScreen.attach(mTexture,mEffects,new MeshFlat(30,30*bmpHeight/bmpWidth));
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
       DistortedEffects.enableEffect(EffectNames.SINK);
diff --git a/src/main/java/org/distorted/examples/listener/ListenerActivity.java b/src/main/java/org/distorted/examples/listener/ListenerActivity.java
index a348d70..af4f529 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerActivity.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerActivity.java
@@ -45,7 +45,8 @@ public class ListenerActivity extends Activity
     @Override
     protected void onPause() 
       {
-      mView.onPause();  
+      mView.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index eb8c19e..0e39620 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -43,7 +43,6 @@ import org.distorted.library.message.EffectMessage;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -55,6 +54,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
    private DistortedScreen mScreen;
+   private DistortedTexture mTexture;
    private int bmpHeight, bmpWidth;
    private Random mRnd;
 
@@ -155,12 +155,11 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
 
-      MeshFlat mesh = new MeshFlat(50,50*bmpHeight/bmpWidth);
-      DistortedTexture texture = new DistortedTexture(bmpWidth,bmpHeight);
-      texture.setTexture(bitmap);
+      if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
+      mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      mScreen.attach(texture,mEffects,mesh);
+      mScreen.attach(mTexture,mEffects,new MeshFlat(50,50*bmpHeight/bmpWidth));
 
       for(int i=0; i<NUM_BUBBLES; i++) randomizeNewBubble();
 
diff --git a/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java b/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
index 708fd6d..9ecc1b2 100644
--- a/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
+++ b/src/main/java/org/distorted/examples/matrix3d/Matrix3DActivity.java
@@ -318,6 +318,8 @@ public class Matrix3DActivity extends Activity implements AdapterView.OnItemSele
     {
     GLSurfaceView mView = (GLSurfaceView)findViewById(R.id.matrix3dSurfaceView);
     if( mView!=null ) mView.onPause();
+
+    Distorted.onPause();
     super.onPause();
     }
 
diff --git a/src/main/java/org/distorted/examples/mirror/MirrorActivity.java b/src/main/java/org/distorted/examples/mirror/MirrorActivity.java
index 8f94abf..0bc6ce0 100644
--- a/src/main/java/org/distorted/examples/mirror/MirrorActivity.java
+++ b/src/main/java/org/distorted/examples/mirror/MirrorActivity.java
@@ -54,6 +54,8 @@ public class MirrorActivity extends Activity implements OnSeekBarChangeListener
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.mirrorSurfaceView);
       view.onPause();
+
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaActivity.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaActivity.java
index 9816c7e..47f80ae 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaActivity.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaActivity.java
@@ -45,7 +45,8 @@ public class MonaLisaActivity extends Activity
     @Override
     protected void onPause() 
       {
-      mView.onPause();  
+      mView.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index 3696892..4d7da15 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -39,7 +39,6 @@ import org.distorted.library.type.Static4D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -48,6 +47,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
 {
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
+    private DistortedTexture mTexture;
     private DistortedScreen mScreen;
     private int bmpHeight, bmpWidth;
 
@@ -130,12 +130,19 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       bmpHeight = bitmap.getHeight();
       bmpWidth  = bitmap.getWidth();
 
-      MeshFlat mesh = new MeshFlat(9,9*bmpHeight/bmpWidth);
-      DistortedTexture texture = new DistortedTexture(bmpWidth,bmpHeight);
-      texture.setTexture(bitmap);
+      // We could have gotten here after the activity went to the background
+      // for a brief amount of time; in this case mTexture is already created.
+      // Do not leak memory by creating it the second time around.
+      if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
+
+      // even if mTexture wasn't null, we still need to call setTexture() on it
+      // because every time activity goes to background, its OpenGL resources
+      // - including Textures - get deleted. We always need to call setTexture()
+      // to recreate the internal OpenGL textures.
+      mTexture.setTexture(bitmap);
 
       mScreen.detachAll();
-      mScreen.attach(texture,mEffects,mesh);
+      mScreen.attach(mTexture,mEffects,new MeshFlat(9,9*bmpHeight/bmpWidth));
 
       DistortedEffects.enableEffect(EffectNames.DISTORT);
 
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
index d25e4a0..428e9c5 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsActivity.java
@@ -85,7 +85,8 @@ public class MovingEffectsActivity extends Activity
       
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.movingeffectsSurfaceView);
       view.onPause();
-      
+
+      Distorted.onPause();
       super.onPause();
       }
     
diff --git a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
index b463aee..8ba1b05 100644
--- a/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/movingeffects/MovingEffectsRenderer.java
@@ -26,7 +26,6 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.library.DistortedScreen;
@@ -132,6 +131,7 @@ class MovingEffectsRenderer implements GLSurfaceView.Renderer
      texW = width;
      texH = height;
 
+     if( mTexture!=null ) mTexture.markForDeletion();
      mTexture = new DistortedTexture(texW,texH);
      mBitmap  = Bitmap.createBitmap(texW,texH, Bitmap.Config.ARGB_8888);
      mCanvas  = new Canvas(mBitmap);
diff --git a/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java b/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
index 3495728..f6d8998 100644
--- a/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
+++ b/src/main/java/org/distorted/examples/multiblur/MultiblurActivity.java
@@ -61,6 +61,7 @@ public class MultiblurActivity extends Activity implements SeekBar.OnSeekBarChan
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.multiblurSurfaceView);
       view.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java b/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
index 2306a99..374b396 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicActivity.java
@@ -143,6 +143,7 @@ public class OlimpicActivity extends Activity
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.olimpicSurfaceView);
       view.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/PlainMonaLisaActivity.java b/src/main/java/org/distorted/examples/plainmonalisa/PlainMonaLisaActivity.java
index 3163417..6a39afd 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/PlainMonaLisaActivity.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/PlainMonaLisaActivity.java
@@ -46,6 +46,7 @@ public class PlainMonaLisaActivity extends Activity
     protected void onPause() 
       {
       mView.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionActivity.java b/src/main/java/org/distorted/examples/projection/ProjectionActivity.java
index f44c220..2a54589 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionActivity.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionActivity.java
@@ -71,7 +71,8 @@ public class ProjectionActivity extends Activity implements OnSeekBarChangeListe
       {
       GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.surfaceViewProjection);
       mView.onPause();
-      
+
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
index eaf1289..c032c4f 100644
--- a/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
+++ b/src/main/java/org/distorted/examples/projection/ProjectionRenderer.java
@@ -35,7 +35,6 @@ import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Paint.Style;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -45,7 +44,7 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
    private DistortedScreen mScreen;
-
+   private DistortedTexture mTexture;
    private float mF, mNear;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -90,8 +89,6 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
       mEffects.abortAllEffects();
 
       Paint paint = new Paint();
-      DistortedTexture texture= new DistortedTexture(width,height);
-      MeshFlat mesh = new MeshFlat(50,50*height/width);
       Bitmap bmp  = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
       Canvas bmpCanvas = new Canvas(bmp);
 
@@ -108,8 +105,6 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
         bmpCanvas.drawRect(                   0, height*i/NUMLINES -1,  width               ,  height*i/NUMLINES + 1, paint);
         }
 
-      texture.setTexture(bmp);
-
       int min = width<height ? width:height;
 
       Static3D vector = new Static3D(0,0,min/5);
@@ -120,8 +115,15 @@ class ProjectionRenderer implements GLSurfaceView.Renderer
       mEffects.distort(vector, new Static3D(  width/4, 3*height/4, 0), region);
       mEffects.distort(vector, new Static3D(3*width/4, 3*height/4, 0), region);
 
+      // Avoid memory leaks: delete old texture if it exists (it might if we
+      // got here after a brief amount of time spent in the background)
+      if( mTexture!=null ) mTexture.markForDeletion();
+
+      mTexture= new DistortedTexture(width,height);
+      mTexture.setTexture(bmp);
+
       mScreen.detachAll();
-      mScreen.attach(texture,mEffects,mesh);
+      mScreen.attach(mTexture,mEffects,new MeshFlat(50,50*height/width));
       mScreen.resize(width, height);
       }
 
diff --git a/src/main/java/org/distorted/examples/quaternion/QuaternionActivity.java b/src/main/java/org/distorted/examples/quaternion/QuaternionActivity.java
index 6ef57a5..3d0cd1c 100644
--- a/src/main/java/org/distorted/examples/quaternion/QuaternionActivity.java
+++ b/src/main/java/org/distorted/examples/quaternion/QuaternionActivity.java
@@ -45,7 +45,8 @@ public class QuaternionActivity extends Activity
   @Override
   protected void onPause() 
     {
-    mView.onPause();  
+    mView.onPause();
+    Distorted.onPause();
     super.onPause();
     }
 
diff --git a/src/main/java/org/distorted/examples/save/SaveActivity.java b/src/main/java/org/distorted/examples/save/SaveActivity.java
index 2962015..c37e058 100644
--- a/src/main/java/org/distorted/examples/save/SaveActivity.java
+++ b/src/main/java/org/distorted/examples/save/SaveActivity.java
@@ -81,7 +81,8 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
     {
     GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.saveSurfaceView);
     view.onPause();
-      
+
+    Distorted.onPause();
     super.onPause();
     }
 
diff --git a/src/main/java/org/distorted/examples/sink/SinkActivity.java b/src/main/java/org/distorted/examples/sink/SinkActivity.java
index 789fbb6..ad2b3ab 100644
--- a/src/main/java/org/distorted/examples/sink/SinkActivity.java
+++ b/src/main/java/org/distorted/examples/sink/SinkActivity.java
@@ -45,7 +45,8 @@ public class SinkActivity extends Activity
   @Override
   protected void onPause() 
     {
-    mView.onPause();  
+    mView.onPause();
+    Distorted.onPause();
     super.onPause();
     }
 
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index d4d5307..a112098 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -40,7 +40,6 @@ import org.distorted.library.type.Static3D;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -50,6 +49,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
   private GLSurfaceView mView;
   private DistortedEffects mEffects;
   private DistortedScreen mScreen;
+  private DistortedTexture mTexture;
   private int bmpHeight, bmpWidth;
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -124,12 +124,11 @@ class SinkRenderer implements GLSurfaceView.Renderer
     bmpHeight = bitmap.getHeight();
     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);
 
     mScreen.detachAll();
-    mScreen.attach(texture,mEffects,mesh);
+    mScreen.attach(mTexture,mEffects,new MeshFlat(30,30*bmpHeight/bmpWidth));
 
     DistortedEffects.enableEffect(EffectNames.SINK);
 
diff --git a/src/main/java/org/distorted/examples/starwars/StarWarsActivity.java b/src/main/java/org/distorted/examples/starwars/StarWarsActivity.java
index d9a82c3..402812b 100644
--- a/src/main/java/org/distorted/examples/starwars/StarWarsActivity.java
+++ b/src/main/java/org/distorted/examples/starwars/StarWarsActivity.java
@@ -47,6 +47,7 @@ public class StarWarsActivity extends Activity
     {
     mView.onPause();
     mView.getRenderer().onPause();
+    Distorted.onPause();
     super.onPause();
     }
 
diff --git a/src/main/java/org/distorted/examples/wind/WindActivity.java b/src/main/java/org/distorted/examples/wind/WindActivity.java
index 7068c71..092a538 100644
--- a/src/main/java/org/distorted/examples/wind/WindActivity.java
+++ b/src/main/java/org/distorted/examples/wind/WindActivity.java
@@ -60,6 +60,7 @@ public class WindActivity extends Activity implements OnSeekBarChangeListener
       {
       GLSurfaceView view = (GLSurfaceView) this.findViewById(R.id.windSurfaceView);
       view.onPause();
+      Distorted.onPause();
       super.onPause();
       }
 
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 1e1758a..aa2de6f 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -78,7 +78,7 @@
 
     <string name="example_monalisa">Mona Lisa</string>  
     <string name="example_monalisa_subtitle">The basics of Distortions.</string>
-    <string name="example_sink">Cat</string>
+    <string name="example_sink">Sink</string>
     <string name="example_sink_subtitle">Learn about sinks.</string>
     <string name="example_bean">Mr. Bean</string>  
     <string name="example_bean_subtitle">Interpolation between more than two Points.</string>
