Changeset 16764 in josm


Ignore:
Timestamp:
2020-07-14T19:50:11+02:00 (3 weeks ago)
Author:
simon04
Message:

see #13173 - Fix cursor hotspot for HiDPI (patch by johsin18, modified)

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/ImageProvider.java

    r16643 r16764  
    13301330
    13311331    /**
     1332     * The cursor hotspot constants {@link #DEFAULT_HOTSPOT} and {@link #CROSSHAIR_HOTSPOT} are relative to this cursor size
     1333     */
     1334    protected static final int CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO = 32;
     1335    private static final Point DEFAULT_HOTSPOT = new Point(3, 2);  // FIXME: define better hotspot for rotate.png
     1336    private static final Point CROSSHAIR_HOTSPOT = new Point(10, 10);
     1337
     1338    /**
    13321339     * Load a cursor image with a given file name, optionally decorated with an overlay image
    13331340     *
     
    13451352                                                .setMaxSize(ImageSizes.CURSOROVERLAY)));
    13461353        }
    1347         hotSpot.setLocation("crosshair".equals(name) ? new Point(10, 10) : new Point(3, 2));
    13481354        ImageIcon imageIcon = imageProvider.get();
    13491355        Image image = imageIcon.getImage();
     
    13611367                image = image.getScaledInstance(bestCursorSize.width, bestCursorSize.height, Image.SCALE_DEFAULT);
    13621368            }
    1363 
    1364             hotSpot.x = hotSpot.x * bestCursorSize.width / width;
    1365             hotSpot.y = hotSpot.y * bestCursorSize.height / height;
    1366         }
     1369        }
     1370
     1371        hotSpot.setLocation("crosshair".equals(name) ? CROSSHAIR_HOTSPOT : DEFAULT_HOTSPOT);
     1372        hotSpot.x = hotSpot.x * image.getWidth(null) / CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO;
     1373        hotSpot.y = hotSpot.y * image.getHeight(null) / CURSOR_SIZE_HOTSPOT_IS_RELATIVE_TO;
    13671374
    13681375        return image;
  • trunk/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java

    r16486 r16764  
    194194    }
    195195
    196     public static final int ORIGINAL_CURSOR_SIZE = 32;
    197 
    198196    /**
    199197     * Test getting an image for a crosshair cursor.
     
    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);
     
    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);
     
    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
Note: See TracChangeset for help on using the changeset viewer.