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