Re: JavaFX controls have large size on Raspberry Pi
I debugged this topic already last week and what I saw was that this was still working with release 13 and now in 14 it´s broken. I guess the problem was introduced with the change “8236448: Remove unused and repair broken Android/Dalvik code” (https://github.com/openjdk/jfx/pull/75) where the file modules/javafx.graphics/src/main/java/com/sun/glass/ui/monocle/MonocleApplication.java was changed; the function staticScreen_getScreens() now sets width and height in the returned Screen object where before DPI was set: https://github.com/openjdk/jfx/pull/75/files#diff-b66ff7fe72c6c5cd26003572ca901bfd (line 228) I don´t understand the background of this change but I think this is the root cause why Screen.getMainScreen().getResolutionY() now returns 480 (pixel) instead of 96 (DPI) on the Raspberry Pi resulting in a default font size of 80 instead of 16 for all(!) controls. Best regards, Thomas Von: Thomas Manz [mailto:thomas.manz+...@gmail.com] Gesendet: Dienstag, 21. April 2020 11:12 An: openjfx-dev@openjdk.java.net Betreff: Re: JavaFX controls have large size on Raspberry Pi -- Forwarded message -- From: Kevin Rushforth To: openjfx-dev@openjdk.java.net Cc: Bcc: Date: Mon, 20 Apr 2020 13:56:44 -0700 Subject: Re: JavaFX controls have large size on Raspberry Pi Another thing to check is that the reported DPI of the screen is correct. -- Kevin On 4/20/2020 1:25 PM, David Grieve wrote: > The sizes of controls are controlled by CSS styles. Things like borders, > backgrounds, padding, insets, all of > that defaults to the styles in a stylesheet. Most sizes are 'em' units, > meaning they are relative to the size > of the font. JavaFX CSS will use the Font.getDefault() font size if there is > no font explicitly set in either the > styles or in the application code. > > I would start by looking at what Font.getDefault().getSize() returns since > everything should be based off that. > It could also be an issue with the default stylesheets themselves. > > -Original Message- > From: openjfx-dev On Behalf Of > Alexander Scherbatiy > Sent: Monday, April 20, 2020 2:16 PM > To: openjfx-dev@openjdk.java.net > Subject: [EXTERNAL] JavaFX controls have large size on Raspberry Pi > > Hello, > > I run a simple JavaFX application which shows a button with jdk 14.0.1 on > Raspberry Pi and the drawn button has large size. > > This is because of the algorithm which is used by > PrismFontFactory.getSystemFontSize() method [1] to select a system font size. > If a system is embedded then the font size is calculated as > > int screenDPI = Screen.getMainScreen().getResolutionY(); > systemFontSize = ((float) screenDPI) / 6f; // 12 points > > and the system is detected as embedded because the armv6hf architecture is > defined as embedded in the armv6hf.gradle file [2]. > > Raspberri Pi can work both with small touch displays and with big monitors. > It looks like Raspberry Pi should support two modes for font size > calculation: one for small screens and another for large. > > I would like to contribute a fix for this but I do not know how the right fix > could look like. > Should there be a special screen size so for smaller screens the font is is > proportional to the screen size and for bigger screens the font size is fixed? > Is there a way to check that used screen is from embedded device? > May be it should be solved in different way? > > [1] > https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2Fmodules%2Fjavafx.graphics%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsun%2Fjavafx%2Ffont%2FPrismFontFactory.java%23L1944 > > <https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2Fmodules%2Fjavafx.graphics%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsun%2Fjavafx%2Ffont%2FPrismFontFactory.java%23L1944data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3Dreserved=0> > > data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3Dreserved=0 > [2] > https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2FbuildSrc%2Farmv6hf.gradle%23L182 > > <https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2FbuildSrc%2Farmv6hf.gradle%23L182data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947
Re: JavaFX controls have large size on Raspberry Pi
> I would start by looking at what Font.getDefault().getSize() returns since everything should be based off that. I think the code below is the code that decides what the code above should return > Another thing to check is that the reported DPI of the screen is correct. The way I read the code below is that it wants the default font to be 1/6 of an inch high on the screen. I think any smaller than 6 lines per inch and it will be hard to read. To do this correctly, it relies on the y-res being accurate for the device. So I would follow the path Kevin suggests. For example if something is wrongly returning the *dimension* of the screen when it should be the *dpi* of the screen then you'd have 6 lines of text filling up the screen. -phil. On 4/20/20, 1:56 PM, Kevin Rushforth wrote: Another thing to check is that the reported DPI of the screen is correct. -- Kevin On 4/20/2020 1:25 PM, David Grieve wrote: The sizes of controls are controlled by CSS styles. Things like borders, backgrounds, padding, insets, all of that defaults to the styles in a stylesheet. Most sizes are 'em' units, meaning they are relative to the size of the font. JavaFX CSS will use the Font.getDefault() font size if there is no font explicitly set in either the styles or in the application code. I would start by looking at what Font.getDefault().getSize() returns since everything should be based off that. It could also be an issue with the default stylesheets themselves. -Original Message- From: openjfx-dev On Behalf Of Alexander Scherbatiy Sent: Monday, April 20, 2020 2:16 PM To: openjfx-dev@openjdk.java.net Subject: [EXTERNAL] JavaFX controls have large size on Raspberry Pi Hello, I run a simple JavaFX application which shows a button with jdk 14.0.1 on Raspberry Pi and the drawn button has large size. This is because of the algorithm which is used by PrismFontFactory.getSystemFontSize() method [1] to select a system font size. If a system is embedded then the font size is calculated as int screenDPI = Screen.getMainScreen().getResolutionY(); systemFontSize = ((float) screenDPI) / 6f; // 12 points and the system is detected as embedded because the armv6hf architecture is defined as embedded in the armv6hf.gradle file [2]. Raspberri Pi can work both with small touch displays and with big monitors. It looks like Raspberry Pi should support two modes for font size calculation: one for small screens and another for large. I would like to contribute a fix for this but I do not know how the right fix could look like. Should there be a special screen size so for smaller screens the font is is proportional to the screen size and for bigger screens the font size is fixed? Is there a way to check that used screen is from embedded device? May be it should be solved in different way? [1] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2Fmodules%2Fjavafx.graphics%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsun%2Fjavafx%2Ffont%2FPrismFontFactory.java%23L1944data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3Dreserved=0 [2] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2FbuildSrc%2Farmv6hf.gradle%23L182data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3Dreserved=0 JavaFX application: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class ButtonFX extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button button = new Button("Hello, World!"); StackPane root = new StackPane(); root.getChildren().add(button); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } Thanks, Alexander.
Re: JavaFX controls have large size on Raspberry Pi
Another thing to check is that the reported DPI of the screen is correct. -- Kevin On 4/20/2020 1:25 PM, David Grieve wrote: The sizes of controls are controlled by CSS styles. Things like borders, backgrounds, padding, insets, all of that defaults to the styles in a stylesheet. Most sizes are 'em' units, meaning they are relative to the size of the font. JavaFX CSS will use the Font.getDefault() font size if there is no font explicitly set in either the styles or in the application code. I would start by looking at what Font.getDefault().getSize() returns since everything should be based off that. It could also be an issue with the default stylesheets themselves. -Original Message- From: openjfx-dev On Behalf Of Alexander Scherbatiy Sent: Monday, April 20, 2020 2:16 PM To: openjfx-dev@openjdk.java.net Subject: [EXTERNAL] JavaFX controls have large size on Raspberry Pi Hello, I run a simple JavaFX application which shows a button with jdk 14.0.1 on Raspberry Pi and the drawn button has large size. This is because of the algorithm which is used by PrismFontFactory.getSystemFontSize() method [1] to select a system font size. If a system is embedded then the font size is calculated as int screenDPI = Screen.getMainScreen().getResolutionY(); systemFontSize = ((float) screenDPI) / 6f; // 12 points and the system is detected as embedded because the armv6hf architecture is defined as embedded in the armv6hf.gradle file [2]. Raspberri Pi can work both with small touch displays and with big monitors. It looks like Raspberry Pi should support two modes for font size calculation: one for small screens and another for large. I would like to contribute a fix for this but I do not know how the right fix could look like. Should there be a special screen size so for smaller screens the font is is proportional to the screen size and for bigger screens the font size is fixed? Is there a way to check that used screen is from embedded device? May be it should be solved in different way? [1] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2Fmodules%2Fjavafx.graphics%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsun%2Fjavafx%2Ffont%2FPrismFontFactory.java%23L1944data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3Dreserved=0 [2] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2FbuildSrc%2Farmv6hf.gradle%23L182data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3Dreserved=0 JavaFX application: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class ButtonFX extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button button = new Button("Hello, World!"); StackPane root = new StackPane(); root.getChildren().add(button); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } Thanks, Alexander.
RE: JavaFX controls have large size on Raspberry Pi
The sizes of controls are controlled by CSS styles. Things like borders, backgrounds, padding, insets, all of that defaults to the styles in a stylesheet. Most sizes are 'em' units, meaning they are relative to the size of the font. JavaFX CSS will use the Font.getDefault() font size if there is no font explicitly set in either the styles or in the application code. I would start by looking at what Font.getDefault().getSize() returns since everything should be based off that. It could also be an issue with the default stylesheets themselves. -Original Message- From: openjfx-dev On Behalf Of Alexander Scherbatiy Sent: Monday, April 20, 2020 2:16 PM To: openjfx-dev@openjdk.java.net Subject: [EXTERNAL] JavaFX controls have large size on Raspberry Pi Hello, I run a simple JavaFX application which shows a button with jdk 14.0.1 on Raspberry Pi and the drawn button has large size. This is because of the algorithm which is used by PrismFontFactory.getSystemFontSize() method [1] to select a system font size. If a system is embedded then the font size is calculated as int screenDPI = Screen.getMainScreen().getResolutionY(); systemFontSize = ((float) screenDPI) / 6f; // 12 points and the system is detected as embedded because the armv6hf architecture is defined as embedded in the armv6hf.gradle file [2]. Raspberri Pi can work both with small touch displays and with big monitors. It looks like Raspberry Pi should support two modes for font size calculation: one for small screens and another for large. I would like to contribute a fix for this but I do not know how the right fix could look like. Should there be a special screen size so for smaller screens the font is is proportional to the screen size and for bigger screens the font size is fixed? Is there a way to check that used screen is from embedded device? May be it should be solved in different way? [1] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2Fmodules%2Fjavafx.graphics%2Fsrc%2Fmain%2Fjava%2Fcom%2Fsun%2Fjavafx%2Ffont%2FPrismFontFactory.java%23L1944data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3Dreserved=0 [2] https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjfx%2Fblob%2Fec8608f39576035d41e8e532e9334b979b859543%2FbuildSrc%2Farmv6hf.gradle%23L182data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3Dreserved=0 JavaFX application: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class ButtonFX extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button button = new Button("Hello, World!"); StackPane root = new StackPane(); root.getChildren().add(button); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } } Thanks, Alexander.