Ticket #13175: patch-mapview-trace-invalidation.patch

File patch-mapview-trace-invalidation.patch, 9.4 KB (added by michael2402, 8 years ago)
  • src/org/openstreetmap/josm/data/osm/DataSet.java

    diff --git a/src/org/openstreetmap/josm/data/osm/DataSet.java b/src/org/openstreetmap/josm/data/osm/DataSet.java
    index fe3febc..173c0d2 100644
    a b public final class DataSet implements Data, Cloneable, ProjectionChangeListener  
    751751            return;
    752752
    753753        highlightedVirtualNodes = waySegments;
    754         // can't use fireHighlightingChanged because it requires an OsmPrimitive
    755         highlightUpdateCount++;
     754        fireHighlightingChanged();
    756755    }
    757756
    758757    /**
    public final class DataSet implements Data, Cloneable, ProjectionChangeListener  
    764763            return;
    765764
    766765        highlightedWaySegments = waySegments;
    767         // can't use fireHighlightingChanged because it requires an OsmPrimitive
    768         highlightUpdateCount++;
     766        fireHighlightingChanged();
    769767    }
    770768
    771769    /**
  • src/org/openstreetmap/josm/gui/MapView.java

    diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
    index da3079e..a6008b4 100644
    a b import java.util.Arrays;  
    2626import java.util.Collection;
    2727import java.util.Collections;
    2828import java.util.HashMap;
     29import java.util.IdentityHashMap;
    2930import java.util.LinkedHashSet;
    3031import java.util.List;
    3132import java.util.Set;
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    147148     */
    148149    private class LayerInvalidatedListener implements PaintableInvalidationListener {
    149150        private boolean ignoreRepaint;
     151
     152        private final Set<MapViewPaintable> invalidatedLayers = Collections.newSetFromMap(new IdentityHashMap<MapViewPaintable, Boolean>());
     153
    150154        @Override
    151155        public void paintablInvalidated(PaintableInvalidationEvent event) {
     156            invalidate(event.getLayer());
     157        }
     158
     159        public synchronized void invalidate(MapViewPaintable mapViewPaintable) {
    152160            ignoreRepaint = true;
     161            invalidatedLayers.add(mapViewPaintable);
    153162            repaint();
    154163        }
    155164
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    157166         * Temporary until all {@link MapViewPaintable}s support this.
    158167         * @param p The paintable.
    159168         */
    160         public void addTo(MapViewPaintable p) {
     169        public synchronized void addTo(MapViewPaintable p) {
    161170            if (p instanceof AbstractMapViewPaintable) {
    162171                ((AbstractMapViewPaintable) p).addInvalidationListener(this);
    163172            }
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    167176         * Temporary until all {@link MapViewPaintable}s support this.
    168177         * @param p The paintable.
    169178         */
    170         public void removeFrom(MapViewPaintable p) {
     179        public synchronized void removeFrom(MapViewPaintable p) {
    171180            if (p instanceof AbstractMapViewPaintable) {
    172181                ((AbstractMapViewPaintable) p).removeInvalidationListener(this);
    173182            }
     183            invalidatedLayers.remove(p);
    174184        }
    175185
    176186        /**
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    183193            }
    184194            ignoreRepaint = false;
    185195        }
     196
     197        /**
     198         * Retrives a set of all layers that have been marked as invalid since the last call to this method.
     199         * @return The layers
     200         */
     201        protected synchronized Set<MapViewPaintable> collectInvalidatedLayers() {
     202            Set<MapViewPaintable> layers = Collections.newSetFromMap(new IdentityHashMap<MapViewPaintable, Boolean>());
     203            layers.addAll(invalidatedLayers);
     204            invalidatedLayers.clear();
     205            return layers;
     206        }
    186207    }
    187208
    188209    /**
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    509530    private transient BufferedImage offscreenBuffer;
    510531    // Layers that wasn't changed since last paint
    511532    private final transient List<Layer> nonChangedLayers = new ArrayList<>();
    512     private transient Layer changedLayer;
    513533    private int lastViewID;
    514534    private boolean paintPreferencesChanged = true;
    515535    private Rectangle lastClipBounds = new Rectangle();
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    525545     */
    526546    private final HashMap<Layer, LayerPainter> registeredLayers = new HashMap<>();
    527547
     548
     549
    528550    /**
    529551     * Constructs a new {@code MapView}.
    530552     * @param layerManager The layers to display.
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    846868        List<Layer> visibleLayers = layerManager.getVisibleLayersInZOrder();
    847869
    848870        int nonChangedLayersCount = 0;
     871        Set<MapViewPaintable> invalidated = invalidatedListener.collectInvalidatedLayers();
    849872        for (Layer l: visibleLayers) {
    850             if (l.isChanged() || l == changedLayer) {
     873            if (l.isChanged() || invalidated.contains(l)) {
    851874                break;
    852875            } else {
    853876                nonChangedLayersCount++;
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    904927        }
    905928
    906929        nonChangedLayers.clear();
    907         changedLayer = null;
    908930        for (int i = 0; i < nonChangedLayersCount; i++) {
    909931            nonChangedLayers.add(visibleLayers.get(i));
    910932        }
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    12261248                evt.getPropertyName().equals(Layer.FILTER_STATE_PROP)) {
    12271249            Layer l = (Layer) evt.getSource();
    12281250            if (l.isVisible()) {
    1229                 changedLayer = l;
    1230                 repaint();
     1251                invalidatedListener.invalidate(l);
    12311252            }
    12321253        }
    12331254    }
  • src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
    index a3a5a10..de7bb15 100644
    a b implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    128128     * Initial zoom lvl is set to bestZoom
    129129     */
    130130    public int currentZoomLevel;
    131     private boolean needRedraw;
    132131
    133132    private final AttributionSupport attribution = new AttributionSupport();
    134133    private final TileHolder clickedTileHolder = new TileHolder();
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    252251            tile.setImage(null);
    253252        }
    254253        tile.setLoaded(success);
    255         needRedraw = true;
    256         if (Main.map != null) {
    257             Main.map.repaint(100);
    258         }
     254        // TODO: Delay 100 ms
     255        invalidate();
    259256        if (Main.isDebugEnabled()) {
    260257            Main.debug("tileLoadingFinished() tile: " + tile + " success: " + success);
    261258        }
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    284281     * @see MapFrame#repaint()
    285282     */
    286283    protected void redraw() {
    287         needRedraw = true;
    288         if (isVisible()) Main.map.repaint();
     284        invalidate();
    289285    }
    290286
    291287    @Override
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    842838        if (tileLoader instanceof TMSCachedTileLoader) {
    843839            ((TMSCachedTileLoader) tileLoader).cancelOutstandingTasks();
    844840        }
    845         needRedraw = true;
     841        invalidate();
    846842    }
    847843
    848844    protected int getMaxZoomLvl() {
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    10161012    @Override
    10171013    public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
    10181014        boolean done = (infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0;
    1019         needRedraw = true;
    10201015        if (Main.isDebugEnabled()) {
    10211016            Main.debug("imageUpdate() done: " + done + " calling repaint");
    10221017        }
    1023         Main.map.repaint(done ? 0 : 100);
     1018        // TODO: Trigger delayed invalidation if !done.
     1019        invalidate();
    10241020        return !done;
    10251021    }
    10261022
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    15371533            return;
    15381534        }
    15391535
    1540         needRedraw = false;
    1541 
    15421536        int zoom = currentZoomLevel;
    15431537        if (getDisplaySettings().isAutoZoom()) {
    15441538            zoom = getBestZoom();
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    17861780
    17871781    @Override
    17881782    public boolean isChanged() {
    1789         return needRedraw;
     1783        // we use #invalidate()
     1784        return false;
    17901785    }
    17911786
    17921787    /**
  • src/org/openstreetmap/josm/gui/layer/Layer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/Layer.java b/src/org/openstreetmap/josm/gui/layer/Layer.java
    index b4f5797..116c175 100644
    a b public abstract class Layer extends AbstractMapViewPaintable implements Destroya  
    447447     * Check changed status of layer
    448448     *
    449449     * @return True if layer was changed since last paint
     450     * @deprecated This is not supported by multiple map views.
     451     * Fire an {@link #invalidate()} to trigger a repaint.
     452     * Let this method return false if you only use invalidation events.
    450453     */
     454    @Deprecated
    451455    public boolean isChanged() {
    452456        return true;
    453457    }