On Fri, 9 Feb 2024 12:54:17 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:
>> There are a number of tickets open related to text rendering: >> >> https://bugs.openjdk.org/browse/JDK-8314215 >> >> https://bugs.openjdk.org/browse/JDK-8145496 >> >> https://bugs.openjdk.org/browse/JDK-8129014 >> >> They have in common that wrapped text is taking the trailing spaces on each >> wrapped line into account when calculating where to wrap. This looks okay >> for text that is left aligned (as the spaces will be trailing the lines and >> generally aren't a problem, but looks weird with CENTER and RIGHT >> alignments. Even with LEFT alignment there are artifacts of this behavior, >> where a line like `AAA BBB CCC` (note the **double** spaces) gets split up >> into `AAA `, `BBB ` and `CCC`, but if space reduces further, it will wrap >> **too** early because the space is taken into account (ie. `AAA` may still >> have fit just fine, but `AAA ` doesn't, so the engine wraps it to `AA` + `A >> ` or something). >> >> The fix for this is two fold; first the individual lines of text should not >> include any trailing spaces into their widths; second, the code that is >> taking the trailing space into account when wrapping should ignore all >> trailing spaces (currently it is ignoring all but one trailing space). With >> these two fixes, the layout in LEFT/CENTER/RIGHT alignments all look great, >> and there is no more early wrapping due to a space being taking into account >> while the actual text still would have fit (this is annoying in tight >> layouts, where a line can be wrapped early even though it looks like it >> would have fit). >> >> If it were that simple, we'd be done, but there may be another issue here >> that needs solving: wrapped aligned TextArea's. >> >> TextArea don't directly support text alignment (via a setTextAlignment >> method like Label) but you can change it via CSS. >> >> For Left alignment + wrapping, TextArea will ignore any spaces typed before >> a line that was wrapped. In other words, you can type spaces as much as you >> want, and they won't show up and the cursor won't move. The spaces are all >> getting appended to the previous line. When you cursor through these >> spaces, the cursor can be rendered out of the control's bounds. To >> illustrate, if you have the text `AAA BBB CCC`, and the text >> gets wrapped to `AAA`, `BBB`, `CCC`, typing spaces before `BBB` will not >> show up. If you cursor back, the cursor may be outside the control bounds >> because so many spaces are trailing `AAA`. >> >> The above behavior has NOT changed, is pretty standard for wrapped text >> controls,... > > John Hendrikx has updated the pull request incrementally with two additional > commits since the last revision: > > - Add some clarifying documentation > - Do not collapse trailing spaces of last line (where no soft wrap occurs) The test is failing on macOS 14.3: 3a93cdf4f7 HEAD@{0}: checkout: moving from review.rtl_hittest_issue to review.wrapped-aligned-text-rendering TextLayoutTest > caseTest(Case) > [7] SOFT_WRAP_WITH_COMPLEX_TEXT FAILED org.opentest4j.AssertionFailedError: left aligned: line 0 for Parameters[text=The quick brown लोमड़ी jumps over the lazy कुत्ता, font=Font[name=Monaco, family=Monaco, style=Regular, size=12.0], wrapWidth=200.0, lineWidths=[189.89648, 122.583984], ascent=12.0, descent=4.001953] ==> expected: <RectBounds { minX:0.0, minY:-12.0, maxX:189.89648, maxY:4.001953} (w:189.89648, h:16.001953)> but was: <RectBounds { minX:0.0, minY:-12.0, maxX:187.00978, maxY:4.001953} (w:187.00978, h:16.001953)> at app//org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55) at app//org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62) at app//org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182) at app//org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1152) at app//test.com.sun.javafx.text.TextLayoutTest.caseTest(TextLayoutTest.java:468) TextLayoutTest > caseTest(Case) > [8] SOFT_WRAP_WITH_COMPLEX_TEXT_AND_EXTRA_TRAILING_SPACE FAILED org.opentest4j.AssertionFailedError: left aligned: line 0 for Parameters[text=The quick brown लोमड़ी jumps over the lazy कुत्ता, font=Font[name=Monaco, family=Monaco, style=Regular, size=12.0], wrapWidth=200.0, lineWidths=[189.89648, 122.583984], ascent=12.0, descent=4.001953] ==> expected: <RectBounds { minX:0.0, minY:-12.0, maxX:189.89648, maxY:4.001953} (w:189.89648, h:16.001953)> but was: <RectBounds { minX:0.0, minY:-12.0, maxX:187.00978, maxY:4.001953} (w:187.00978, h:16.001953)> at app//org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55) at app//org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62) at app//org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182) at app//org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1152) at app//test.com.sun.javafx.text.TextLayoutTest.caseTest(TextLayoutTest.java:468) TextLayoutTest > fixedComplexTestsToEnsureNoFurtherRegressions() FAILED org.opentest4j.AssertionFailedError: runCount ==> expected: <2> but was: <1> at app//org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55) at app//org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62) at app//org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:150) at app//org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:559) at app//test.com.sun.javafx.text.TextLayoutTest.verifyLayout(TextLayoutTest.java:106) at app//test.com.sun.javafx.text.TextLayoutTest.fixedComplexTestsToEnsureNoFurtherRegressions(TextLayoutTest.java:192) ------------- PR Comment: https://git.openjdk.org/jfx/pull/1236#issuecomment-1936701066