altosuilib: Make map-cache per-window instead of global
authorKeith Packard <keithp@keithp.com>
Sat, 14 Jun 2014 04:26:33 +0000 (21:26 -0700)
committerKeith Packard <keithp@keithp.com>
Sat, 14 Jun 2014 04:26:33 +0000 (21:26 -0700)
This consumes more memory, but avoids cache conflicts between windows

Signed-off-by: Keith Packard <keithp@keithp.com>
altosuilib/AltosUIMapCache.java
altosuilib/AltosUIMapPreload.java
altosuilib/AltosUIMapTile.java
altosuilib/AltosUIMapTileListener.java
altosuilib/AltosUIMapView.java

index e849da79893f757713e48f658333f01caa2dc719..55311d8c8ad5ecf29051c0af530ab65ef3a9586e 100644 (file)
@@ -31,18 +31,19 @@ public class AltosUIMapCache {
        static final int        bad_request = 3;
        static final int        forbidden = 4;
 
-       static private Object fetch_lock = new Object();
+       static final int        min_cache_size = 9;
+       static final int        max_cache_size = 24;
 
-       static final int                min_cache_size = 9;
-       static final int                max_cache_size = 24;
+       private Object          fetch_lock = new Object();
+       private Object          cache_lock = new Object();
 
-       static int                      cache_size = min_cache_size;
+       int                     cache_size = min_cache_size;
 
-       static AltosUIMapImage[]        images = new AltosUIMapImage[cache_size];
+       AltosUIMapImage[]       images = new AltosUIMapImage[cache_size];
 
-       static Object cache_lock = new Object();
+       long                    used;
 
-       public  static void set_cache_size(int new_size) {
+       public void set_cache_size(int new_size) {
                if (new_size < min_cache_size)
                        new_size = min_cache_size;
                if (new_size > max_cache_size)
@@ -64,9 +65,7 @@ public class AltosUIMapCache {
                }
        }
 
-       static long                     used;
-
-       public static Image get(AltosUIMapTile tile, AltosUIMapStore store, int width, int height) {
+       public Image get(AltosUIMapTile tile, AltosUIMapStore store, int width, int height) {
                int             oldest = -1;
                long            age = used;
 
@@ -109,4 +108,7 @@ public class AltosUIMapCache {
                        }
                }
        }
+
+       public AltosUIMapCache() {
+       }
 }
index d702dddfee70f59029a6a3356e019544d7444229..3bdba39e723a6b0aebc63295b34568aa56152f67 100644 (file)
@@ -209,6 +209,7 @@ class AltosUISites extends Thread {
 public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, ItemListener, AltosUIMapTileListener {
        AltosUIFrame    owner;
        AltosUIMap      map;
+       AltosUIMapCache cache = new AltosUIMapCache();
 
        AltosUIMapPos   lat;
        AltosUIMapPos   lon;
@@ -353,6 +354,8 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I
                }
        }
 
+       public AltosUIMapCache cache() { return cache; }
+
        public void set_sites() {
                int     i = 1;
                for (AltosUISite site : sites.sites) {
index 6fbcdb4b69c9e77ebf1c8163f8be6a3ad98d5df8..7c82318302370320d36a0f1d5203ffd8d5ed6731 100644 (file)
@@ -34,6 +34,7 @@ public class AltosUIMapTile {
        int             zoom;
        int             maptype;
        AltosUIMapStore store;
+       AltosUIMapCache cache;
        int             status;
 
        private File map_file() {
@@ -153,7 +154,7 @@ public class AltosUIMapTile {
                ++painting_serial;
 
                if (image == null && t.has_location())
-                       image = AltosUIMapCache.get(this, store, px_size, px_size);
+                       image = cache.get(this, store, px_size, px_size);
 
                paint_graphics(g2d, t, painting_serial);
        }
@@ -173,6 +174,7 @@ public class AltosUIMapTile {
        public AltosUIMapTile(AltosUIMapTileListener listener, AltosUILatLon upper_left, AltosUILatLon center, int zoom, int maptype, int px_size, Font font) {
                this.listener = listener;
                this.upper_left = upper_left;
+               cache = listener.cache();
 
                while (center.lon < -180.0)
                        center.lon += 360.0;
index 4cc3ff2f18f8b9e5b69d5b0219400a5a469938fe..4ca135392c1864cb5aec2ec7b463f56fae9c3855 100644 (file)
@@ -19,4 +19,6 @@ package org.altusmetrum.altosuilib_2;
 
 public interface AltosUIMapTileListener {
        abstract public void notify_tile(AltosUIMapTile tile, int status);
+
+       abstract public AltosUIMapCache cache();
 }
index efae376786f5652951fd600623fbdd3510bfe94a..4df178e2e57e6ba676d0f619a30aedc0d6e2b0ce 100644 (file)
@@ -34,6 +34,8 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
 
        AltosUIMapLine  line = new AltosUIMapLine();
 
+       AltosUIMapCache cache = new AltosUIMapCache();
+
        LinkedList<AltosUIMapMark> marks = new LinkedList<AltosUIMapMark>();
 
        LinkedList<AltosUIMapZoomListener> zoom_listeners = new LinkedList<AltosUIMapZoomListener>();
@@ -368,7 +370,7 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
                for (Point point : to_remove)
                        tiles.remove(point);
 
-               AltosUIMapCache.set_cache_size(((lower_right.y - upper_left.y) / px_size + 1) * ((lower_right.x - upper_left.x) / px_size + 1));
+               cache.set_cache_size(((lower_right.y - upper_left.y) / px_size + 1) * ((lower_right.x - upper_left.x) / px_size + 1));
                for (int y = upper_left.y; y <= lower_right.y; y += px_size) {
                        for (int x = upper_left.x; x <= lower_right.x; x += px_size) {
                                Point point = new Point(x, y);
@@ -394,6 +396,8 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
                }
        }
 
+       public AltosUIMapCache cache() { return cache; }
+
        /* AltosUIMapStoreListener methods */
        public void notify_store(AltosUIMapStore store, int status) {
                if (load_listener != null) {