[OpenJDK 2D-Dev] [9] RFR JDK-6842011: StackOverflowError printing landscape with scale and transform

Phil Race philip.race at oracle.com
Wed May 18 22:33:16 UTC 2016


It sounds like scalex & scaley are 0 and are then used in calculations which
results in the NaN ? So why are they zero to begin with ?

-phil.

On 5/16/2016 3:32 AM, prasanta sadhukhan wrote:
> Hi All,
>
> Please review a fix for jdk9 whereby it is seen that
> A StackOverflowError occurs when printing in landscape orientation 
> with a scaled and transformed graphics object.
>  at sun.print.PSPrinterJob.prepDrawing(PSPrinterJob.java:1610)
>     at sun.print.PSPrinterJob.beginPath(PSPrinterJob.java:1319)
>     at sun.print.PSPrinterJob.convertToPSPath(PSPrinterJob.java:1793)
>     at sun.print.PSPrinterJob$GState.emitPSClip(PSPrinterJob.java:1718)
>     at sun.print.PSPrinterJob.prepDrawing(PSPrinterJob.java:1625)
>
>  at sun.print.PSPrinterJob.beginPath(PSPrinterJob.java:1319)
>     at sun.print.PSPrinterJob.convertToPSPath(PSPrinterJob.java:1793)
>     at sun.print.PSPrinterJob$GState.emitPSClip(PSPrinterJob.java:1718)
>     at sun.print.PSPrinterJob.prepDrawing(PSPrinterJob.java:1625)
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-6842011
> webrev: http://cr.openjdk.java.net/~psadhukhan/6842011/webrev.00/
>
> StackOverflowError is occuring because the scalex, scaley for 
> landscape orientation was 0 so when the testcase tries to scale with 
> these scale factors
> using g2d.scale( 1 / scalex, 1 / scaley );
> it creates a AffineTransform of NaN transformation. Now, In linux, 
> when the PS print drawing information is being prepared, it calls 
> prepDrawing() where it checks
> getGState().mTransform.equals(mLastTransform) and since NaN values 
> cannot be compared it results in "false", causing erroneous "grestore" 
> postscript command to be issued and remove a GState from the stack so 
> isOuterGState() becomes true which causes emitPSClip() to be called 
> which calls
> prepDrawing() again via convertToPSPath() , beginPath() and since 
> isOuterState() returns true due to transform not being equal it again 
> calls emitPSClip() causing a recursion.
>
> The fix was to check if transform is NaN and do not fill the 
> devicePath if it is so, so that erroeous drawing is not done.
> So, it will print out a blank page.
>
> In windows, the testcase prints out a blank page. In mac, the testcase 
> prints a 2x2 rectangle.
>
> Regards
> Prasanta





More information about the 2d-dev mailing list