commit 5055b5d40322440d7cda49ced5e9580d0bd9ad3a
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Fri Dec 9 01:10:27 2016 +0000

    1. (hopefully) finish the 'Save' app (now we can adjust the size of the resulting file)
    2. Fix one long-standing bug in almost every single app.

diff --git a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
index 0db15ac..21d9333 100644
--- a/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
+++ b/src/main/java/org/distorted/examples/aroundtheworld/AroundTheWorldRenderer.java
@@ -78,7 +78,7 @@ class AroundTheWorldRenderer implements GLSurfaceView.Renderer
       {
       mObject.abortEffects(EffectTypes.MATRIX);
 
-      if( mObjHeight/mObjWidth > height/width )
+      if( (float)mObjHeight/mObjWidth > (float)height/width )
         {
         int w = (height*mObjWidth)/mObjHeight;
         float factor = (float)height/mObjHeight;
diff --git a/src/main/java/org/distorted/examples/bean/BeanRenderer.java b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
index 585b300..c2290c9 100644
--- a/src/main/java/org/distorted/examples/bean/BeanRenderer.java
+++ b/src/main/java/org/distorted/examples/bean/BeanRenderer.java
@@ -97,7 +97,7 @@ class BeanRenderer implements GLSurfaceView.Renderer
       { 
       mBean.abortEffects(EffectTypes.MATRIX);
          
-      if( bmpHeight/bmpWidth > height/width )
+      if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/check/CheckRenderer.java b/src/main/java/org/distorted/examples/check/CheckRenderer.java
index 399d7ce..cc58b3d 100644
--- a/src/main/java/org/distorted/examples/check/CheckRenderer.java
+++ b/src/main/java/org/distorted/examples/check/CheckRenderer.java
@@ -84,7 +84,7 @@ class CheckRenderer implements GLSurfaceView.Renderer
       { 
       mSuccess.abortEffects(EffectTypes.MATRIX);
       
-      if( bmpHeight/bmpWidth > height/width )
+      if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
index fb069b4..dd0280b 100644
--- a/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
+++ b/src/main/java/org/distorted/examples/differentbitmaps/DifferentBitmapsRenderer.java
@@ -109,7 +109,7 @@ class DifferentBitmapsRenderer implements GLSurfaceView.Renderer
         bmp[i].abortEffects(EffectTypes.MATRIX);
         }
       
-      if( bmpHeight/(NUM*bmpWidth) > height/width )
+      if( (float)bmpHeight/(NUM*bmpWidth) > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
index 16566a9..173c773 100644
--- a/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
+++ b/src/main/java/org/distorted/examples/differenteffects/DifferentEffectsRenderer.java
@@ -77,105 +77,105 @@ class DifferentEffectsRenderer implements GLSurfaceView.Renderer
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
    
-    public void onDrawFrame(GL10 glUnused) 
-      {
-      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+   public void onDrawFrame(GL10 glUnused)
+     {
+     GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
       
-      long time = System.currentTimeMillis();
+     long time = System.currentTimeMillis();
    
-      for(int i=NUM-1; i>=0; i--) bmp[i].draw(time);
-      }
+     for(int i=NUM-1; i>=0; i--) bmp[i].draw(time);
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
-      { 
-      for(int i=NUM-1; i>=0; i--) 
-        {   
-        bmp[i].abortEffects(EffectTypes.MATRIX);
-        }
+   public void onSurfaceChanged(GL10 glUnused, int width, int height)
+     {
+     for(int i=NUM-1; i>=0; i--)
+       {
+       bmp[i].abortEffects(EffectTypes.MATRIX);
+       }
       
-      if( bmpHeight/(NUM*bmpWidth) > height/width )
-        {
-        int w = (height*bmpWidth)/bmpHeight;
-        float factor = (float)height/bmpHeight;
-
-        for(int i=NUM-1; i>=0; i--) 
-          {
-          bmp[i].move( new Static3D((width-NUM*w)/2 +i*w , 0, 0) );
-          bmp[i].scale(factor);
-          }
-        }
-      else
-        {
-        int w = width/NUM;  
-        int h = (width*bmpHeight)/(bmpWidth*NUM);
-        float factor = (float)width/(bmpWidth*NUM);
-
-        for(int i=NUM-1; i>=0; i--) 
-          {
-          bmp[i].move( new Static3D(i*w, (height-h)/2, 0) );
-          bmp[i].scale(factor);
-          }
-        }
+     if( (float)bmpHeight/(NUM*bmpWidth) > (float)height/width )
+       {
+       int w = (height*bmpWidth)/bmpHeight;
+       float factor = (float)height/bmpHeight;
+
+       for(int i=NUM-1; i>=0; i--)
+         {
+         bmp[i].move( new Static3D((width-NUM*w)/2 +i*w , 0, 0) );
+         bmp[i].scale(factor);
+         }
+       }
+     else
+       {
+       int w = width/NUM;
+       int h = (width*bmpHeight)/(bmpWidth*NUM);
+       float factor = (float)width/(bmpWidth*NUM);
+
+       for(int i=NUM-1; i>=0; i--)
+         {
+         bmp[i].move( new Static3D(i*w, (height-h)/2, 0) );
+         bmp[i].scale(factor);
+         }
+       }
        
-      Distorted.onSurfaceChanged(width, height); 
-      }
+     Distorted.onSurfaceChanged(width, height);
+     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
-    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
-      {
-      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+   public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
+     {
+     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 
-      InputStream is = mView.getContext().getResources().openRawResource(R.raw.dog);
-      Bitmap bitmap;
+     InputStream is = mView.getContext().getResources().openRawResource(R.raw.dog);
+     Bitmap bitmap;
         
-      try 
-        {
-        bitmap = BitmapFactory.decodeStream(is);
-        } 
-      finally 
-        {
-        try 
-          {
-          is.close();
-          } 
-        catch(IOException e) { }
-        }  
+     try
+       {
+       bitmap = BitmapFactory.decodeStream(is);
+       }
+     finally
+       {
+       try
+         {
+         is.close();
+         }
+       catch(IOException e) { }
+       }
       
-      bmpHeight = bitmap.getHeight();
-      bmpWidth  = bitmap.getWidth();
+     bmpHeight = bitmap.getHeight();
+     bmpWidth  = bitmap.getWidth();
       
-      bmp = new DistortedBitmap[NUM];
-      bmp[0] = new DistortedBitmap(bmpWidth, bmpHeight, 30);
+     bmp = new DistortedBitmap[NUM];
+     bmp[0] = new DistortedBitmap(bmpWidth, bmpHeight, 30);
       
-      for(int i=1; i<NUM; i++) bmp[i] = new DistortedBitmap(bmp[0], Distorted.CLONE_BITMAP);
+     for(int i=1; i<NUM; i++) bmp[i] = new DistortedBitmap(bmp[0], Distorted.CLONE_BITMAP);
       
-      // setting the bitmap once is enough; others are cloned!
-      bmp[0].setBitmap(bitmap);
+     // setting the bitmap once is enough; others are cloned!
+     bmp[0].setBitmap(bitmap);
 
-      Dynamic1D sink = new Dynamic1D(2000,0.0f);
-      sink.add(new Static1D( 1));
-      sink.add(new Static1D(10));
+     Dynamic1D sink = new Dynamic1D(2000,0.0f);
+     sink.add(new Static1D( 1));
+     sink.add(new Static1D(10));
 
-      bmp[0].sink(sink, pLeft, RegionEye);
-      bmp[0].sink(sink, pRight,RegionEye);
-      bmp[1].distort(mDI, pNose1);
+     bmp[0].sink(sink, pLeft, RegionEye);
+     bmp[0].sink(sink, pRight,RegionEye);
+     bmp[1].distort(mDI, pNose1);
 
-      Dynamic1D chromaDyn = new Dynamic1D(3000,0.0f);
-      chromaDyn.add(new Static1D(0));
-      chromaDyn.add(new Static1D(1));
+     Dynamic1D chromaDyn = new Dynamic1D(3000,0.0f);
+     chromaDyn.add(new Static1D(0));
+     chromaDyn.add(new Static1D(1));
 
-      bmp[2].chroma(chromaDyn, new Static3D(0,1,0) );
+     bmp[2].chroma(chromaDyn, new Static3D(0,1,0) );
       
-      try
-        {
-        Distorted.onSurfaceCreated(mView.getContext());
-        }
-      catch(Exception ex)
-        {
-        android.util.Log.e("DifferentEffects", ex.getMessage() );
-        }
-      }
+     try
+       {
+       Distorted.onSurfaceCreated(mView.getContext());
+       }
+     catch(Exception ex)
+       {
+       android.util.Log.e("DifferentEffects", ex.getMessage() );
+       }
+     }
 }
diff --git a/src/main/java/org/distorted/examples/fbo/FBORenderer.java b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
index e05683d..69da9b4 100644
--- a/src/main/java/org/distorted/examples/fbo/FBORenderer.java
+++ b/src/main/java/org/distorted/examples/fbo/FBORenderer.java
@@ -72,7 +72,7 @@ class FBORenderer implements GLSurfaceView.Renderer
       { 
       mLisa.abortEffects(EffectTypes.MATRIX);
          
-      if( lisaHeight/lisaWidth > height/width )
+      if( (float)lisaHeight/lisaWidth > (float)height/width )
         {
         int w = (height*lisaWidth)/lisaHeight;
         float factor = (float)height/lisaHeight;
diff --git a/src/main/java/org/distorted/examples/girl/GirlRenderer.java b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
index cab8f8f..aeceedb 100644
--- a/src/main/java/org/distorted/examples/girl/GirlRenderer.java
+++ b/src/main/java/org/distorted/examples/girl/GirlRenderer.java
@@ -161,7 +161,7 @@ class GirlRenderer implements GLSurfaceView.Renderer
       { 
       mGirl.abortEffects(EffectTypes.MATRIX);
       
-      if( bmpHeight/bmpWidth > height/width )
+      if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
index dac4a8e..bfa010a 100644
--- a/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
+++ b/src/main/java/org/distorted/examples/listener/ListenerRenderer.java
@@ -106,7 +106,7 @@ class ListenerRenderer implements GLSurfaceView.Renderer,EffectListener
       { 
       water.abortEffects(EffectTypes.MATRIX);
          
-      if( bmpHeight/bmpWidth > height/width )
+      if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
index a94a610..b8e9b3b 100644
--- a/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
+++ b/src/main/java/org/distorted/examples/monalisa/MonaLisaRenderer.java
@@ -84,7 +84,7 @@ class MonaLisaRenderer implements GLSurfaceView.Renderer
       { 
       monaLisa.abortEffects(EffectTypes.MATRIX);
 
-      if( bmpHeight/bmpWidth > height/width )
+      if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
index 7d475d4..c59c70f 100644
--- a/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
+++ b/src/main/java/org/distorted/examples/olimpic/OlimpicRenderer.java
@@ -122,7 +122,7 @@ class OlimpicRenderer implements GLSurfaceView.Renderer
      
       bmp.abortEffects(EffectTypes.MATRIX);
       
-      if( bmpHeight/bmpWidth > height/width )
+      if( (float)bmpHeight/bmpWidth > (float)height/width )
         {
         int w = (height*bmpWidth)/bmpHeight;
         float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
index eb2db6b..aa0a1a3 100644
--- a/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
+++ b/src/main/java/org/distorted/examples/plainmonalisa/RenderThread.java
@@ -214,7 +214,7 @@ public class RenderThread extends Thread
 
     monaLisa.abortEffects(EffectTypes.MATRIX);
 
-    if( bmpHeight/bmpWidth > height/width )
+    if( (float)bmpHeight/bmpWidth > (float)height/width )
       {
       int w = (height*bmpWidth)/bmpHeight;
       float factor = (float)height/bmpHeight;
diff --git a/src/main/java/org/distorted/examples/save/SaveActivity.java b/src/main/java/org/distorted/examples/save/SaveActivity.java
index c1cc12c..f4d4c01 100644
--- a/src/main/java/org/distorted/examples/save/SaveActivity.java
+++ b/src/main/java/org/distorted/examples/save/SaveActivity.java
@@ -65,9 +65,13 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
      
     setContentView(R.layout.savelayout);
 
-    SeekBar barSize  = (SeekBar)findViewById(R.id.saveSeekBar);
+    SeekBar barSize  = (SeekBar)findViewById(R.id.saveSeekBarSize);
     barSize.setOnSeekBarChangeListener(this);
     barSize.setProgress(50);
+
+    SeekBar barScale = (SeekBar)findViewById(R.id.saveSeekBarScale);
+    barScale.setOnSeekBarChangeListener(this);
+    barScale.setProgress(100);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -117,9 +121,15 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
 
   public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
     {
-    float s = (progress>50 ? ((progress-50)/16.0f + 1.0f):(0.015f*progress + 0.25f));
     SaveSurfaceView view = (SaveSurfaceView) this.findViewById(R.id.saveSurfaceView);
-    view.getRenderer().setSize(s);
+
+    switch (bar.getId())
+      {
+      case R.id.saveSeekBarSize : view.getRenderer().setSize(progress>50 ? ((progress-50)/16.0f + 1.0f):(0.015f*progress + 0.25f));
+                                  break;
+      case R.id.saveSeekBarScale: view.getRenderer().setScale(0.009f*progress+0.1f);
+                                  break;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index 4a62941..04bba08 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -35,6 +35,7 @@ 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.Dynamic3D;
 import org.distorted.library.type.Static1D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
@@ -56,8 +57,10 @@ class SaveRenderer implements GLSurfaceView.Renderer
   private Static4D sinkRegion;
   private Dynamic1D diSink;
   private Static1D s0;
+  private Dynamic3D mScaleDyn;
+  private Static3D mScaleFactor;
 
-  private int fboHeight, fboWidth;
+  private float mScale;
   private int bmpHeight, bmpWidth;
   private int scrHeight, scrWidth;
   private float boobsSink;
@@ -79,11 +82,13 @@ class SaveRenderer implements GLSurfaceView.Renderer
       
     s0 = new Static1D(boobsSink);
       
-    diSink = new Dynamic1D(0,0.5f);
+    diSink = new Dynamic1D();
     diSink.add(s0);
 
-    fboHeight = 150;
-    fboWidth  = 100;
+    mScale = 1.0f;
+    mScaleDyn = new Dynamic3D();
+    mScaleFactor = new Static3D(mScale,mScale,1.0f);
+    mScaleDyn.add(mScaleFactor);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -94,6 +99,21 @@ class SaveRenderer implements GLSurfaceView.Renderer
     s0.set(boobsSink);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  void setScale(float s)
+    {
+    mScale = s;
+    mScaleFactor.set(s,s,1.0f);
+
+    // when we move our scroll bar, this does NOT keep allocating and deallocating
+    // the whole WxH texture - the allocation happens only once, on next render, i.e. -
+    // when one presses the 'SAVE' button.
+
+    if( mOffscreen!=null )
+      mOffscreen.resize( (int)(mScale*bmpWidth),(int)(mScale*bmpHeight));
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   void Save()
@@ -125,35 +145,34 @@ class SaveRenderer implements GLSurfaceView.Renderer
 
     if( isSaving )  // render to an offscreen buffer and read pixels
       {
-      long scaleID = mGirl.scale(new Static3D( (float)fboWidth/scrWidth, (float)fboHeight/scrHeight, 1.0f));
+      mGirl.abortEffects(EffectTypes.MATRIX);
+      mGirl.scale(mScaleFactor);
       mGirl.draw(System.currentTimeMillis(), mOffscreen);
-      mGirl.abortEffect(scaleID);
+      applyMatrixEffects(scrWidth,scrHeight);
 
-      ByteBuffer buf = ByteBuffer.allocateDirect( fboWidth*fboHeight*4 );
+      int fW =(int)(mScale*bmpWidth);
+      int fH =(int)(mScale*bmpHeight);
+      ByteBuffer buf = ByteBuffer.allocateDirect(fW*fH*4);
       buf.order(ByteOrder.LITTLE_ENDIAN);
       mOffscreen.setAsInput();
 
-      GLES20.glReadPixels( 0, 0, fboWidth, fboHeight , GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
-      SaveWorkerThread.newBuffer(buf,fboWidth,fboHeight,mPath);
+      GLES20.glReadPixels( 0, 0, fW, fH, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+      SaveWorkerThread.newBuffer(buf,fW,fH,mPath);
 
       isSaving = false;
       }
-    else
-      {
-      mGirl.draw(System.currentTimeMillis());
-      }
+
+    mGirl.draw(System.currentTimeMillis());
     }
 
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-    
-  public void onSurfaceChanged(GL10 glUnused, int width, int height)
-    {
-    scrWidth = width;
-    scrHeight= height;
 
+  private void applyMatrixEffects(int width, int height)
+    {
     mGirl.abortEffects(EffectTypes.MATRIX);
-      
-    if( bmpHeight/bmpWidth > height/width )
+
+    if( (float)bmpHeight/bmpWidth > (float)height/width )
       {
       int w = (height*bmpWidth)/bmpHeight;
       float factor = (float)height/bmpHeight;
@@ -169,7 +188,17 @@ class SaveRenderer implements GLSurfaceView.Renderer
       mGirl.move( new Static3D(0,(height-h)/2,0) );
       mGirl.scale(factor);
       }
-      
+
+    mGirl.scale(mScaleDyn);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void onSurfaceChanged(GL10 glUnused, int width, int height)
+    {
+    scrWidth = width;
+    scrHeight= height;
+    applyMatrixEffects(width, height);
     Distorted.onSurfaceChanged(width, height);
     }
 
@@ -203,7 +232,7 @@ class SaveRenderer implements GLSurfaceView.Renderer
     mGirl.sink( diSink, pLeft , sinkRegion);
     mGirl.sink( diSink, pRight, sinkRegion);
 
-    mOffscreen = new DistortedFramebuffer(fboWidth,fboHeight);
+    mOffscreen = new DistortedFramebuffer(bmpWidth,bmpHeight);
 
     try
       {
diff --git a/src/main/java/org/distorted/examples/sink/SinkRenderer.java b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
index d4bbc11..7274052 100644
--- a/src/main/java/org/distorted/examples/sink/SinkRenderer.java
+++ b/src/main/java/org/distorted/examples/sink/SinkRenderer.java
@@ -76,7 +76,7 @@ class SinkRenderer implements GLSurfaceView.Renderer
     { 
     sinkBmp.abortEffects(EffectTypes.MATRIX);
          
-    if( bmpHeight/bmpWidth > height/width )
+    if( (float)bmpHeight/bmpWidth > (float)height/width )
       {
       int w = (height*bmpWidth)/bmpHeight;
       float factor = (float)height/bmpHeight;
diff --git a/src/main/res/layout/savelayout.xml b/src/main/res/layout/savelayout.xml
index b1c3a59..e4c2d89 100644
--- a/src/main/res/layout/savelayout.xml
+++ b/src/main/res/layout/savelayout.xml
@@ -8,31 +8,42 @@
         android:id="@+id/saveSurfaceView"
         android:layout_width="fill_parent"
         android:layout_height="0dp"
-        android:layout_weight="0.85" />
+        android:layout_weight="0.9"/>
 
     <LinearLayout
         android:orientation="horizontal"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:gravity="bottom"
-        android:layout_weight="0.03">
+        android:gravity="bottom">
 
         <Button
             android:id="@+id/saveButton"
-            android:layout_width="132dp"
-            android:layout_height="wrap_content"
+            android:layout_width="100dp"
+            android:layout_height="fill_parent"
             android:gravity="center_vertical|center"
             android:text="@string/save"
             android:onClick="Save"
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:layout_gravity="center_vertical"/>
 
-        <SeekBar
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:id="@+id/saveSeekBar"
-            android:layout_gravity="center_vertical"
-            android:layout_margin="5dp"/>
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <SeekBar
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:id="@+id/saveSeekBarSize"
+                android:layout_gravity="center_vertical"
+                android:layout_margin="5dp"/>
+            <SeekBar
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:id="@+id/saveSeekBarScale"
+                android:layout_gravity="center_vertical"
+                android:layout_margin="5dp"/>
+        </LinearLayout>
 
     </LinearLayout>
 
