<AWT Dev> RFR: 8265761: Font with missed font family name is not properly printed on Windows

Phil Race prr at openjdk.java.net
Mon Apr 26 22:01:35 UTC 2021

On Thu, 22 Apr 2021 15:13:45 GMT, Alexander Scherbatiy <alexsch at openjdk.org> wrote:

> PDFBox 1.8 uses [Graphics2D.drawGlyphVector()](https://github.com/apache/pdfbox/blob/41ae21bd4c3f304373d3b05f63af5325df248019/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDSimpleFont.java#L352)  method with scaled glyphs to print a text and PDF 2.0 uses [Graphics2D.fill()](https://github.com/apache/pdfbox/blob/4f14dee47ff821e44d9e2ff11532959d95e94d5b/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java#L512) to print glyphs path. Both methods finally calls WPathGraphics.convertToWPath(...) in jdk on Windows which call GDI FillPath.
> Using a custom PageDrawer to draw a text in PDFBox with Graphics2D.drawString() method reveals the fact that some pdf documents which are properly printed by PDFBox 1.8 and PDF 2.0 on Linux and Windows have issues with printing them on Windows.
> The reason is that such docs use fonts which have empty font family name.
> The awt_PrintJob.jFontToWFontA(...) method is not able to select the required font when the passed font family name is empty.
> https://github.com/openjdk/jdk/blob/7c37c022a1664437bf8d2c8d76ad039521f3ffa7/src/java.desktop/windows/native/libawt/windows/awt_PrintJob.cpp#L2264 
> The proposed solution returns false from WPrinterJob.setFont(...) method when the font family is empty so the text printing falls back to printing a text by GDI FillPath method:
> https://github.com/openjdk/jdk/blob/6d49cc3b655433d00e967fdcec3f3759412cd925/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java#L1157
> To reproduce the issue I created a simple [SampleBowMissedFamilyName.ttf](https://bugs.openjdk.java.net/secure/attachment/94344/SampleBowMissedFamilyName.ttf) font which contains only capital letters "ABCDEF" and saved it with empty font family name.
> Here is a simple [PrintFontSample.java](https://bugs.openjdk.java.net/secure/attachment/94343/PrintFontSample.java) program that helps to reproduce the issue using the SampleBowMissedFamilyName.ttf font.
> The PrintFontSample program draws a text using three methods:
> - Graphics2D.drawString(...)
> - Graphics2D.drawGlyphVector(...)
> - Graphics2D.drawGlyphVector(...) using transformed glyphs 
> Running the program with jdk 16 on Windows (without the fix)
>>  java PrintFontSample SampleBowMissedFamilyName.ttf
> shows that the first and the second lines are not properly printed: [sample-doc-without-fix.pdf](https://bugs.openjdk.java.net/secure/attachment/94345/sample-doc-without-fix.pdf)
> Running the program with the fix properly prints all three lines: [sample-doc-with-fix.pdf](https://bugs.openjdk.java.net/secure/attachment/94349/sample-doc-with-fix.pdf)
> The provided manual test uses the created SampleBowMissedFamilyName.ttf font with empty font family name.

I dumped the font you attached and it has

		Data: 43 6F 70 79 72 69 67 68 74 20  >  Copyright 
		      73 74 65 6C 6C 61 72 73 70 6F  >  stellarspo
		      74 20 32 30 32 31              >  t 2021

Who are stellarspot ? We can't put their copyrighted font into openjdk. If you created this font by editing
someone else's font that is a no-no. You would have to create a font from scratch and assert you own
the font and the design of all glyphs and contribute it under OCA.

The fix itself is probably fine .. I am surprised you get this far with a font with no name


PR: https://git.openjdk.java.net/jdk/pull/3631

More information about the awt-dev mailing list