Font rendering (on OS-X)

Phil Race philip.race at oracle.com
Fri Jan 9 17:38:36 UTC 2015


PS .. your video came up all black for me ..

-phil.

On 1/9/15 9:37 AM, Phil Race wrote:
> Glyphs advances are accumulated in floating point and the rendering of 
> the glyph sub-pixel positioned.
> The nodes however are I expect, positioned at an integer position and in
> any case I am pretty sure that the fractional advance at the end of 
> "ABC" is not passed
> on to the start of drawing "DEF".
> So I think you are just seeing a subtle consequence of rounding 
> because the
> starting position of the first glyph in the 2nd text node/string is 
> not the same as you will get if
> you draw it as one string. Where exactly it happens (at which glyph) 
> will depend on
> the way the numbers work out. Whether it happens elsewhere will depend
> on the advances the platform returns, but its possible.
>
> Its possible that with some amount of work that TextFlow could pass on 
> this
> information so that its less apparent but I don't know off-hand what 
> would
> be involved or how complete a fix it would be. Nor whether its 
> actually worth
> the effort for this case.
>
> -phil.
>
> On 1/9/15 8:27 AM, Tom Schindl wrote:
>> Hi,
>>
>> I know font rendering has been discussed a lot already on this forum but
>> I don't want to talk about sharpness of text but very strange effects of
>> glyph positioning.
>>
>> The program below switches between 1 and 2 text-nodes which results in
>> strange effects at least on my OS-X box.
>>
>> With a font size 15 you see the 2nd text shifting a bit to the right now
>> you could explain this with rounding but it gets even more interesting
>> if you make the font size 25 suddenly the F is changing its position!
>>
>> I recorded a video showing the behavior on my system at
>> http://efxclipse.bestsolution.at/ScreenFlow.mp4
>>
>> My questions are:
>> a) does that happen on other OSes as well
>> b) does anyone have an idea where I could start searching
>> c) do you think this can be fixed?
>>
>>
>>> package application;
>>>
>>>
>>> import javafx.application.Application;
>>> import javafx.scene.Node;
>>> import javafx.scene.Scene;
>>> import javafx.scene.control.Button;
>>> import javafx.scene.control.TextField;
>>> import javafx.scene.layout.VBox;
>>> import javafx.scene.text.Font;
>>> import javafx.scene.text.Text;
>>> import javafx.scene.text.TextFlow;
>>> import javafx.stage.Stage;
>>>
>>> public class TestMe extends Application {
>>>
>>>     private TextField fontSize;
>>>     private TextField text;
>>>
>>>     @Override
>>>     public void start(Stage primaryStage) throws Exception {
>>>         VBox b = new VBox();
>>>
>>>         text = new TextField("ABCDEF");
>>>         b.getChildren().add(text);
>>>
>>>         fontSize = new TextField("15");
>>>         b.getChildren().add(fontSize);
>>>
>>>         TextFlow f = new TextFlow(createText(text.getText()));
>>>
>>>         b.getChildren().add(f);
>>>         Button bu = new Button("Split text");
>>>         bu.setOnAction((e) -> {
>>>             if( f.getChildren().size() == 1 ) {
>>>                 int l = text.getText().length() / 2;
>>>
>>> f.getChildren().setAll(createText(text.getText().substring(0, 
>>> l)),createText(text.getText().substring(l)));
>>>                 bu.setText("One Text");
>>>             } else {
>>> f.getChildren().setAll(createText(text.getText()));
>>>                 bu.setText("Split text");
>>>             }
>>>         });
>>>         b.getChildren().add(bu);
>>>
>>>         Scene s = new Scene(b);
>>> s.getStylesheets().add(TestMe.class.getResource("application.css").toExternalForm());
>>>         primaryStage.setScene(s);
>>>         primaryStage.show();
>>>     }
>>>
>>>     private Node createText(String text) {
>>>         Text t = new Text(text);
>>> //        t.setSmooth(false);
>>> t.setFont(Font.font(Integer.parseInt(fontSize.getText())));
>>>         return t;
>>>     }
>>>
>>>     public static void main(String[] args) {
>>>         Application.launch(args);
>>>     }
>>> }
>>
>> Tom
>>
>



More information about the openjfx-dev mailing list