[OpenJDK 2D-Dev] [PATCH] JDK-4627340 : RFE: A way to improve text printing performance for postscript devices

Alex Geller ag at 4js.com
Fri Jan 10 13:46:22 UTC 2014


Hi Anton,
yes I am aware of your analysis of the issue. Working around the problem 
by using printer fonts was one of the first things I suggested. When it 
turned out that it wasn't working anymore  I posted a bug for it at 
Oracle (9008662) that hasn't appeared yet. Later I found your 
description and based on that also found a workaround (By setting the 
system property "sun.awt.fontconfig" to point to a pre 6u18 
"fontconfig.properties" file (The workaround is described in more detail 
in the second paragraph of my previously mentioned post to the OTN 
(https://community.oracle.com/thread/2617145)).

 >P.S. I'm not a 2D developer, so I couldn't take care of your proposal, 
but I think it's good.
Thanks a lot.
Regards,
Alex
On 1/10/2014 12:49 PM, anton nashatyrev wrote:
> 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
>>
>>




More information about the 2d-dev mailing list