commit d381aa80d8f2becc78414a2f4cf8cfa41aca5c7a
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Mar 18 16:44:56 2019 +0000

    Move the default center of the matrix effects to the center of the screen (rather than the bottom-left like before)

diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 3554fd0..2ac3d04 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -27,7 +27,6 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.VertexEffectDistort;
 import org.distorted.library.main.DistortedEffects;
@@ -52,8 +51,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
    private DistortedScreen mScreen;
    private DistortedTexture mTexture;
    private MeshFlat mMesh;
-   private int mObjHeight, mObjWidth;
-   private Static3D mMove, mScale;
+   private Static3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -85,13 +83,11 @@ class BeanRenderer implements GLSurfaceView.Renderer
       dynRight.add(vect1);
       dynRight.add(vect1);
 
-      mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
 
       mEffects = new DistortedEffects();
       mEffects.apply( new VertexEffectDistort(dynLeft , pointLeft , regionLeft) );
       mEffects.apply( new VertexEffectDistort(dynRight, pointRight, regionRight));
-      mEffects.apply( new MatrixEffectMove (mMove ) );
       mEffects.apply( new MatrixEffectScale(mScale) );
 
       mScreen = new DistortedScreen();
@@ -108,22 +104,12 @@ class BeanRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceChanged(GL10 glUnused, int width, int height)
      {
-     if( (float)mObjHeight/mObjWidth > (float)height/width )
-        {
-        int w = (height*mObjWidth)/mObjHeight;
-        float factor = (float)height/mObjHeight;
-        mMove.set((width-w)/2,0,0);
-        mScale.set(factor,factor,factor);
-        }
-     else
-        {
-        int h = (width*mObjHeight)/mObjWidth;
-        float factor = (float)width/mObjWidth;
-        mMove.set(0,(height-h)/2,0);
-        mScale.set(factor,factor,factor);
-        }
-
-     mScreen.resize(width,height);
+     float horiRatio = (float)width / mTexture.getWidth();
+     float vertRatio = (float)height/ mTexture.getHeight();
+     float factor    = horiRatio > vertRatio ? vertRatio : horiRatio;
+
+     mScale.set( factor,factor,factor );
+     mScreen.resize(width, height);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -146,12 +132,12 @@ class BeanRenderer implements GLSurfaceView.Renderer
        catch(IOException e) { }
        }
       
-     mObjHeight = bitmap.getHeight();
-     mObjWidth  = bitmap.getWidth();
+     int bmpHeight = bitmap.getHeight();
+     int bmpWidth  = bitmap.getWidth();
       
-     if( mTexture==null ) mTexture = new DistortedTexture(mObjWidth,mObjHeight);
+     if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
      mTexture.setTexture(bitmap);
-     if( mMesh==null ) mMesh = new MeshFlat(25,25*mObjHeight/mObjWidth);
+     if( mMesh==null ) mMesh = new MeshFlat(25,25*bmpHeight/bmpWidth);
 
      mScreen.detachAll();
      mScreen.attach(mTexture,mEffects,mMesh);
diff --git a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
index 26e90c2..ba1cebb 100644
--- a/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
+++ b/src/main/java/org/distorted/examples/catanddog/CatAndDogRenderer.java
@@ -36,6 +36,7 @@ import org.distorted.library.main.DistortedEffects;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.main.DistortedTexture;
 import org.distorted.library.mesh.MeshFlat;
+import org.distorted.library.type.Dynamic;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Dynamic3D;
 import org.distorted.library.type.Static1D;
@@ -49,7 +50,8 @@ import android.opengl.GLSurfaceView;
 
 class CatAndDogRenderer implements GLSurfaceView.Renderer
 {
-    private static final int DURATION = 10000;  // 10 seconds
+    private static final int DURATION_CHROMA_ALPHA   =  3000;
+    private static final int DURATION_MATRIX_EFFECTS = 10000;
 
     private GLSurfaceView mView;
     private DistortedEffects mEffects;
@@ -57,7 +59,7 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
     private DistortedTexture mTexture;
     private DistortedScreen mScreen;
     private int mObjHeight, mObjWidth;
-    private Static3D mMove, mRotate;
+    private Static3D mMoveStartingPoint, mMoveEndPoint;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -67,28 +69,31 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
 
       mMesh = new MeshFlat(1,1);  // no vertex effects, grid can be a (1x1) quad.
 
-      Dynamic3D moveDyn= new Dynamic3D(DURATION,0.0f);
-      mRotate = new Static3D(0,0,0);
-      mMove   = new Static3D(0,0,0);
+      Dynamic3D moveDyn= new Dynamic3D(DURATION_MATRIX_EFFECTS,0.0f);
 
-      moveDyn.add(mMove);
-      moveDyn.add(new Static3D(0,0,0));
+      mMoveStartingPoint = new Static3D(0,0,0);
+      mMoveEndPoint      = new Static3D(0,0,0);
+
+      moveDyn.add(mMoveStartingPoint);
+      moveDyn.add(mMoveEndPoint);
 
       Static3D chromaCenter= new Static3D( 530, 300, 0   );
       Static3D chromaRegion= new Static3D( 100, 100, 100 );
       Static3D alphaCenter = new Static3D( 230, 300, 0   );
       Static3D alphaRegion = new Static3D( 100, 100, 100 );
 
-      Dynamic1D chromaDyn = new Dynamic1D(3000,0.0f);
+      Dynamic1D chromaDyn = new Dynamic1D(DURATION_CHROMA_ALPHA,0.0f);
       chromaDyn.add(new Static1D(1));
       chromaDyn.add(new Static1D(0));
-      Dynamic1D alphaDyn = new Dynamic1D(3000,0.0f);
+      Dynamic1D alphaDyn = new Dynamic1D(DURATION_CHROMA_ALPHA,0.0f);
       alphaDyn.add(new Static1D(1));
       alphaDyn.add(new Static1D(0));
-      Dynamic3D diScale = new Dynamic3D(DURATION,0.0f);
+      Dynamic3D diScale = new Dynamic3D(DURATION_MATRIX_EFFECTS,0.0f);
       diScale.add(new Static3D(1,1,1));
       diScale.add(new Static3D(0.33f,0.33f,1));
-      Dynamic1D diRotate = new Dynamic1D(DURATION,0.0f);
+      diScale.add(new Static3D(1,1,1));
+      diScale.setMode(Dynamic.MODE_PATH);
+      Dynamic1D diRotate = new Dynamic1D(DURATION_MATRIX_EFFECTS,0.0f);
       diRotate.add(new Static1D(  0));
       diRotate.add(new Static1D(360));
 
@@ -97,7 +102,7 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
       mEffects.apply( new FragmentEffectAlpha(alphaDyn, alphaCenter, alphaRegion, false) );
       mEffects.apply( new MatrixEffectMove(moveDyn));
       mEffects.apply( new MatrixEffectScale(diScale));
-      mEffects.apply( new MatrixEffectRotate( diRotate, new Static3D(0,0,1), mRotate) );
+      mEffects.apply( new MatrixEffectRotate( diRotate, new Static3D(0,0,1), new Static3D(0,0,0)) );
 
       mScreen = new DistortedScreen();
       }
@@ -106,7 +111,9 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
 
     public void onSurfaceChanged(GL10 glUnused, int width, int height)
       {
-      mMove.set(width-mObjWidth,height-mObjHeight,0);
+      mMoveStartingPoint.set( (width-mObjWidth)/2, (height-mObjHeight)/2, 0);
+      mMoveEndPoint     .set(-(width-mObjWidth)/2,-(height-mObjHeight)/2, 0);
+
       mScreen.resize(width, height);
       }
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -138,7 +145,6 @@ class CatAndDogRenderer implements GLSurfaceView.Renderer
       
       mObjHeight = bitmap.getHeight();
       mObjWidth  = bitmap.getWidth();
-      mRotate.set(mObjWidth/2,mObjHeight/2,0);
 
       if( mTexture==null ) mTexture = new DistortedTexture(mObjWidth,mObjHeight);
       mTexture.setTexture(bitmap);
diff --git a/src/main/java/org/distorted/examples/deform/DeformRenderer.java b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
index 3b8d167..0ca9e56 100644
--- a/src/main/java/org/distorted/examples/deform/DeformRenderer.java
+++ b/src/main/java/org/distorted/examples/deform/DeformRenderer.java
@@ -23,7 +23,6 @@ import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.library.effect.EffectName;
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectShear;
 import org.distorted.library.effect.VertexEffectDeform;
 import org.distorted.library.effect.VertexEffectDistort;
@@ -63,7 +62,6 @@ class DeformRenderer implements GLSurfaceView.Renderer
    private Static3D[] vShear;
 
    private Static4D mRegion;
-   private Static3D mMove;
    private int scrHeight, scrWidth;
    private float mRadius;
 
@@ -82,7 +80,6 @@ class DeformRenderer implements GLSurfaceView.Renderer
 
       stretchEffects = new DistortedEffects();
       mRegion     = new Static4D(0,0,0,0);
-      mMove       = new Static3D(0,0,0);
       mTouchPoint = new Static3D(0,0,0);
 
       // DISTORT
@@ -142,8 +139,6 @@ class DeformRenderer implements GLSurfaceView.Renderer
       mReleasedDistort = new VertexEffectDistort( releasedDistortDynamic, mTouchPoint, mRegion);
       mReleasedDeform  = new VertexEffectDeform ( releasedDeformDynamic , mTouchPoint, mRegion);
       mReleasedShear   = new MatrixEffectShear  ( releasedShearDynamic  , mTouchPoint         );
-
-      stretchEffects.apply(new MatrixEffectMove(mMove));
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -202,11 +197,8 @@ class DeformRenderer implements GLSurfaceView.Renderer
      if( stretchTexture==null ) stretchTexture = new DistortedTexture(w,h);
      stretchTexture.setTexture(stretchBitmap);
 
-     mMove.set(scrWidth/4,scrHeight/4,0);
-
      mScreen.detachAll();
      mScreen.attach(stretchTexture,stretchEffects,stretchMesh);
-
      mScreen.resize(width, height);
      }
 
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index 3d25bdc..c6a6519 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -27,7 +27,6 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.VertexEffectDistort;
 import org.distorted.library.effect.VertexEffectSink;
@@ -58,8 +57,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
     private MeshFlat mMesh;
     private Static3D v0,v1,v2,v3;
     private Static1D dBegin, dMiddle, dEnd, s0;
-    private int bmpHeight, bmpWidth;
-    private Static3D mMove, mScale;
+    private Static3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -123,9 +121,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
       mEffects.apply( new VertexEffectDistort( diR   , pRight, Region    ) );
       mEffects.apply( new VertexEffectSwirl  ( diHips, pHips , HipsRegion) );
 
-      mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
 
       mScreen = new DistortedScreen();
@@ -167,23 +163,11 @@ class GirlRenderer implements GLSurfaceView.Renderer
     
    public void onSurfaceChanged(GL10 glUnused, int width, int height)
      {
-     if( (float)bmpHeight/bmpWidth > (float)height/width )
-       {
-       int w = (height*bmpWidth)/bmpHeight;
-       float factor = (float)height/bmpHeight;
-
-       mMove.set((width-w)/2,0,0);
-       mScale.set(factor,factor,factor);
-       }
-     else
-       {
-       int h = (width*bmpHeight)/bmpWidth;
-       float factor = (float)width/bmpWidth;
+     float horiRatio = (float)width / mTexture.getWidth();
+     float vertRatio = (float)height/ mTexture.getHeight();
+     float factor    = horiRatio > vertRatio ? vertRatio : horiRatio;
 
-       mMove.set(0,(height-h)/2,0);
-       mScale.set(factor,factor,factor);
-       }
-      
+     mScale.set( factor,factor,factor );
      mScreen.resize(width, height);
      }
 
@@ -207,8 +191,8 @@ class GirlRenderer implements GLSurfaceView.Renderer
        catch(IOException e) { }
        }
       
-     bmpHeight = bitmap.getHeight();
-     bmpWidth  = bitmap.getWidth();
+     int bmpHeight = bitmap.getHeight();
+     int bmpWidth  = bitmap.getWidth();
 
      if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
      mTexture.setTexture(bitmap);
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index ec22c3a..4762161 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -29,7 +29,6 @@ import javax.microedition.khronos.opengles.GL10;
 import org.distorted.examples.R;
 
 import org.distorted.library.effect.EffectType;
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.VertexEffectDistort;
 import org.distorted.library.main.Distorted;
@@ -51,7 +50,7 @@ import android.opengl.GLSurfaceView;
 
 class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener 
 {
-   private final int NUM_BUBBLES = 12;
+   private final int NUM_CONCURRENT_BUBBLES = 12;
 
    private GLSurfaceView mView;
    private DistortedEffects mEffects;
@@ -60,7 +59,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
    private MeshFlat mMesh;
    private int bmpHeight, bmpWidth;
    private Random mRnd;
-   private Static3D mMove, mScale;
+   private Static3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -72,9 +71,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       mScreen = new DistortedScreen();
       mRnd = new Random(0);
 
-      mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
       }
 
@@ -121,23 +118,11 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
     
    public void onSurfaceChanged(GL10 glUnused, int width, int height)
      {
-     if( (float)bmpHeight/bmpWidth > (float)height/width )
-       {
-       int w = (height*bmpWidth)/bmpHeight;
-       float factor = (float)height/bmpHeight;
+     float horiRatio = (float)width / mTexture.getWidth();
+     float vertRatio = (float)height/ mTexture.getHeight();
+     float factor    = horiRatio > vertRatio ? vertRatio : horiRatio;
 
-       mMove.set((width-w)/2,0,0);
-       mScale.set(factor,factor,factor);
-       }
-     else
-       {
-       int h = (width*bmpHeight)/bmpWidth;
-       float factor = (float)width/bmpWidth;
-
-       mMove.set(0,(height-h)/2,0);
-       mScale.set(factor,factor,factor);
-       }
-      
+     mScale.set( factor,factor,factor );
      mScreen.resize(width, height);
      }
 
@@ -172,11 +157,11 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
      mScreen.detachAll();
      mScreen.attach(mTexture,mEffects,mMesh);
 
-     for(int i=0; i<NUM_BUBBLES; i++) addNewBubble();
+     for(int i = 0; i< NUM_CONCURRENT_BUBBLES; i++) addNewBubble();
 
      // one more than we have bubbles at any given time because it can sometimes
      // happen that the old bubble is not yet removed when we add a new one
-     DistortedEffects.setMax(EffectType.VERTEX,NUM_BUBBLES+1);
+     DistortedEffects.setMax(EffectType.VERTEX, NUM_CONCURRENT_BUBBLES +1);
      VertexEffectDistort.enable();
 
      try
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index c24524f..7bed9a9 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -26,7 +26,6 @@ import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.VertexEffectDistort;
 import org.distorted.library.main.Distorted;
@@ -51,8 +50,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
     private DistortedTexture mTexture;
     private MeshFlat mMesh;
     private DistortedScreen mScreen;
-    private int bmpHeight, bmpWidth;
-    private Static3D mMove, mScale;
+    private Static3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -88,9 +86,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       mEffects.apply( new VertexEffectDistort(dLeft , pLeft , rLeft ) );
       mEffects.apply( new VertexEffectDistort(dRight, pRight, rRight) );
 
-      mMove = new Static3D(0,0,0);
       mScale= new Static3D(1,1,1);
-      mEffects.apply(new MatrixEffectMove(mMove));
       mEffects.apply(new MatrixEffectScale(mScale));
 
       mScreen = new DistortedScreen();
@@ -106,24 +102,12 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
     public void onSurfaceChanged(GL10 glUnused, int width, int height) 
-      { 
-      if( (float)bmpHeight/bmpWidth > (float)height/width )
-        {
-        int w = (height*bmpWidth)/bmpHeight;
-        float factor = (float)height/bmpHeight;
-
-        mMove.set((width-w)/2,0,0);
-        mScale.set( factor,factor,factor );
-        }
-      else
-        {
-        int h = (width*bmpHeight)/bmpWidth;
-        float factor = (float)width/bmpWidth;
-
-        mMove.set(0,(height-h)/2,0);
-        mScale.set( factor,factor,factor );
-        }
+      {
+      float horiRatio = (float)width / mTexture.getWidth();
+      float vertRatio = (float)height/ mTexture.getHeight();
+      float factor    = horiRatio > vertRatio ? vertRatio : horiRatio;
 
+      mScale.set( factor,factor,factor );
       mScreen.resize(width, height);
       }
 
@@ -147,8 +131,8 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
         catch(IOException e) { }
         }  
 
-      bmpHeight = bitmap.getHeight();
-      bmpWidth  = bitmap.getWidth();
+      int bmpHeight = bitmap.getHeight();
+      int bmpWidth  = bitmap.getWidth();
 
       // 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.
diff --git a/src/main/java/org/distorted/examples/rubik/RubikRenderer.java b/src/main/java/org/distorted/examples/rubik/RubikRenderer.java
index 7703c0a..cd62243 100644
--- a/src/main/java/org/distorted/examples/rubik/RubikRenderer.java
+++ b/src/main/java/org/distorted/examples/rubik/RubikRenderer.java
@@ -84,7 +84,7 @@ class RubikRenderer implements GLSurfaceView.Renderer
       // 3x2 bitmap = 6 squares:
       //
       // RED     GREEN   BLUE
-      // YELLOW  WHITE   BROWN
+      // YELLOW  WHITE   ORANGE
 
       final float ze = 0.0f;
       final float ot = 1.0f/3.0f;
@@ -177,22 +177,22 @@ class RubikRenderer implements GLSurfaceView.Renderer
       // 3x2 bitmap = 6 squares:
       //
       // RED     GREEN   BLUE
-      // YELLOW  WHITE   BROWN
+      // YELLOW  WHITE   ORANGE
 
       paint.setColor(0xff000000);                                  // BLACK BACKGROUND
       canvas.drawRect(0, 0, W, H, paint);                          //
 
-      paint.setColor(0xffff0000);                                  // RED
+      paint.setColor(0xffb90000);                                  // RED
       canvas.drawRoundRect(  0+M, 0+M,   S-M,   S-M, R, R, paint); //
-      paint.setColor(0xff00ff00);                                  // GREEN
+      paint.setColor(0xff009b48);                                  // GREEN
       canvas.drawRoundRect(  S+M, 0+M, 2*S-M,   S-M, R, R, paint); //
-      paint.setColor(0xff0000ff);                                  // BLUE
+      paint.setColor(0xff0045ad);                                  // BLUE
       canvas.drawRoundRect(2*S+M, 0+M, 3*S-M,   S-M, R, R, paint); //
-      paint.setColor(0xffffff00);                                  // YELLOW
+      paint.setColor(0xffffd500);                                  // YELLOW
       canvas.drawRoundRect(  0+M, S+M,   S-M, 2*S-M, R, R, paint); //
       paint.setColor(0xffffffff);                                  // WHITE
       canvas.drawRoundRect(  S+M, S+M, 2*S-M, 2*S-M, R, R, paint); //
-      paint.setColor(0xffb5651d);                                  // BROWN
+      paint.setColor(0xffff5900);                                  // ORANGE
       canvas.drawRoundRect(2*S+M, S+M, 3*S-M, 2*S-M, R, R, paint); //
 
       if( mTexture==null ) mTexture = new DistortedTexture(SIZE,SIZE);
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index 0e39b73..8ef608c 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -27,7 +27,6 @@ import javax.microedition.khronos.opengles.GL10;
 
 import org.distorted.examples.R;
 
-import org.distorted.library.effect.MatrixEffectMove;
 import org.distorted.library.effect.MatrixEffectScale;
 import org.distorted.library.effect.VertexEffectSink;
 import org.distorted.library.main.Distorted;
@@ -52,8 +51,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
   private DistortedScreen mScreen;
   private DistortedTexture mTexture;
   private MeshFlat mMesh;
-  private int bmpHeight, bmpWidth;
-  private Static3D mScale, mMove;
+  private Static3D mScale;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -70,8 +68,6 @@ class SinkRenderer implements GLSurfaceView.Renderer
     mEffects.apply(sinkEffect);
 
     mScale = new Static3D(1,1,1);
-    mMove  = new Static3D(0,0,0);
-    mEffects.apply(new MatrixEffectMove(mMove));
     mEffects.apply(new MatrixEffectScale(mScale));
 
     mScreen = new DistortedScreen();
@@ -87,22 +83,12 @@ class SinkRenderer implements GLSurfaceView.Renderer
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
   public void onSurfaceChanged(GL10 glUnused, int width, int height) 
-    { 
-    if( (float)bmpHeight/bmpWidth > (float)height/width )
-      {
-      int w = (height*bmpWidth)/bmpHeight;
-      float factor = (float)height/bmpHeight;
-      mMove.set((width-w)/2,0,0);
-      mScale.set(factor,factor,factor);
-      }
-    else
-      {
-      int h = (width*bmpHeight)/bmpWidth;
-      float factor = (float)width/bmpWidth;
-      mMove.set(0,(height-h)/2,0);
-      mScale.set(factor,factor,factor);
-      }
-      
+    {
+    float horiRatio = (float)width / mTexture.getWidth();
+    float vertRatio = (float)height/ mTexture.getHeight();
+    float factor    = horiRatio > vertRatio ? vertRatio : horiRatio;
+
+    mScale.set( factor,factor,factor );
     mScreen.resize(width, height);
     }
 
@@ -126,8 +112,8 @@ class SinkRenderer implements GLSurfaceView.Renderer
       catch(IOException e) { }
       }  
       
-    bmpHeight = bitmap.getHeight();
-    bmpWidth  = bitmap.getWidth();
+    int bmpHeight = bitmap.getHeight();
+    int bmpWidth  = bitmap.getWidth();
 
     if( mTexture==null ) mTexture = new DistortedTexture(bmpWidth,bmpHeight);
     mTexture.setTexture(bitmap);
