Ticket #9995: hidpi-mapview.patch
File hidpi-mapview.patch, 6.0 KB (added by , 7 years ago) |
---|
-
src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
1149 1149 } 1150 1150 displayText(() -> { 1151 1151 AffineTransform defaultTransform = g.getTransform(); 1152 g. setTransform(at);1152 g.transform(at); 1153 1153 g.setFont(text.font); 1154 1154 g.drawString(name, 0, 0); 1155 1155 g.setTransform(defaultTransform); -
src/org/openstreetmap/josm/gui/MapView.java
8 8 import java.awt.Graphics2D; 9 9 import java.awt.Point; 10 10 import java.awt.Rectangle; 11 import java.awt.Shape; 11 12 import java.awt.event.ComponentAdapter; 12 13 import java.awt.event.ComponentEvent; 13 14 import java.awt.event.KeyEvent; … … 14 15 import java.awt.event.MouseAdapter; 15 16 import java.awt.event.MouseEvent; 16 17 import java.awt.event.MouseMotionListener; 18 import java.awt.geom.AffineTransform; 17 19 import java.awt.geom.Area; 18 20 import java.awt.image.BufferedImage; 19 21 import java.beans.PropertyChangeEvent; … … 487 489 } 488 490 489 491 private void drawMapContent(Graphics g) { 492 Graphics2D gg = (Graphics2D) g; 493 AffineTransform trOrig = gg.getTransform(); 494 double uiScaleX = gg.getTransform().getScaleX(); 495 double uiScaleY = gg.getTransform().getScaleY(); 496 int width = (int) Math.round(getWidth() * uiScaleX); 497 int height = (int) Math.round(getHeight() * uiScaleY); 498 499 AffineTransform trDef = AffineTransform.getScaleInstance(uiScaleX, uiScaleY); 500 Shape scaledClip = trDef.createTransformedShape(g.getClip()); 501 490 502 List<Layer> visibleLayers = layerManager.getVisibleLayersInZOrder(); 491 503 492 504 int nonChangedLayersCount = 0; … … 505 517 && lastClipBounds.contains(g.getClipBounds()) 506 518 && nonChangedLayers.equals(visibleLayers.subList(0, nonChangedLayers.size())); 507 519 508 if (null == offscreenBuffer || offscreenBuffer.getWidth() != getWidth() || offscreenBuffer.getHeight() != getHeight()) {509 offscreenBuffer = new BufferedImage( getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR);520 if (null == offscreenBuffer || offscreenBuffer.getWidth() != width || offscreenBuffer.getHeight() != height) { 521 offscreenBuffer = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); 510 522 } 511 523 512 Graphics2D tempG = offscreenBuffer.createGraphics();513 tempG.setClip(g.getClip());514 515 524 if (!canUseBuffer || nonChangedLayersBuffer == null) { 516 525 if (null == nonChangedLayersBuffer 517 || nonChangedLayersBuffer.getWidth() != getWidth() || nonChangedLayersBuffer.getHeight() != getHeight()) {518 nonChangedLayersBuffer = new BufferedImage( getWidth(), getHeight(), BufferedImage.TYPE_3BYTE_BGR);526 || nonChangedLayersBuffer.getWidth() != width || nonChangedLayersBuffer.getHeight() != height) { 527 nonChangedLayersBuffer = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); 519 528 } 520 529 Graphics2D g2 = nonChangedLayersBuffer.createGraphics(); 521 g2.setClip(g.getClip()); 530 g2.setClip(scaledClip); 531 g2.setTransform(trDef); 522 532 g2.setColor(PaintColors.getBackgroundColor()); 523 g2.fillRect(0, 0, getWidth(), getHeight());533 g2.fillRect(0, 0, width, height); 524 534 525 535 for (int i = 0; i < nonChangedLayersCount; i++) { 526 536 paintLayer(visibleLayers.get(i), g2); … … 529 539 // Maybe there were more unchanged layers then last time - draw them to buffer 530 540 if (nonChangedLayers.size() != nonChangedLayersCount) { 531 541 Graphics2D g2 = nonChangedLayersBuffer.createGraphics(); 532 g2.setClip(g.getClip()); 542 g2.setClip(scaledClip); 543 g2.setTransform(trDef); 533 544 for (int i = nonChangedLayers.size(); i < nonChangedLayersCount; i++) { 534 545 paintLayer(visibleLayers.get(i), g2); 535 546 } … … 541 552 lastViewID = getViewID(); 542 553 lastClipBounds = g.getClipBounds(); 543 554 555 Graphics2D tempG = offscreenBuffer.createGraphics(); 556 tempG.setClip(scaledClip); 557 tempG.setTransform(new AffineTransform()); 544 558 tempG.drawImage(nonChangedLayersBuffer, 0, 0, null); 545 559 tempG.setTransform(trDef); 560 546 561 for (int i = nonChangedLayersCount; i < visibleLayers.size(); i++) { 547 562 paintLayer(visibleLayers.get(i), tempG); 548 563 } 549 564 550 565 try { 551 drawTemporaryLayers(tempG, getLatLonBounds(g.getClipBounds())); 566 drawTemporaryLayers(tempG, getLatLonBounds(new Rectangle( 567 (int) Math.round(g.getClipBounds().x * uiScaleX), 568 (int) Math.round(g.getClipBounds().y * uiScaleY)))); 552 569 } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) { 553 570 BugReport.intercept(e).put("temporaryLayers", temporaryLayers).warn(); 554 571 } … … 573 590 } 574 591 575 592 try { 576 g.drawImage(offscreenBuffer, 0, 0, null); 593 gg.setTransform(new AffineTransform(1, 0, 0, 1, trOrig.getTranslateX(), trOrig.getTranslateY())); 594 gg.drawImage(offscreenBuffer, 0, 0, null); 577 595 } catch (ClassCastException e) { 578 596 // See #11002 and duplicate tickets. On Linux with Java >= 8 Many users face this error here: 579 597 // … … 599 617 // 600 618 // But the application seems to work fine after, so let's just log the error 601 619 Logging.error(e); 620 } finally { 621 gg.setTransform(trOrig); 602 622 } 603 623 } 604 624