On 9/29/17 07:11, Alexey Ivanov wrote:
If I understand correctly, the introduction of the new API does not change the behaviour in this case, does it?

The icon extracted from Windows was 16×16 and will continue to be used.
That is the icon will be scaled when painted.

To support HiDPI displays the implementation of |getFileChooser().getFileSystemView().getSystemIcon(f)| should be enhanced to fetch the icon at the appropriate size according to the current rendering scale. I mean in standard resolution, get 16×16 icon, for 125% scale factor, get 20×20 icon, for 150% scale factor, get icon 24×24. (As far as I know, |IExtractIcon::Extract| does not perform any scaling to account for HiDPI rendering. And it really can't because different displays can have different DPI settings. Thus if you request icon size of 16×16, you'll get 16×16 icon, not 32×32 even if this size is more appropriate to the current HiDPI scaling.)

Yes, the old getSystemIcon(f) can be enhanced to support MRI and this will fix all its usages. But my point was for a new API and how this new API can solve the problem of access to different dpi icons. - We cannot use FILE_ICON_SMALL because it does not depend from the screen, and it is unclear what the small icons means.
 - We cannot use FILE_ICON_LARGE by the same reason.
- We cannot request some specific size because we know the scale which should be applied to the default icon, but we do not know the size of the default icon.
So everywhere we should do something like this:
Icon icon = getSystemIcon(file);
Icon hicon = getSystemIcon(file, icon.getIconWidth()*screenScale);


Different icon sizes could be combined into MRI lazily.
To support it, we could use different APIs to extract the icons. For example, we can get the list of icon sizes for a file type, and extract only “native” size. If larger size is required for HiDPI and the icon has it, then get the larger version and use it for rendering rather than scaling the one we already have.

It is not necessary to update other parts of the Swing right now, but it should be possible to update it later and use the new API which will be added in this fix, since this fix is a about access to a good quality icons, some comments here:
https://bugs.openjdk.java.net/browse/JDK-8156183


However, it looks to be out of the scope for this particular fix. Yet this approach will make UI look crispier at higher resolutions.



--
Best regards, Sergey.

Reply via email to