Font rendering (on OS-X)
Phil Race
philip.race at oracle.com
Fri Jan 9 17:49:39 UTC 2015
I tried on firefox and Safari and then downloaded to my Mac and tried
directly from disk
using quicktime but it still failed ..
-phil.
On 1/9/15 9:47 AM, Kevin Rushforth wrote:
> I tried the video on Firefox, which said "Video can't be played
> because the file is corrupt."
>
> So I tried it on Chrome and it plays fine for me (as an aside, I find
> Chrome to be the most robust browser these days even though I haven't
> quite made the switch from Firefox as my default browser).
>
> -- Kevin
>
>
> Phil Race wrote:
>> 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