[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-2d-dev
Subject:    Re: RFR: JDK-8294427 - Check boxes and radio buttons have rendering issues on Windows in High DPI en
From:       Phil Race <prr () openjdk ! org>
Date:       2023-04-28 21:48:53
Message-ID: jDKWvs3-SqBPy9sgOebDg5ZSPXnIw2qZ2fb3w274yk4=.ba7ad6e1-1a21-425c-9841-60b33ce00faf () github ! com
[Download RAW message or body]

On Fri, 28 Apr 2023 21:23:58 GMT, Sergey Bylokhov <serb@openjdk.org> wrote:

> > Problem:
> > 
> > Check boxes and radio buttons in Windows Look-and-Feel have rendering issues when \
> > window is moved from display with one scale to display with a different scale on \
> > a multi-monitor setup: 
> > - Scrawly ticks in checkboxes;
> > - Wrong circle relations in selected radio buttons.
> > 
> > Root-cause:
> > We open theme on AWT Toolkit Window which always has Primary Monitor DPI. 
> > Due to this when the app window goes to Secondary Screen with different DPI UI \
> > buttons appear incorrectly rendered. 
> > Following is a list proposed changes to fix this issue.
> > 
> > 
> > Proposed Fix with Summary of changes:
> > 
> > 1. Open a new Theme Handle per the DPI of the Screen where the App window is.
> > --> This makes sure we get the correct size for UI buttons based on the DPI of \
> > the screen where the app. window is.
> > 
> > 2. GetPartSize() of icons returns size based on standard size = 96 DPI.
> > --> This change makes sure that the default size of UI buttons is 96 since we use \
> > this on Java side to layout UI. 
> > 3. Rect size for icons in native paintBackground() function is fetched from \
> >                 Windows that specific DPI.
> > -->This makes sure that the UI buttons aren't stretched because the size \
> > calculated on Java side is different from what Windows      returns. Thus UI \
> > buttons are scaled correctly once we get their size back from Windows. 
> > 4. Adjust width and the height of the resolution variant image so that for \
> > scaling values of 1.25 , 2.25 , and such we  always  floor, while for 1.5, 1.75, \
> >                 2.5, 2.75 , and such we always ceil.  	 
> > --> This helps make sure that for .25s scaling we get better rendering. 
> > This is because when we go from Double to Int for pixel rendering we sometimes \
> > need to floor or ceil to get crisp rendering. 
> > As of now with these changes the rendering is crisp and good for all scaling \
> > factors with the exception .25s wherein some small artifact is seen sometimes in \
> > rendering of buttons but is still much better compared to what we have now. 
> > 
> > Testing:
> > 
> > Tested locally on my Windows machine with a 2 monitor setup  125%, 150%, 175%, \
> > 225% scaling values and on mach5. 
> > ___________________________________
> > Monitor 1                |    Monitor 2
> > (Primary) 		         |
> > 				 |
> > 125%		 |    175%
> > 	150%		 |    175%
> > 	150%		 |    225%
> > 	175%		 |    175%
> > 	175%	         |    150%
> > 	175%	         |    225%
> > _____________________ |_____________	
> > 
> > Also tested on setup with scaling values of  up-to 350%.
> 
> src/java.desktop/windows/native/libawt/windows/ThemeReader.cpp line 119:
> 
> > 117:         DTRACE_PRINTLN("Loaded UxTheme.dll\n");
> > 118:         OpenThemeDataFuncForDpi = (PFNOPENTHEMEDATAFORDPI)GetProcAddress(
> > 119:                                    hModThemes, "OpenThemeDataForDpi");
> 
> Do we plan to backport this change to the old versions of JDK? If yes will we plan \
> to support old WIndows? If yes probably we should fallback to the "OpenThemeData" \
> if "OpenThemeDataForDpi" is not available?

I guess this could (should?) be backported but Windows 10 is the oldest supported OS \
no matter what the JDK version. And only the more recent versions of Windows 10 at \
that ...

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13701#discussion_r1180838420


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic