Changeset 3116 in josm for trunk/src/org/openstreetmap/josm/gui/MapView.java
- Timestamp:
- 2010-03-11T21:01:49+01:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/MapView.java
r3078 r3116 159 159 * A list of all layers currently loaded. 160 160 */ 161 private ArrayList<Layer> layers = new ArrayList<Layer>();161 private final List<Layer> layers = new ArrayList<Layer>(); 162 162 /** 163 163 * The play head marker: there is only one of these so it isn't in any specific layer … … 180 180 181 181 private BufferedImage offscreenBuffer; 182 // Layers that wasn't changed since last paint 183 private final List<Layer> nonChangedLayers = new ArrayList<Layer>(); 182 184 183 185 public MapView() { … … 458 460 return; // no data loaded yet. 459 461 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; 472 484 Bounds box = getLatLonBounds(g.getClipBounds()); 473 485 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 477 518 for (MapViewPaintable mvp : temporaryLayers) { 478 519 mvp.paint(tempG, this, box); … … 515 556 } 516 557 517 int w = offscreenBuffer.getWidth();518 int h = offscreenBuffer.getHeight();558 int w = getWidth(); 559 int h = getHeight(); 519 560 520 561 // Work around OpenJDK having problems when drawing out of bounds … … 530 571 } 531 572 532 g.drawImage(offscreenBuffer, 0, 0, null);533 573 super.paint(g); 534 574 }
Note:
See TracChangeset
for help on using the changeset viewer.