Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 11538)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 11539)
@@ -166,5 +166,5 @@
             if (e.getWhen() - lastTimeForMousePoint > 1500 || mousePointInImg == null) {
                 lastTimeForMousePoint = e.getWhen();
-                mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
+                mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY(), getSize());
             }
 
@@ -199,5 +199,5 @@
 
             // Set the position of the visible rectangle, so that the mouse cursor doesn't move on the image.
-            Rectangle drawRect = calculateDrawImageRectangle(visibleRect);
+            Rectangle drawRect = calculateDrawImageRectangle(visibleRect, getSize());
             visibleRect.x = mousePointInImg.x + ((drawRect.x - e.getX()) * visibleRect.width) / drawRect.width;
             visibleRect.y = mousePointInImg.y + ((drawRect.y - e.getY()) * visibleRect.height) / drawRect.height;
@@ -235,5 +235,5 @@
 
             // Calculate the translation to set the clicked point the center of the view.
-            Point click = comp2imgCoord(visibleRect, e.getX(), e.getY());
+            Point click = comp2imgCoord(visibleRect, e.getX(), e.getY(), getSize());
             Point center = getCenterImgCoord(visibleRect);
 
@@ -273,9 +273,9 @@
 
             if (e.getButton() == DRAG_BUTTON) {
-                mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
+                mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY(), getSize());
                 mouseIsDragging = true;
                 selectedRect = null;
             } else if (e.getButton() == ZOOM_BUTTON) {
-                mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY());
+                mousePointInImg = comp2imgCoord(visibleRect, e.getX(), e.getY(), getSize());
                 checkPointInVisibleRect(mousePointInImg, visibleRect);
                 mouseIsDragging = false;
@@ -310,5 +310,5 @@
 
             if (mouseIsDragging) {
-                Point p = comp2imgCoord(visibleRect, e.getX(), e.getY());
+                Point p = comp2imgCoord(visibleRect, e.getX(), e.getY(), getSize());
                 visibleRect.x += mousePointInImg.x - p.x;
                 visibleRect.y += mousePointInImg.y - p.y;
@@ -322,5 +322,5 @@
 
             } else if (selectedRect != null) {
-                Point p = comp2imgCoord(visibleRect, e.getX(), e.getY());
+                Point p = comp2imgCoord(visibleRect, e.getX(), e.getY(), getSize());
                 checkPointInVisibleRect(p, visibleRect);
                 Rectangle rect = new Rectangle(
@@ -432,4 +432,7 @@
     }
 
+    /**
+     * Constructs a new {@code ImageDisplay}.
+     */
     public ImageDisplay() {
         ImgDisplayMouseListener mouseListener = new ImgDisplayMouseListener();
@@ -471,9 +474,9 @@
         }
 
+        Dimension size = getSize();
         if (file == null) {
             g.setColor(Color.black);
             String noImageStr = tr("No image");
             Rectangle2D noImageSize = g.getFontMetrics(g.getFont()).getStringBounds(noImageStr, g);
-            Dimension size = getSize();
             g.drawString(noImageStr,
                     (int) ((size.width - noImageSize.getWidth()) / 2),
@@ -488,10 +491,9 @@
             }
             Rectangle2D noImageSize = g.getFontMetrics(g.getFont()).getStringBounds(loadingStr, g);
-            Dimension size = getSize();
             g.drawString(loadingStr,
                     (int) ((size.width - noImageSize.getWidth()) / 2),
                     (int) ((size.height - noImageSize.getHeight()) / 2));
         } else {
-            Rectangle target = calculateDrawImageRectangle(visibleRect);
+            Rectangle target = calculateDrawImageRectangle(visibleRect, size);
             g.drawImage(image,
                     target.x, target.y, target.x + target.width, target.y + target.height,
@@ -499,8 +501,8 @@
                     null);
             if (selectedRect != null) {
-                Point topLeft = img2compCoord(visibleRect, selectedRect.x, selectedRect.y);
+                Point topLeft = img2compCoord(visibleRect, selectedRect.x, selectedRect.y, size);
                 Point bottomRight = img2compCoord(visibleRect,
                         selectedRect.x + selectedRect.width,
-                        selectedRect.y + selectedRect.height);
+                        selectedRect.y + selectedRect.height, size);
                 g.setColor(new Color(128, 128, 128, 180));
                 g.fillRect(target.x, target.y, target.width, topLeft.y - target.y);
@@ -514,5 +516,4 @@
                 String loadingStr = tr("Error on file {0}", file.getName());
                 Rectangle2D noImageSize = g.getFontMetrics(g.getFont()).getStringBounds(loadingStr, g);
-                Dimension size = getSize();
                 g.drawString(loadingStr,
                         (int) ((size.width - noImageSize.getWidth()) / 2),
@@ -550,23 +551,23 @@
     }
 
-    private Point img2compCoord(Rectangle visibleRect, int xImg, int yImg) {
-        Rectangle drawRect = calculateDrawImageRectangle(visibleRect);
+    static Point img2compCoord(Rectangle visibleRect, int xImg, int yImg, Dimension compSize) {
+        Rectangle drawRect = calculateDrawImageRectangle(visibleRect, compSize);
         return new Point(drawRect.x + ((xImg - visibleRect.x) * drawRect.width) / visibleRect.width,
                 drawRect.y + ((yImg - visibleRect.y) * drawRect.height) / visibleRect.height);
     }
 
-    private Point comp2imgCoord(Rectangle visibleRect, int xComp, int yComp) {
-        Rectangle drawRect = calculateDrawImageRectangle(visibleRect);
+    static Point comp2imgCoord(Rectangle visibleRect, int xComp, int yComp, Dimension compSize) {
+        Rectangle drawRect = calculateDrawImageRectangle(visibleRect, compSize);
         return new Point(visibleRect.x + ((xComp - drawRect.x) * visibleRect.width) / drawRect.width,
                 visibleRect.y + ((yComp - drawRect.y) * visibleRect.height) / drawRect.height);
     }
 
-    private static Point getCenterImgCoord(Rectangle visibleRect) {
+    static Point getCenterImgCoord(Rectangle visibleRect) {
         return new Point(visibleRect.x + visibleRect.width / 2,
-                visibleRect.y + visibleRect.height / 2);
-    }
-
-    private Rectangle calculateDrawImageRectangle(Rectangle visibleRect) {
-        return calculateDrawImageRectangle(visibleRect, new Rectangle(0, 0, getSize().width, getSize().height));
+                         visibleRect.y + visibleRect.height / 2);
+    }
+
+    static Rectangle calculateDrawImageRectangle(Rectangle visibleRect, Dimension compSize) {
+        return calculateDrawImageRectangle(visibleRect, new Rectangle(0, 0, compSize.width, compSize.height));
     }
 
@@ -579,9 +580,8 @@
      */
     static Rectangle calculateDrawImageRectangle(Rectangle imgRect, Rectangle compRect) {
-        int x, y, w, h;
-        x = 0;
-        y = 0;
-        w = compRect.width;
-        h = compRect.height;
+        int x = 0;
+        int y = 0;
+        int w = compRect.width;
+        int h = compRect.height;
 
         int wFact = w * imgRect.height;
@@ -633,5 +633,5 @@
     }
 
-    private static void checkVisibleRectPos(Image image, Rectangle visibleRect) {
+    static void checkVisibleRectPos(Image image, Rectangle visibleRect) {
         if (visibleRect.x < 0) {
             visibleRect.x = 0;
@@ -648,5 +648,5 @@
     }
 
-    private static void checkVisibleRectSize(Image image, Rectangle visibleRect) {
+    static void checkVisibleRectSize(Image image, Rectangle visibleRect) {
         if (visibleRect.width > image.getWidth(null)) {
             visibleRect.width = image.getWidth(null);
Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java	(revision 11539)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java	(revision 11539)
@@ -0,0 +1,44 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer.geoimage;
+
+import static org.junit.Assert.assertEquals;
+
+import java.awt.Dimension;
+import java.awt.Rectangle;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Unit tests of {@link ImageDisplay} class.
+ */
+public class ImageDisplayTest {
+    /**
+     * We need prefs for this.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
+
+    /**
+     * Unit test of {@link ImageDisplay#calculateDrawImageRectangle}.
+     */
+    @Test
+    public void testCalculateDrawImageRectangle() {
+        assertEquals(new Rectangle(),
+                ImageDisplay.calculateDrawImageRectangle(new Rectangle(), new Dimension()));
+        assertEquals(new Rectangle(0, 0, 10, 5),
+                ImageDisplay.calculateDrawImageRectangle(new Rectangle(0, 0, 10, 5), new Dimension(10, 5)));
+        assertEquals(new Rectangle(0, 0, 10, 5),
+                ImageDisplay.calculateDrawImageRectangle(new Rectangle(0, 0, 20, 10), new Dimension(10, 5)));
+        assertEquals(new Rectangle(0, 0, 20, 10),
+                ImageDisplay.calculateDrawImageRectangle(new Rectangle(0, 0, 10, 5), new Dimension(20, 10)));
+        assertEquals(new Rectangle(5, 0, 24, 12),
+                ImageDisplay.calculateDrawImageRectangle(new Rectangle(0, 0, 10, 5), new Dimension(35, 12)));
+        assertEquals(new Rectangle(0, 1, 8, 4),
+                ImageDisplay.calculateDrawImageRectangle(new Rectangle(0, 0, 10, 5), new Dimension(8, 6)));
+    }
+}
