commit 3c8433ae6d647dc2d08a7d36f7ee7e74ba3a4b8f
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Thu Dec 8 16:47:17 2016 +0000

    Move the 'Save' app to using a DistortedFramebuffer.

diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index 6522b90..4a62941 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -32,6 +32,7 @@ import org.distorted.examples.R;
 
 import org.distorted.library.Distorted;
 import org.distorted.library.DistortedBitmap;
+import org.distorted.library.DistortedFramebuffer;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
@@ -50,11 +51,13 @@ class SaveRenderer implements GLSurfaceView.Renderer
   {
   private GLSurfaceView mView;
   private DistortedBitmap mGirl;
+  private DistortedFramebuffer mOffscreen;
   private Static3D pLeft, pRight;
   private Static4D sinkRegion;
   private Dynamic1D diSink;
   private Static1D s0;
 
+  private int fboHeight, fboWidth;
   private int bmpHeight, bmpWidth;
   private int scrHeight, scrWidth;
   private float boobsSink;
@@ -78,6 +81,9 @@ class SaveRenderer implements GLSurfaceView.Renderer
       
     diSink = new Dynamic1D(0,0.5f);
     diSink.add(s0);
+
+    fboHeight = 150;
+    fboWidth  = 100;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -116,19 +122,26 @@ class SaveRenderer implements GLSurfaceView.Renderer
   public void onDrawFrame(GL10 glUnused)
     {
     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-      
-    mGirl.draw(System.currentTimeMillis());
 
-    if( isSaving )  // we should save the buffer to location pointed at by mPath
+    if( isSaving )  // render to an offscreen buffer and read pixels
       {
-      ByteBuffer buf = ByteBuffer.allocateDirect( scrWidth*scrHeight*4 );
+      long scaleID = mGirl.scale(new Static3D( (float)fboWidth/scrWidth, (float)fboHeight/scrHeight, 1.0f));
+      mGirl.draw(System.currentTimeMillis(), mOffscreen);
+      mGirl.abortEffect(scaleID);
+
+      ByteBuffer buf = ByteBuffer.allocateDirect( fboWidth*fboHeight*4 );
       buf.order(ByteOrder.LITTLE_ENDIAN);
-      GLES20.glReadPixels( 0, 0, scrWidth, scrHeight , GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+      mOffscreen.setAsInput();
 
-      SaveWorkerThread.newBuffer(buf,scrWidth,scrHeight,mPath);
+      GLES20.glReadPixels( 0, 0, fboWidth, fboHeight , GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+      SaveWorkerThread.newBuffer(buf,fboWidth,fboHeight,mPath);
 
       isSaving = false;
       }
+    else
+      {
+      mGirl.draw(System.currentTimeMillis());
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -190,6 +203,8 @@ class SaveRenderer implements GLSurfaceView.Renderer
     mGirl.sink( diSink, pLeft , sinkRegion);
     mGirl.sink( diSink, pRight, sinkRegion);
 
+    mOffscreen = new DistortedFramebuffer(fboWidth,fboHeight);
+
     try
       {
       Distorted.onSurfaceCreated(mView.getContext());
