commit 0729bc412fe3c16be46ed87eeecc4423e61c5849
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Fri Jul 1 15:40:01 2016 +0100

    Add DistortedGridFactory to share Grids among same-shaped DistortedObjects.

diff --git a/src/main/java/org/distorted/library/Distorted.java b/src/main/java/org/distorted/library/Distorted.java
index 605dd48..ef9f5c1 100644
--- a/src/main/java/org/distorted/library/Distorted.java
+++ b/src/main/java/org/distorted/library/Distorted.java
@@ -387,6 +387,7 @@ public class Distorted
  */
   public static void onDestroy()
     {
+    DistortedGridFactory.release();
     DistortedObjectList.release();
     DistortedNode.release();
     EffectQueue.reset();
diff --git a/src/main/java/org/distorted/library/DistortedBitmap.java b/src/main/java/org/distorted/library/DistortedBitmap.java
index ca966f9..eddbf9e 100644
--- a/src/main/java/org/distorted/library/DistortedBitmap.java
+++ b/src/main/java/org/distorted/library/DistortedBitmap.java
@@ -81,7 +81,7 @@ public class DistortedBitmap extends DistortedObject
      mSizeX= width;
      mSizeY= height;
      mSizeZ= 1;
-     mGrid = new DistortedBitmapGrid(xsize,ysize);
+     mGrid = DistortedGridFactory.getGrid(xsize,ysize);
      initializeData();
      }
 
diff --git a/src/main/java/org/distorted/library/DistortedCubes.java b/src/main/java/org/distorted/library/DistortedCubes.java
index 23bb86a..c3565f0 100644
--- a/src/main/java/org/distorted/library/DistortedCubes.java
+++ b/src/main/java/org/distorted/library/DistortedCubes.java
@@ -96,7 +96,7 @@ public class DistortedCubes extends DistortedObject
    mSizeX= cubeSize*Cs;
    mSizeY= cubeSize*Rs;
    mSizeZ= frontOnly ? 1 : cubeSize;
-   mGrid = new DistortedCubesGrid(cols,desc, frontOnly);
+   mGrid = DistortedGridFactory.getGrid(cols,desc, frontOnly);
    initializeData();
    }
 
@@ -120,10 +120,10 @@ public class DistortedCubes extends DistortedObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-   protected DistortedObject deepCopy(int flags)
-     {
-     return new DistortedCubes(this,flags);
-     }
+ protected DistortedObject deepCopy(int flags)
+   {
+   return new DistortedCubes(this,flags);
+   }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////   
  }
diff --git a/src/main/java/org/distorted/library/DistortedCubesGrid.java b/src/main/java/org/distorted/library/DistortedCubesGrid.java
index 1e379f6..52f5a52 100644
--- a/src/main/java/org/distorted/library/DistortedCubesGrid.java
+++ b/src/main/java/org/distorted/library/DistortedCubesGrid.java
@@ -159,6 +159,7 @@ class DistortedCubesGrid extends DistortedObjectGrid
      }   
 */ 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
+// desc is guaranteed to be padded with 0s in the end (DistortedCubes constructor does it)
 
    private void buildGrid(int cols, String desc, boolean frontOnly)
      {
@@ -166,31 +167,19 @@ class DistortedCubesGrid extends DistortedObjectGrid
      mCols     =0;
      dataLength=0;
      
-     if( cols>0 )
+     if( cols>0 && desc.contains("1") )
        {
-       int reallen = desc.length();
-       int len = reallen;
+       mCols = cols;
+       mRows = desc.length()/cols;
 
-       if( (reallen/cols)*cols != reallen )
-         {
-         len = ((reallen/cols)+1)*cols; 
-         for(int i=reallen; i<len; i++) desc += "0";
-         }
-    
-       if( desc.contains("1") )
-         {
-         mCols = cols;
-         mRows = len/cols;
-
-         mCubes = new short[mRows][mCols];
+       mCubes = new short[mRows][mCols];
        
-         for(int j=0; j<mCols; j++) 
-           for(int i=0; i<mRows; i++)
-             mCubes[i][j] = (short)(desc.charAt(i*mCols+j) == '1' ? 1:0); 
+       for(int j=0; j<mCols; j++)
+         for(int i=0; i<mRows; i++)
+           mCubes[i][j] = (short)(desc.charAt(i*mCols+j) == '1' ? 1:0);
        
-         markRegions();
-         dataLength = computeDataLength(frontOnly);
-         }
+       markRegions();
+       dataLength = computeDataLength(frontOnly);
        }
      }
  
diff --git a/src/main/java/org/distorted/library/DistortedGridFactory.java b/src/main/java/org/distorted/library/DistortedGridFactory.java
new file mode 100644
index 0000000..bb73bc4
--- /dev/null
+++ b/src/main/java/org/distorted/library/DistortedGridFactory.java
@@ -0,0 +1,77 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// 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 java.util.HashMap;
+/**
+ * HashMap of all DistortedObjectGrids ever created. The point: we can share the Grids among
+ * DistortedObjects that are of the same shape.
+ */
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+final class DistortedGridFactory
+  {
+  private static HashMap<String,DistortedObjectGrid> mGrids = new HashMap<>();
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// DistortedCubesGrid
+
+  static synchronized DistortedObjectGrid getGrid(int cols, String desc, boolean frontOnly)
+    {
+    String d = desc+("_"+cols+"_"+(frontOnly?"1":"0"));
+
+    Object o = mGrids.get(d);
+
+    if( o!=null ) return (DistortedObjectGrid)o;
+
+    DistortedCubesGrid grid = new DistortedCubesGrid(cols,desc,frontOnly);
+
+    mGrids.put(d,grid);
+
+    return grid;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// DistortedBitmapGrid
+
+  static synchronized DistortedObjectGrid getGrid(int cols, int rows)
+    {
+    String d = cols+"+"+rows;
+
+    Object o = mGrids.get(d);
+
+    if( o!=null ) return (DistortedObjectGrid)o;
+
+    DistortedBitmapGrid grid = new DistortedBitmapGrid(cols,rows);
+
+    mGrids.put(d,grid);
+
+    return grid;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  static synchronized void release()
+    {
+    mGrids.clear();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+  }
