Ticket #13173: fix-hotspot-with-ui-scale.patch

File fix-hotspot-with-ui-scale.patch, 4.8 KB (added by johsin18, 5 years ago)
  • src/org/openstreetmap/josm/tools/ImageProvider.java

    diff --git a/src/org/openstreetmap/josm/tools/ImageProvider.java b/src/org/openstreetmap/josm/tools/ImageProvider.java
    index c07e0c88a..138ed46f9 100644
    a b public class ImageProvider {  
    13281328        return Toolkit.getDefaultToolkit().createCustomCursor(image, hotSpot, name);
    13291329    }
    13301330
     1331    static final int CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO = 32;  // the following cursor hotspot constants are relative to this cursor size
     1332    private static final Point DEFAULT_HOTSPOT = new Point(3, 2);  // FIXME: define better hotspot for rotate.png
     1333    private static final Point CROSSHAIR_HOTSPOT = new Point(10, 10);
     1334
    13311335    /**
    13321336     * Load a cursor image with a given file name, optionally decorated with an overlay image
    13331337     *
    public class ImageProvider {  
    13441348                .addOverlay(new ImageOverlay(new ImageProvider("cursor/modifier/" + overlay)
    13451349                                                .setMaxSize(ImageSizes.CURSOROVERLAY)));
    13461350        }
    1347         hotSpot.setLocation("crosshair".equals(name) ? new Point(10, 10) : new Point(3, 2));
     1351        hotSpot.setLocation("crosshair".equals(name) ? CROSSHAIR_HOTSPOT : DEFAULT_HOTSPOT);
    13481352        ImageIcon imageIcon = imageProvider.get();
    13491353        Image image = imageIcon.getImage();
    13501354        int width = image.getWidth(null);
    public class ImageProvider {  
    13601364            if (bestCursorSize.width != image.getWidth(null) || bestCursorSize.height != image.getHeight(null)) {
    13611365                image = image.getScaledInstance(bestCursorSize.width, bestCursorSize.height, Image.SCALE_DEFAULT);
    13621366            }
    1363 
    1364             hotSpot.x = hotSpot.x * bestCursorSize.width / width;
    1365             hotSpot.y = hotSpot.y * bestCursorSize.height / height;
    13661367        }
    13671368
     1369        hotSpot.x = hotSpot.x * image.getWidth(null) / CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO;
     1370        hotSpot.y = hotSpot.y * image.getHeight(null) / CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO;
     1371
    13681372        return image;
    13691373    }
    13701374
  • test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java

    diff --git a/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java b/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
    index bdf0ae0e8..6e53122bd 100644
    a b public class ImageProviderTest {  
    193193        }
    194194    }
    195195
    196     public static final int ORIGINAL_CURSOR_SIZE = 32;
    197 
    198196    /**
    199197     * Test getting an image for a crosshair cursor.
    200198     */
    public class ImageProviderTest {  
    214212     */
    215213    @Test
    216214    public void testGetCursorImageWithOverlay() {
     215        testCursorImageWithOverlay(1.0f);  // normal case
     216        testCursorImageWithOverlay(1.5f);  // user has configured a GUI scale of 1.5 in the JOSM advanced preferences
     217    }
     218
     219    private void testCursorImageWithOverlay(float guiScale) {
    217220        if (GraphicsEnvironment.isHeadless()) {
    218221            // TODO mock Toolkit.getDefaultToolkit().getBestCursorSize()
    219222            return;
    220223        }
     224        GuiSizesHelper.setPixelDensity(guiScale);
    221225        Point hotSpot = new Point();
    222226        Image image = ImageProvider.getCursorImage("normal", "selection", hotSpot);
    223227        assertCursorDimensionsCorrect(new Point.Double(3.0, 2.0), image, hotSpot);
    public class ImageProviderTest {  
    236240    }
    237241
    238242    private void assertCursorDimensionsCorrect(Point.Double originalHotspot, Image image, Point hotSpot) {
    239         Dimension bestCursorSize = Toolkit.getDefaultToolkit().getBestCursorSize(ORIGINAL_CURSOR_SIZE, ORIGINAL_CURSOR_SIZE);
     243        int originalCursorSize = ImageProvider.CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO;
     244        Dimension bestCursorSize = Toolkit.getDefaultToolkit().getBestCursorSize(originalCursorSize, originalCursorSize);
    240245        Image bestCursorImage = HiDPISupport.getResolutionVariant(image, bestCursorSize.width, bestCursorSize.height);
    241246        int bestCursorImageWidth = bestCursorImage.getWidth(null);
    242247        assertEquals((int) Math.round(bestCursorSize.getWidth()), bestCursorImageWidth);
    243248        int bestCursorImageHeight = bestCursorImage.getHeight(null);
    244249        assertEquals((int) Math.round(bestCursorSize.getHeight()), bestCursorImageHeight);
    245         assertEquals(originalHotspot.x / ORIGINAL_CURSOR_SIZE * bestCursorImageWidth, hotSpot.x, 1 /* at worst one pixel off */);
    246         assertEquals(originalHotspot.y / ORIGINAL_CURSOR_SIZE * bestCursorImageHeight, hotSpot.y, 1 /* at worst one pixel off */);
     250        assertEquals(originalHotspot.x / originalCursorSize * bestCursorImageWidth, hotSpot.x, 1 /* at worst one pixel off */);
     251        assertEquals(originalHotspot.y / originalCursorSize * bestCursorImageHeight, hotSpot.y, 1 /* at worst one pixel off */);
    247252    }
    248253
    249254