Hi Alex,
you also might be interested in the issue I'm working on:
https://bugs.openjdk.java.net/browse/JDK-8023990
If you are targeting Linux platform and working with Latin-1
charset primarily this fix may help (I hope I could push it in the
nearest future). FYI the fix is here:
http://cr.openjdk.java.net/%7Ealitvinov/8023990/webrev.00
Regards,
Anton.
P.S. I'm not a 2D developer, so I couldn't take care of your proposal,
but I think it's good.
On 09.01.2014 20:34, Alex Geller wrote:
Hi,
this is not a production code patch but rather a proof of concept.
The patch improves the Postscript produced in calls to
Graphics2D.drawString().
The the current implementation first tries to print strings using one
of the standard Postscript fonts (PSPrinterJob.textOut()) and if that
fails it falls back to drawing glyph vectors.
The patch adds a third method which is to convert the string into
glyphs by means of Font.createGlyphVector() and embed those glyphs in
form of a Postscript "Type 3" font.
The font is updated incrementally which is explicitly allowed by the
Postscript specification.
The incremental update makes the patch also usable for Asian
environments where eager embedding is not a good option because the
fonts are huge.
The file is reduced compared to glyph vector drawing. As an example
consider a "terms an conditions" page that has 17,000 characters using
3 different fonts.
Using the current method the Postscript file is about 8 MB. Using the
new method the file is 164 KB.
However, the motivation for submitting this patch is not the file size
but the printing time. The original file takes 4:45 minutes to print
while the version with the embedded font prints in less than 10
seconds on the same printer.
I suspect the slowness in the fact that the glyph vectors are not
cached while the Type 3 fonts are. I posted the results of some
related experiments with the Postscript "ucache" command on the OTN
forum (see https://community.oracle.com/thread/2617145).
Based on that I can post a patch for speeding up
Graphics2D.drawGlyphVector() substantially too if there is interest.
Coming back to the main topic my question is if there are chances that
this gets included. If yes, then I would do (perhaps with some help)
what is necessary to take it from a POC to production code.
I would also be happy if it could be included and activated only by a
system property or a rendering hint.
The issue is quite important to us and time doesn't seem to heal this.
Even printers in the 10,000$ class can take minutes to print a few
pages using the current method.
Attachments:
- openjdk.patch: A patch based on "openjdk_7_b147_jun_11"
- PSTest.java: A test program demonstrating the feature
- out.ps.zip: A zipped Postscript file produced by the test program
"PSTest.java"
Thanks,
Alex