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

Daniel Gredler duke at openjdk.org
Fri Sep 13 10:13:42 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.

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

Commit messages:
 - Fix TextLayout.getOutline(AffineTransform)

Changes: https://git.openjdk.org/jdk/pull/20993/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=20993&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8339974
  Stats: 347 lines in 4 files changed: 341 ins; 4 del; 2 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