Re: JavaFX controls have large size on Raspberry Pi

2020-04-21 Thread thomas.manz+JFX
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

2020-04-20 Thread Philip Race




> 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

2020-04-20 Thread Kevin Rushforth

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

2020-04-20 Thread David Grieve
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.