commit cdd6333d10baf872e3801895ba00a5f65be76c4d
Author: Leszek Koltunski <leszek@distoretedandroid.org>
Date:   Wed Jun 15 16:14:07 2016 +0100

    Move the 'Save' effect to the Application and remove the 'OTHER' effect queue

diff --git a/src/main/java/org/distorted/library/Distorted.java b/src/main/java/org/distorted/library/Distorted.java
index 0e95fbe..447ac9e 100644
--- a/src/main/java/org/distorted/library/Distorted.java
+++ b/src/main/java/org/distorted/library/Distorted.java
@@ -448,17 +448,6 @@ public class Distorted
     return EffectQueue.getMax(EffectTypes.FRAGMENT.ordinal());
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Returns the maximum number of Other effects.
- *
- * @return The maximum number of Other effects
- */
-  public static int getMaxOther()
-    {
-    return EffectQueue.getMax(EffectTypes.OTHER.ordinal());
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 /**
  * Sets the maximum number of Matrix effects that can be applied to a single DistortedObject at one time.
@@ -513,20 +502,6 @@ public class Distorted
     return EffectQueue.setMax(EffectTypes.FRAGMENT.ordinal(),max);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-/**
- * Sets the maximum number of Other effects that can be applied to a single DistortedObject at one time.
- * This can fail if the value of 'max' is outside permitted range.
- *
- * @param max new maximum number of simultaneous Other Effects. Has to be a non-negative number not greater
- *            than Byte.MAX_VALUE
- * @return <code>true</code> if operation was successful, <code>false</code> otherwise.
- */
-  public static boolean setMaxOther(int max)
-    {
-    return EffectQueue.setMax(EffectTypes.OTHER.ordinal(),max);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 //end of file  
 }
diff --git a/src/main/java/org/distorted/library/DistortedObject.java b/src/main/java/org/distorted/library/DistortedObject.java
index 1aa92cf..1b1b681 100644
--- a/src/main/java/org/distorted/library/DistortedObject.java
+++ b/src/main/java/org/distorted/library/DistortedObject.java
@@ -49,7 +49,6 @@ public abstract class DistortedObject
     protected EffectQueueMatrix    mM;
     protected EffectQueueFragment  mF;
     protected EffectQueueVertex    mV;
-    protected EffectQueueOther mO;
 
     protected boolean matrixCloned, vertexCloned, fragmentCloned;
  
@@ -119,8 +118,6 @@ public abstract class DistortedObject
         mF = new EffectQueueFragment(d);
         fragmentCloned = false;   
         }
-
-      mO= new EffectQueueOther(d); // Other effects are never cloned.
       }
     
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -165,8 +162,6 @@ public abstract class DistortedObject
       mF.send();
        
       mGrid.draw();
-
-      mO.send();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -188,14 +183,11 @@ public abstract class DistortedObject
       if( vertexCloned  ==false) mV.abortAll();
       if( fragmentCloned==false) mF.abortAll();
 
-      mO.abortAll();
-
       mBmp          = null;
       mGrid         = null;
       mM            = null;
       mV            = null;
       mF            = null;
-      mO            = null;
       mTextureDataH = null;
       }
  
@@ -325,7 +317,6 @@ public abstract class DistortedObject
      mV.addListener(el);
      mF.addListener(el);
      mM.addListener(el);
-     mO.addListener(el);
      }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -339,7 +330,6 @@ public abstract class DistortedObject
      mV.removeListener(el);
      mF.removeListener(el);
      mM.removeListener(el);
-     mO.removeListener(el);
      }
    
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -393,7 +383,7 @@ public abstract class DistortedObject
  */
     public int abortAllEffects()
       {
-      return mM.abortAll() + mV.abortAll() + mF.abortAll() + mO.abortAll();
+      return mM.abortAll() + mV.abortAll() + mF.abortAll();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -410,7 +400,6 @@ public abstract class DistortedObject
         case MATRIX  : return mM.abortAll();
         case VERTEX  : return mV.abortAll();
         case FRAGMENT: return mF.abortAll();
-        case OTHER   : return mO.abortAll();
         default      : return 0;
         }
       }
@@ -429,7 +418,6 @@ public abstract class DistortedObject
       if( type==EffectTypes.MATRIX.type   ) return mM.removeByID(id>>EffectTypes.LENGTH);
       if( type==EffectTypes.VERTEX.type   ) return mV.removeByID(id>>EffectTypes.LENGTH);
       if( type==EffectTypes.FRAGMENT.type ) return mF.removeByID(id>>EffectTypes.LENGTH);
-      if( type==EffectTypes.OTHER.type    ) return mO.removeByID(id>>EffectTypes.LENGTH);
 
       return 0;
       }
@@ -448,7 +436,6 @@ public abstract class DistortedObject
         case MATRIX  : return mM.removeByType(name);
         case VERTEX  : return mV.removeByType(name);
         case FRAGMENT: return mF.removeByType(name);
-        case OTHER   : return mO.removeByType(name);
         default      : return 0;
         }
       }
@@ -468,7 +455,6 @@ public abstract class DistortedObject
       if( type==EffectTypes.MATRIX.type   )  return mM.printByID(id>>EffectTypes.LENGTH);
       if( type==EffectTypes.VERTEX.type   )  return mV.printByID(id>>EffectTypes.LENGTH);
       if( type==EffectTypes.FRAGMENT.type )  return mF.printByID(id>>EffectTypes.LENGTH);
-      if( type==EffectTypes.OTHER.type    )  return mO.printByID(id>>EffectTypes.LENGTH);
 
       return false;
       }
@@ -2552,19 +2538,4 @@ public abstract class DistortedObject
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // WAVE
 
-///////////////////////////////////////////////////////////////////////////////////////////////////   
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Other-based effects
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// SAVE_PNG
-/**
- * Save the current state of the Object that's backing up our DistortedObject to a PNG file.
- *
- * @param filename Full path to the file.
- * @return         ID of the effect added, or -1 if we failed to add one.
- */
- public long savePNG(String filename, int left, int top, int width, int height)
-   {
-   return mO.add(EffectNames.SAVE_PNG, filename, left, top, width, height);
-   }
 }
diff --git a/src/main/java/org/distorted/library/EffectNames.java b/src/main/java/org/distorted/library/EffectNames.java
index 4f9521d..10bf377 100644
--- a/src/main/java/org/distorted/library/EffectNames.java
+++ b/src/main/java/org/distorted/library/EffectNames.java
@@ -53,13 +53,9 @@ public enum EffectNames
   CONTRAST         ( EffectTypes.FRAGMENT,   new float[] {1.0f}           ),
   SMOOTH_CONTRAST  ( EffectTypes.FRAGMENT,   new float[] {1.0f}           ),
   HUE              ( EffectTypes.FRAGMENT,   new float[] {0.0f}           ),
-  SMOOTH_HUE       ( EffectTypes.FRAGMENT,   new float[] {0.0f}           ),
+  SMOOTH_HUE       ( EffectTypes.FRAGMENT,   new float[] {0.0f}           );
   // add new Fragment effects here...
 
-  SAVE_PNG         ( EffectTypes.OTHER   ,   null                         ),      // OTHER Effects don't have Unities.
-  SAVE_MP4         ( EffectTypes.OTHER   ,   null                         );      //
-  // add new Other effects here...
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
   
   private static final int MAXDIM = 4;  // maximum supported dimension of an effect  
@@ -110,9 +106,8 @@ public enum EffectNames
     {
     if( ordinal<DISTORT.ordinal()     ) return EffectTypes.MATRIX;
     if( ordinal<MACROBLOCK.ordinal()  ) return EffectTypes.VERTEX;
-    if( ordinal<SAVE_PNG.ordinal()    ) return EffectTypes.FRAGMENT;
 
-    return EffectTypes.OTHER;
+    return EffectTypes.FRAGMENT;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/library/EffectQueueOther.java b/src/main/java/org/distorted/library/EffectQueueOther.java
deleted file mode 100644
index 4a49cbb..0000000
--- a/src/main/java/org/distorted/library/EffectQueueOther.java
+++ /dev/null
@@ -1,177 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2016 Leszek Koltunski                                                               //
-//                                                                                               //
-// This file is part of Distorted.                                                               //
-//                                                                                               //
-// Distorted is free software: you can redistribute it and/or modify                             //
-// it under the terms of the GNU General Public License as published by                          //
-// the Free Software Foundation, either version 2 of the License, or                             //
-// (at your option) any later version.                                                           //
-//                                                                                               //
-// Distorted is distributed in the hope that it will be useful,                                  //
-// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
-// GNU General Public License for more details.                                                  //
-//                                                                                               //
-// You should have received a copy of the GNU General Public License                             //
-// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-package org.distorted.library;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-import android.graphics.Bitmap;
-import android.opengl.GLES20;
-
-import org.distorted.library.message.EffectMessage;
-
-import java.io.BufferedOutputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-class EffectQueueOther extends EffectQueue
-  {
-  private static final int NUM_UNIFORMS = 4;
-  private static final int INDEX = EffectTypes.OTHER.ordinal();
-  private String[] mFilename;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public EffectQueueOther(DistortedObject obj)
-    {
-    super(obj,NUM_UNIFORMS, INDEX );
-
-    if( mMax[INDEX]>0 )
-      {
-      mFilename= new String[mMax[INDEX]];
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  protected void moveEffect(int index)
-    {
-    mFilename[index] = mFilename[index+1];
-
-    mUniforms[NUM_UNIFORMS*index  ] = mUniforms[NUM_UNIFORMS*(index+1)  ];
-    mUniforms[NUM_UNIFORMS*index+1] = mUniforms[NUM_UNIFORMS*(index+1)+1];
-    mUniforms[NUM_UNIFORMS*index+2] = mUniforms[NUM_UNIFORMS*(index+1)+2];
-    mUniforms[NUM_UNIFORMS*index+3] = mUniforms[NUM_UNIFORMS*(index+1)+3];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// runs on the graphics thread
-
-  synchronized void send()
-    {
-    for(int i=0; i<mNumEffects; i++)
-      {
-      if (mType[i] == EffectNames.SAVE_PNG.ordinal() )
-        {
-        int left  = (int)mUniforms[NUM_UNIFORMS*i  ];
-        int top   = (int)mUniforms[NUM_UNIFORMS*i+1];
-        int width = (int)mUniforms[NUM_UNIFORMS*i+2];
-        int height= (int)mUniforms[NUM_UNIFORMS*i+3];
-
-        ByteBuffer buf = ByteBuffer.allocateDirect( width*height*4 );
-        buf.order(ByteOrder.LITTLE_ENDIAN);
-        GLES20.glReadPixels( left, top, width, height , GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
-
-        flipUpsideDown(buf,width,height); // GL uses a coordinate system from mathematics; i.e.
-                                          // (0,0) is in the lower-left corner. 2D stuff has
-                                          // the origin on the upper-left corner; we have to flip
-                                          // out bitmap upside down!
-        buf.rewind();
-        BufferedOutputStream bos = null;
-
-        try
-          {
-          bos = new BufferedOutputStream(new FileOutputStream(mFilename[i]));
-          Bitmap bmp = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888);
-          bmp.copyPixelsFromBuffer(buf);
-          bmp.compress(Bitmap.CompressFormat.PNG, 90, bos);
-          bmp.recycle();
-
-          for(int j=0; j<mNumListeners; j++)
-            EffectMessageSender.newMessage( mListeners.elementAt(j),
-                                            EffectMessage.EFFECT_FINISHED,
-                                           (mID[i]<<EffectTypes.LENGTH)+EffectTypes.OTHER.type,
-                                            mType[i],
-                                            mBitmapID,
-                                            null);
-          }
-        catch(Exception e)
-          {
-          for(int j=0; j<mNumListeners; j++)
-            EffectMessageSender.newMessage( mListeners.elementAt(j),
-                                            EffectMessage.EFFECT_FAILED,
-                                           (mID[i]<<EffectTypes.LENGTH)+EffectTypes.OTHER.type,
-                                            mType[i],
-                                            mBitmapID,
-                                            e.getMessage());
-          }
-        finally
-          {
-          if (bos != null)
-            {
-            try {bos.close();}
-            catch(IOException io ) {}
-            }
-          }
-
-        remove(i);
-        i--;
-        continue;
-        }
-      else if (mType[i] == EffectNames.SAVE_MP4.ordinal() )
-        {
-        // TODO: Implement SAVE_MP4 HERE
-        }
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  synchronized long add(EffectNames eln, String filename, int left, int top, int width, int height)
-    {
-    if( mMax[INDEX]>mNumEffects )
-      {
-      mFilename[mNumEffects] = filename;
-      mInterI[mNumEffects] = null;
-      mInterP[mNumEffects] = null;
-
-      mUniforms[NUM_UNIFORMS*mNumEffects  ] =  left;
-      mUniforms[NUM_UNIFORMS*mNumEffects+1] =   top;
-      mUniforms[NUM_UNIFORMS*mNumEffects+2] = width;
-      mUniforms[NUM_UNIFORMS*mNumEffects+3] =height;
-
-      return addBase(eln);
-      }
-
-    return -1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private void flipUpsideDown(ByteBuffer buf, int width, int height)
-    {
-    byte[] tmp1 = new byte[width*4];
-    byte[] tmp2 = new byte[width*4];
-
-    for(int i=0; i<height/2; i++)
-      {
-      buf.position((         i)*width*4);
-      buf.get(tmp1);
-      buf.position((height-1-i)*width*4);
-      buf.get(tmp2);
-
-      buf.position((         i)*width*4);
-      buf.put(tmp2);
-      buf.position((height-1-i)*width*4);
-      buf.put(tmp1);
-      }
-    }
-  }
diff --git a/src/main/java/org/distorted/library/EffectTypes.java b/src/main/java/org/distorted/library/EffectTypes.java
index 6e8f8ab..67563f4 100644
--- a/src/main/java/org/distorted/library/EffectTypes.java
+++ b/src/main/java/org/distorted/library/EffectTypes.java
@@ -39,12 +39,7 @@ public enum EffectTypes
   /**
    * Effects executed in the Fragment shader: changes of color, hue, transparency levels, etc.
    */
-  FRAGMENT ( 0x4 ),
-  /**
-   * Effects that did not belong to anywhere else - currently only saving the contents of underlying
-   * Surface to a PNG or a MP4 file.
-   */
-  OTHER    ( 0x8 );
+  FRAGMENT ( 0x4 );
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -69,7 +64,6 @@ public enum EffectTypes
 
     maxtable[1] = 5;  // Max 5 VERTEX Effects
     maxtable[2] = 5;  // Max 5 FRAGMENT Effects
-    maxtable[3] = 5;  // Max 5 OTHER Effects
     }
 ///////////////////////////////////////////////////////////////////////////////////////////////////
   }
