Ignore:
Timestamp:
2010-03-11T21:01:49+01:00 (15 years ago)
Author:
jttt
Message:

Reuse offscreenBuffer if layers didn't change

File:
1 edited

Legend:

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

    r3078 r3116  
    159159     * A list of all layers currently loaded.
    160160     */
    161     private ArrayList<Layer> layers = new ArrayList<Layer>();
     161    private final List<Layer> layers = new ArrayList<Layer>();
    162162    /**
    163163     * The play head marker: there is only one of these so it isn't in any specific layer
     
    180180
    181181    private BufferedImage offscreenBuffer;
     182    // Layers that wasn't changed since last paint
     183    private final List<Layer> nonChangedLayers = new ArrayList<Layer>();
    182184
    183185    public MapView() {
     
    458460            return; // no data loaded yet.
    459461
    460         // re-create offscreen-buffer if we've been resized, otherwise
    461         // just re-use it.
    462         if (null == offscreenBuffer || offscreenBuffer.getWidth() != getWidth()
    463                 || offscreenBuffer.getHeight() != getHeight()) {
    464             offscreenBuffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR);
    465         }
    466 
    467         Graphics2D tempG = offscreenBuffer.createGraphics();
    468         tempG.setClip(g.getClip());
    469         tempG.setColor(PaintColors.BACKGROUND.get());
    470         tempG.fillRect(0, 0, getWidth(), getHeight());
    471 
     462        List<Layer> visibleLayers = getVisibleLayersInZOrder();
     463
     464        int nonChangedLayersCount = 0;
     465        for (Layer l: visibleLayers) {
     466            if (l.isChanged()) {
     467                break;
     468            } else {
     469                nonChangedLayersCount++;
     470            }
     471        }
     472
     473        boolean canUseBuffer = nonChangedLayers.size() <= nonChangedLayersCount;
     474        if (canUseBuffer) {
     475            for (int i=0; i<nonChangedLayers.size(); i++) {
     476                if (visibleLayers.get(i) != nonChangedLayers.get(i)) {
     477                    canUseBuffer = false;
     478                    break;
     479                }
     480            }
     481        }
     482
     483        Graphics2D tempG = (Graphics2D) g;
    472484        Bounds box = getLatLonBounds(g.getClipBounds());
    473485
    474         for (Layer l: getVisibleLayersInZOrder()) {
    475             l.paint(tempG, this, box);
    476         }
     486        if (!canUseBuffer || offscreenBuffer == null) {
     487            if (null == offscreenBuffer || offscreenBuffer.getWidth() != getWidth() || offscreenBuffer.getHeight() != getHeight()) {
     488                offscreenBuffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR);
     489            }
     490            Graphics2D g2 = offscreenBuffer.createGraphics();
     491            g2.setColor(PaintColors.BACKGROUND.get());
     492            g2.fillRect(0, 0, getWidth(), getHeight());
     493
     494            for (int i=0; i<nonChangedLayersCount; i++) {
     495                visibleLayers.get(i).paint(g2, this, box);
     496            }
     497        } else {
     498            // Maybe there were more unchanged layers then last time - draw them to buffer
     499            if (nonChangedLayers.size() != nonChangedLayersCount) {
     500                Graphics2D g2 = offscreenBuffer.createGraphics();
     501                for (int i=nonChangedLayers.size(); i<nonChangedLayersCount; i++) {
     502                    visibleLayers.get(i).paint(g2, this, box);
     503                }
     504            }
     505        }
     506
     507        nonChangedLayers.clear();
     508        for (int i=0; i<nonChangedLayersCount; i++) {
     509            nonChangedLayers.add(visibleLayers.get(i));
     510        }
     511
     512        tempG.drawImage(offscreenBuffer, 0, 0, null);
     513
     514        for (int i=nonChangedLayersCount; i<visibleLayers.size(); i++) {
     515            visibleLayers.get(i).paint(tempG, this, box);
     516        }
     517
    477518        for (MapViewPaintable mvp : temporaryLayers) {
    478519            mvp.paint(tempG, this, box);
     
    515556        }
    516557
    517         int w = offscreenBuffer.getWidth();
    518         int h = offscreenBuffer.getHeight();
     558        int w = getWidth();
     559        int h = getHeight();
    519560
    520561        // Work around OpenJDK having problems when drawing out of bounds
     
    530571        }
    531572
    532         g.drawImage(offscreenBuffer, 0, 0, null);
    533573        super.paint(g);
    534574    }
Note: See TracChangeset for help on using the changeset viewer.