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 <kevin.rushfo...@oracle.com> 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 <openjfx-dev-boun...@openjdk.java.net> 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%23L1944&data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3D&reserved=0> > > &data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3D&reserved=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%23L182&data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3D&reserved=0> > > &data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3D&reserved=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. > > ---------- Forwarded message ---------- From: Philip Race <philip.r...@oracle.com> To: Kevin Rushforth <kevin.rushfo...@oracle.com> Cc: openjfx-dev@openjdk.java.net Bcc: Date: Mon, 20 Apr 2020 14:18:37 -0700 Subject: 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 <openjfx-dev-boun...@openjdk.java.net> 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%23L1944&data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3D&reserved=0> >> >> &data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=rEz4bxNE07aW5f22AXWPRLNffwoIixvNxJopLM%2Bfbi4%3D&reserved=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%23L182&data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3D&reserved=0> >> >> &data=02%7C01%7CDavid.Grieve%40microsoft.com%7Cc0b7e923fe4346bf947608d7e55746f0%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637230035326172309&sdata=Fv2sKXwfwuo6JsD0CyeoF6iDmq8rDk5goPCsK31p1Sk%3D&reserved=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. >> >>