Ignore:
Timestamp:
2016-07-22T23:03:22+02:00 (8 years ago)
Author:
Don-vip
Message:

see #11390, fix #13120 - Use a new memory manager for imagery layers (patch by michael2402) - gsoc-core - requires java 8

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java

    r10576 r10588  
    9090import org.openstreetmap.josm.io.WMSLayerImporter;
    9191import org.openstreetmap.josm.tools.GBC;
     92import org.openstreetmap.josm.tools.MemoryManager;
     93import org.openstreetmap.josm.tools.MemoryManager.MemoryHandle;
     94import org.openstreetmap.josm.tools.MemoryManager.NotEnoughMemoryException;
    9295
    9396/**
     
    694697                throw new IllegalArgumentException(tr("Failed to create tile source"));
    695698            }
    696             checkLayerMemoryDoesNotExceedMaximum();
    697699            // check if projection is supported
    698700            projectionChanged(null, Main.getProjection());
     
    703705    @Override
    704706    protected LayerPainter createMapViewPainter(MapViewEvent event) {
    705         return new CompatibilityModeLayerPainter() {
    706             @Override
    707             public void detachFromMapView(MapViewEvent event) {
    708                 event.getMapView().removeMouseListener(adapter);
    709                 MapView.removeZoomChangeListener(AbstractTileSourceLayer.this);
    710                 super.detachFromMapView(event);
    711             }
    712         };
     707        return new TileSourcePainter();
    713708    }
    714709
     
    732727            add(new JMenuItem(new ShowTileInfoAction()));
    733728        }
    734     }
    735 
    736     @Override
    737     protected long estimateMemoryUsage() {
    738         return 4L * tileSource.getTileSize() * tileSource.getTileSize() * estimateTileCacheSize();
    739729    }
    740730
     
    19401930        adjustAction.destroy();
    19411931    }
     1932
     1933    private class TileSourcePainter extends CompatibilityModeLayerPainter {
     1934        /**
     1935         * The memory handle that will hold our tile source.
     1936         */
     1937        private MemoryHandle<?> memory;
     1938
     1939        @Override
     1940        public void paint(MapViewGraphics graphics) {
     1941            allocateCacheMemory();
     1942            if (memory != null) {
     1943                super.paint(graphics);
     1944            }
     1945        }
     1946
     1947        private void allocateCacheMemory() {
     1948            if (memory == null) {
     1949                MemoryManager manager = MemoryManager.getInstance();
     1950                if (manager.isAvailable(getEstimatedCacheSize())) {
     1951                    try {
     1952                        memory = manager.allocateMemory("tile source layer", getEstimatedCacheSize(), () -> new Object());
     1953                    } catch (NotEnoughMemoryException e) {
     1954                        Main.warn("Could not allocate tile source memory", e);
     1955                    }
     1956                }
     1957            }
     1958        }
     1959
     1960        protected long getEstimatedCacheSize() {
     1961            return 4L * tileSource.getTileSize() * tileSource.getTileSize() * estimateTileCacheSize();
     1962        }
     1963
     1964        @Override
     1965        public void detachFromMapView(MapViewEvent event) {
     1966            event.getMapView().removeMouseListener(adapter);
     1967            MapView.removeZoomChangeListener(AbstractTileSourceLayer.this);
     1968            super.detachFromMapView(event);
     1969            if (memory != null) {
     1970                memory.free();
     1971            }
     1972        }
     1973    }
    19421974}
Note: See TracChangeset for help on using the changeset viewer.