RFR: JDK-8314215 Trailing Spaces before Line Breaks Affect the Center Alignment of Text [v6]

John Hendrikx jhendrikx at openjdk.org
Mon Jan 29 17:43:46 UTC 2024


On Mon, 29 Jan 2024 16:22:56 GMT, Andy Goryachev <angorya at openjdk.org> wrote:

>> John Hendrikx has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   Move test that needs QuantumToolkit to system tests
>
> MonkeyTester won't start:
> 
> 
> Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: Index 44 out of bounds for length 38
> 	at javafx.graphics/com.sun.javafx.text.TextRun.getAdvance(TextRun.java:362)
> 	at javafx.graphics/com.sun.javafx.text.PrismTextLayout.computeTrailingSpaceWidth(PrismTextLayout.java:1049)
> 	at javafx.graphics/com.sun.javafx.text.PrismTextLayout.createLine(PrismTextLayout.java:1017)
> 	at javafx.graphics/com.sun.javafx.text.PrismTextLayout.layout(PrismTextLayout.java:1333)
> 	at javafx.graphics/com.sun.javafx.text.PrismTextLayout.ensureLayout(PrismTextLayout.java:231)
> 	at javafx.graphics/com.sun.javafx.text.PrismTextLayout.getVisualBounds(PrismTextLayout.java:1461)
> 	at javafx.graphics/javafx.scene.text.Text.getVisualBounds(Text.java:424)
> 	at javafx.graphics/javafx.scene.text.Text.doComputeGeomBounds(Text.java:1191)
> 	at javafx.graphics/javafx.scene.text.Text$1.doComputeGeomBounds(Text.java:150)
> 	at javafx.graphics/com.sun.javafx.scene.shape.TextHelper.computeGeomBoundsImpl(TextHelper.java:90)
> 	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117)
> 	at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3845)
> 	at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3807)
> 	at javafx.graphics/javafx.scene.Node.getLocalBounds(Node.java:3755)
> 	at javafx.graphics/javafx.scene.Node.updateTxBounds(Node.java:3909)
> 	at javafx.graphics/javafx.scene.Node.getTransformedBounds(Node.java:3701)
> 	at javafx.graphics/javafx.scene.Parent.getChildTransformedBounds(Parent.java:1849)
> 	at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Parent.java:1710)
> 	at javafx.graphics/javafx.scene.Parent.recomputeBounds(Parent.java:1649)
> 	at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Parent.java:1502)
> 	at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Parent.java:115)
> 	at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(ParentHelper.java:84)
> 	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(NodeHelper.java:117)
> 	at javafx.graphics/javafx.scene.Node.updateGeomBounds(Node.java:3845)
> 	at javafx.graphics/javafx.scene.Node.getGeomBounds(Node.java:3807)
> 	at javafx.graphics/javafx.scene.Node.doComputeLayoutBounds(Node.java:3655)
> 	at javafx.graphics/javafx.scene.Node$1.doComputeLayoutBounds(Node.java:449)
> 	at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeLayoutBoundsImpl(NodeHelper.java:168)
> 	at javafx.graphics/com.sun.javafx....

@andy-goryachev-oracle about MonkeyTester not starting, I've reproduced this in a unit test.

The `TextRun` code is more complex than I figured.  The trailing space calculation does not take into account that a single char can match to multiple glyphs, and so it is using the wrong offset to call `getAdvance` with.  I'll try and have a fix + additional tests ready by tomorrow.

For reference: the positions array in `TextRun` when compact is a simple array with advance values per glyph, otherwise it is an array of x/y positions.  The advance is then calculated by substracting the next glyph's x position minus the current glyph's x position.

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1236#issuecomment-1915247197


More information about the openjfx-dev mailing list