Index: /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java	(revision 16977)
+++ /trunk/src/org/openstreetmap/josm/tools/ImageResizeMode.java	(revision 16978)
@@ -35,14 +35,15 @@
             CheckParameterUtil.ensureThat((dim.width > 0 || dim.width == -1) && (dim.height > 0 || dim.height == -1),
                     () -> dim + " is invalid");
+            final int maxWidth = Math.min(dim.width, icon.width);
+            final int maxHeight = Math.min(dim.height, icon.height);
             final Dimension spec;
-            if (dim.width == -1 || dim.height == -1) {
+            if (maxWidth == -1 || maxHeight == -1) {
                 spec = dim;
-            } else if (icon.getWidth() / dim.width > icon.getHeight() / dim.height) {
-                spec = new Dimension(dim.width, -1);
+            } else if (icon.getWidth() / maxWidth > icon.getHeight() / maxHeight) {
+                spec = new Dimension(maxWidth, -1);
             } else {
-                spec = new Dimension(-1, dim.height);
+                spec = new Dimension(-1, maxHeight);
             }
             return AUTO.computeDimension(spec, icon);
-            // TODO disable upscaling non-svg icons?
         }
     },
Index: /trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java	(revision 16977)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java	(revision 16978)
@@ -14,4 +14,7 @@
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
+/**
+ * Unit tests of {@link ImageResizeMode} class.
+ */
 public class ImageResizeModeTest {
 
@@ -23,7 +26,12 @@
     public JOSMTestRules test = new JOSMTestRules().preferences();
 
+    final Dimension image = new Dimension(64, 48);
+    final Dimension smallImage = new Dimension(14, 10);
+
+    /**
+     * Test method for {@link ImageResizeMode#computeDimension} using {@link ImageResizeMode#AUTO}
+     */
     @Test
-    public void testComputeDimension() {
-        final Dimension image = new Dimension(64, 48);
+    public void testComputeDimensionAuto() {
         assertThrows(IllegalArgumentException.class, () -> ImageResizeMode.AUTO.computeDimension(new Dimension(0, 0), image));
         assertEquals(new Dimension(64, 48), ImageResizeMode.AUTO.computeDimension(ImageResource.DEFAULT_DIMENSION, image));
@@ -33,4 +41,11 @@
         assertEquals(new Dimension(21, 16), ImageResizeMode.AUTO.computeDimension(new Dimension(-1, 16), image));
         assertEquals(new Dimension(24, 32), ImageResizeMode.AUTO.computeDimension(new Dimension(24, 32), image));
+    }
+
+    /**
+     * Test method for {@link ImageResizeMode#computeDimension} using {@link ImageResizeMode#BOUNDED}
+     */
+    @Test
+    public void testComputeDimensionBounded() {
         assertEquals(new Dimension(64, 48), ImageResizeMode.BOUNDED.computeDimension(ImageResource.DEFAULT_DIMENSION, image));
         assertEquals(new Dimension(64, 48), ImageResizeMode.BOUNDED.computeDimension(new Dimension(-1, -1), image));
@@ -39,4 +54,19 @@
         assertEquals(new Dimension(21, 16), ImageResizeMode.BOUNDED.computeDimension(new Dimension(-1, 16), image));
         assertEquals(new Dimension(24, 18), ImageResizeMode.BOUNDED.computeDimension(new Dimension(24, 32), image));
+        assertEquals(new Dimension(14, 10), ImageResizeMode.BOUNDED.computeDimension(new Dimension(64, 48), smallImage));
+        assertEquals(new Dimension(14, 10), ImageResizeMode.BOUNDED.computeDimension(new Dimension(16, 16), smallImage));
+        assertEquals(new Dimension(11, 8), ImageResizeMode.BOUNDED.computeDimension(new Dimension(16, 8), smallImage));
+        assertEquals(new Dimension(12, 8), ImageResizeMode.BOUNDED.computeDimension(new Dimension(12, 12), smallImage));
+        assertEquals(new Dimension(11, 8), ImageResizeMode.BOUNDED.computeDimension(new Dimension(12, 8), smallImage));
+        assertEquals(new Dimension(8, 5), ImageResizeMode.BOUNDED.computeDimension(new Dimension(8, 16), smallImage));
+        assertEquals(new Dimension(8, 5), ImageResizeMode.BOUNDED.computeDimension(new Dimension(8, 8), smallImage));
+        assertEquals(new Dimension(8, 5), ImageResizeMode.BOUNDED.computeDimension(new Dimension(8, 8), smallImage));
+    }
+
+    /**
+     * Test method for {@link ImageResizeMode#computeDimension} using {@link ImageResizeMode#PADDED}
+     */
+    @Test
+    public void testComputeDimensionPadded() {
         assertThrows(IllegalArgumentException.class, () -> ImageResizeMode.PADDED.computeDimension(new Dimension(0, 0), image));
         assertThrows(IllegalArgumentException.class, () -> ImageResizeMode.PADDED.computeDimension(ImageResource.DEFAULT_DIMENSION, image));
@@ -48,4 +78,7 @@
     }
 
+    /**
+     * Test method for {@link ImageResizeMode#cacheKey}
+     */
     @Test
     public void testCacheKey() {
