Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 11960)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 11961)
@@ -965,5 +965,6 @@
         }
         g.drawImage(toDrawImg, (int) Math.round(screen0.getX()), (int) Math.round(screen0.getY()),
-                (int) Math.round(screen1.getX() - screen0.getX()), (int) Math.round(screen1.getY() - screen0.getY()), this);
+                (int) Math.round(screen1.getX()) - (int) Math.round(screen0.getX()),
+                (int) Math.round(screen1.getY()) - (int) Math.round(screen0.getY()), this);
         if (clip != null) {
             g.setClip(oldClip);
@@ -1027,5 +1028,5 @@
     private List<Tile> paintTileImages(Graphics2D g, TileSet ts, int zoom, Tile border) {
         if (zoom <= 0) return Collections.emptyList();
-        Shape borderClip = coordinateConverter.getScreenQuadrilateralForTile(border);
+        Shape borderClip = coordinateConverter.getTileShapeScreen(border);
         List<Tile> missedTiles = new LinkedList<>();
         // The callers of this code *require* that we return any tiles that we do not draw in missedTiles.
@@ -1140,5 +1141,5 @@
             // draw tile outline in semi-transparent red
             g.setColor(new Color(255, 0, 0, 50));
-            g.draw(coordinateConverter.getScreenQuadrilateralForTile(tile));
+            g.draw(coordinateConverter.getTileShapeScreen(tile));
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileCoordinateConverter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileCoordinateConverter.java	(revision 11960)
+++ trunk/src/org/openstreetmap/josm/gui/layer/imagery/TileCoordinateConverter.java	(revision 11961)
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.gui.layer.imagery;
 
+import java.awt.Polygon;
+import java.awt.Rectangle;
 import java.awt.Shape;
-import java.awt.geom.Path2D;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
@@ -121,5 +122,5 @@
 
     /**
-     * Returns a quadrilateral formed by the 4 corners of the tile in screen coordinates.
+     * Returns a shape that approximates the outline of the tile in screen coordinates.
      *
      * If the tile is rectangular, this will be the exact border of the tile.
@@ -127,19 +128,29 @@
      * of the tile outline.
      * @param tile the tile
-     * @return quadrilateral tile outline in screen coordinates
-     */
-    public Shape getScreenQuadrilateralForTile(Tile tile) {
-        Point2D p00 = this.getPixelForTile(tile.getXtile(), tile.getYtile(), tile.getZoom());
-        Point2D p10 = this.getPixelForTile(tile.getXtile() + 1, tile.getYtile(), tile.getZoom());
-        Point2D p11 = this.getPixelForTile(tile.getXtile() + 1, tile.getYtile() + 1, tile.getZoom());
-        Point2D p01 = this.getPixelForTile(tile.getXtile(), tile.getYtile() + 1, tile.getZoom());
-
-        Path2D pth = new Path2D.Double();
-        pth.moveTo(p00.getX(), p00.getY());
-        pth.lineTo(p01.getX(), p01.getY());
-        pth.lineTo(p11.getX(), p11.getY());
-        pth.lineTo(p10.getX(), p10.getY());
-        pth.closePath();
-        return pth;
+     * @return tile outline in screen coordinates
+     */
+    public Shape getTileShapeScreen(Tile tile) {
+        if (requiresReprojection()) {
+            Point2D p00 = this.getPixelForTile(tile.getXtile(), tile.getYtile(), tile.getZoom());
+            Point2D p10 = this.getPixelForTile(tile.getXtile() + 1, tile.getYtile(), tile.getZoom());
+            Point2D p11 = this.getPixelForTile(tile.getXtile() + 1, tile.getYtile() + 1, tile.getZoom());
+            Point2D p01 = this.getPixelForTile(tile.getXtile(), tile.getYtile() + 1, tile.getZoom());
+            return new Polygon(new int[] {
+                    (int) Math.round(p00.getX()),
+                    (int) Math.round(p01.getX()),
+                    (int) Math.round(p11.getX()),
+                    (int) Math.round(p10.getX())},
+                new int[] {
+                    (int) Math.round(p00.getY()),
+                    (int) Math.round(p01.getY()),
+                    (int) Math.round(p11.getY()),
+                    (int) Math.round(p10.getY())}, 4);
+        } else {
+            Point2D p00 = this.getPixelForTile(tile.getXtile(), tile.getYtile(), tile.getZoom());
+            Point2D p11 = this.getPixelForTile(tile.getXtile() + 1, tile.getYtile() + 1, tile.getZoom());
+            return new Rectangle((int) Math.round(p00.getX()), (int) Math.round(p00.getY()),
+                    (int) Math.round(p11.getX()) - (int) Math.round(p00.getX()),
+                    (int) Math.round(p11.getY()) - (int) Math.round(p00.getY()));
+        }
     }
 
