Hi Prasanta,

 

I tried to run the test but it looks like you are not creating object for 
proper class in test case :

88         pj.setPrintable(new PrintableDemo(), pf);

 

 

I think it should be test class name : 

88         pj.setPrintable(new PrintTestLexmarkIQ(), pf);

 

After we change it to test class name it is working fine.

 

In the description of test JTextArea, I found Print quality setting under 
Properties -> Advanced -> Graphic -> Print Quality. Please verify the same.

Also please increase timeout for test case as I was looking for Print Quality 
setting and it came out.

In test case jtreg multiline comment are not indented properly.

 

Regarding code change, if we can be sure that in future image quality setting 
will not increase more than 6000IQ then changes are fine. Also in comments 
related to code change we can make it multiline comment instead of multiple 
single line comments.

 

Thanks,

Jay

 

 

From: Philip Race 
Sent: Thursday, June 16, 2016 5:05 AM
To: prasanta sadhukhan
Cc: 2d-dev@openjdk.java.net
Subject: Re: [OpenJDK 2D-Dev] [9] RFR: JDK-6966350:Empty pages when printing on 
Lexmark E352dn PS3 with "1200 IQ" setting

 



On 6/14/16, 10:09 PM, prasanta sadhukhan wrote: 

Hi Phil,

 

On 6/15/2016 12:21 AM, Phil Race wrote:

This sound fishy. "2" does not sound like a valid value per the Microsoft spec
but this driver is apparently considering it as something like a multiplier 
although
presumably not to the actual resolution.
 
I see that we are checking that the DM_YRESOLUTION bit of the dmFields member 
is set :
 
1002                 int xRes = devmode->dmPrintQuality;
1003                 int yRes = (devmode->dmFields & DM_YRESOLUTION) ?
1004                   devmode->dmYResolution : devmode->dmPrintQuality;
1005                 
1006                 // For some printers, printer quality can specify 1200IQ
1007                 // In this case, dmPrintQuality comes out 600 and
1008                 // dmYResolution comes out 2 which is not a valid 
resolution
1009                 // so for IQ setting, we specify yresolution same as xRes
1010                 if (yRes < 10) yRes = xRes;


.. so really they ought to return a DPI value as the spec says. I can't
find anything that grants the apparent latitude being taken here.

Note that your change here looks like it may break "quality" - where
the pre-defined values are negative - as you will overwrite "-1" (for example) 
with 10.
Actual breakage depends on whether we bother to read yRes in the case that
xRes is negative but it still should not be over-written.

If "quality" or dmPrintQuality is pre-defined negative value (like DMRES_HIGH, 
DMRES_MEDIUM, DMRES_LOW, DMRES_DRAFT)
then it will be handled in the "if" block
and my modification is in "else" .


Not following that but in any case ...



At a minimum you need to fix the code to look like :-

int yRes = (devmode->dmFields & DM_YRESOLUTION) && (devmode->dmYResolution < 10)
                ? devmode->dmYResolution : devmode->dmPrintQuality;

I guess you mean

devmode->dmYResolution > 10


.. yes



 
 
Anyways, I have updated webrev to accomodate your comment.
HYPERLINK 
"http://cr.openjdk.java.net/%7Epsadhukhan/6966350/webrev.01/"http://cr.openjdk.java.net/~psadhukhan/6966350/webrev.01/


approved since we have a comment explaining the "logic" but still puzzled.

-phil.



 

 
But I find it a little unsatisfactory to have to make this kind of workaround
and wonder what we are missing ... 

I could not find anything but this will help in getting printing to be working 
in those printers. If we find anything in near future, we will update this code 
.

Regards
Prasanta



 

-phil.

On 06/09/2016 04:35 AM, prasanta sadhukhan wrote:

Hi All,

Bug: https://bugs.openjdk.java.net/browse/JDK-6966350

The issue was if we select 1200IQ Normal (default) setting in Lexmark E352dn 
PS3 or Dell 5310n printer, it does not print the output and we get empty pages.

It was because DEVMODE windows structure returns 600 for "dmPrintQuality" and 2 
for "dmYResolution". For 2400IQ, it returns 600 dmPrintQuality and 4 as 
dmYResolution
so awt_printControl.cpp#AwtPrintControl::UpdateAttributes() calls 
WPrinterJob#setResolutionDPI(xres=600, yres=2) and RasterPrinterJob#print() 
gets 0.027 as yscale(=getYRes()/72 and yres = 2)
so devicetransform for normal 1200IQ dpi becomes [8.33, 0.0, -108.0][0.0, 
0.027, -108.0] so WPathGraphics#drawString() gets devPos x= 725.33, y = -105.22.
so nothing gets printed.

I tried finding the significance of 1200IQ setting which just says it enhances 
the images sent to the printer.
>From 
>http://www.smallbusinesscomputing.com/testdrive/article.php/1585581/Lexmark-T420d-Printer-Review-Both-Sides-Now.htm
> (although it's not the same printer)
says "To be fair, the LaserJet offers sharper resolution — 1,200 by 1,200 dpi, 
while the T420d is a 600 by 600 dpi printer with what Lexmark calls "1,200 
Image Quality" dot placement for photos"

I modified the code to set yres to xres value if yres is less than 10 . 
Although it seems to be a workaround, it prints the output.

webrev: HYPERLINK 
"http://cr.openjdk.java.net/%7Epsadhukhan/6966350/webrev.00/"http://cr.openjdk.java.net/~psadhukhan/6966350/webrev.00/

Regards
Prasanta

 

 

Reply via email to