Ignore:
Timestamp:
11.03.2010 21:01:49 (2 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.