RFR: 8339974: Graphics2D.drawString doesn't always work with Font derived from AffineTransform [v4]

Daniel Gredler duke at openjdk.org
Mon Oct 7 21:29:55 UTC 2024


> There is a bug in `TextLayout.getOutline(AffineTransform)`, where the transformation is applied too early (before the layout path applies its mapping). The most obvious error caused by this bug is that `Graphics2D.drawString(...)` fails to draw the string when using a rotated + scaled `AffineTransform` (see minimal test case in the bug report).
> 
> There are two uses of `TextLayout.getOutline(AffineTransform)`: the first one, triggered via a simple `Graphics2D.drawString(...)` was the one I ran into; the second one requires the use of a transformed font with a `PSPrinterJob`. Both are broken. This PR includes two test classes verifying that both scenarios were broken before the fix and are working after the fix.
> 
> Two points which might require some discussion:
> 1. I've changed the signature of method `TextLine.getOutline(AffineTransform)`, to just `TextLine.getOutline()`; I'm assuming this is OK since `TextLine` is a package-private class.
> 2. I've added a fast path in `TextLayout.getOutline(AffineTransform)` to transform the shape in place if it is a `GeneralPath` (it should usually be, and avoids an extra `Shape` copy vs. the current code, which makes no copy). A bit more complex, but efficient.

Daniel Gredler has updated the pull request incrementally with one additional commit since the last revision:

  Save image to disk if test fails

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/20993/files
  - new: https://git.openjdk.org/jdk/pull/20993/files/3a2613fd..7b9151b1

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=20993&range=03
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=20993&range=02-03

  Stats: 23 lines in 1 file changed: 19 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/20993.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/20993/head:pull/20993

PR: https://git.openjdk.org/jdk/pull/20993


More information about the client-libs-dev mailing list