[OpenJDK 2D-Dev] [9] RFR JDK-6842011: StackOverflowError printing landscape with scale and transform
prasanta sadhukhan
prasanta.sadhukhan at oracle.com
Fri May 20 11:27:28 UTC 2016
Hi Phil,
When we call print() it calls RasterPrinterJob#printPage() which sets
peekGraphics.transform([4.16,0,0][0,4.16,0]) as obtained from
xscale=4.16 [getXRes()=300 / 72.0] ,yscale=4.16
It calls SunGraphics2D.transform which was identity transform [1.0, 0.0,
0.0] [0.0, 1.0, 0.0] calls transform.concatenate(peekgraphicsTx) and
stores as ([4.16,0,0][0,4.16,0])
Then RasterPrinterJob#printPage() again calls peekGraphics.transform(new
AffineTransform(page.getMatrix()));
where page.getMatrix() returns 0.0, -1.0, 1.0, 0.0, 0.0, 841.88 and
peekGraphics transform now becomes [0.0, 1.0, 0.0] [-1.0, 0.0, 841.88]
which calls SunGraphics2D#transform() where it again does
transform.concatenate(peekgraphicsTx)
so the transform becomes [m00=0, m01=4.16, m02=0][m10=-4.16, m11=0,
m12=3507.873]
Now scaleX obtains value from g2d.getTransform().getScaleX() which
returns SunGraphics2D stored transform.m00 which is 0 and scaleY is
m11=0 so scaleX,scaleY becomes 0.
Regards
Prasanta
On 5/19/2016 4:03 AM, Phil Race wrote:
> 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