# HG changeset patch # User psadhukhan # Date 1466162558 -19800 # Node ID df99c6e834bc74f1fd10338260a968fa61cf9444 # Parent 21bfc4452441ea3a542af4ca79cbc54048bec0eb 6966350: Empty pages when printing on Lexmark E352dn PS3 with "1200 IQ" setting Reviewed-by: prr, jdv diff -r 21bfc4452441 -r df99c6e834bc jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp --- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp Wed Jun 15 21:43:39 2016 +0200 +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp Fri Jun 17 16:52:38 2016 +0530 @@ -1000,8 +1000,19 @@ } } else { int xRes = devmode->dmPrintQuality; - int yRes = (devmode->dmFields & DM_YRESOLUTION) ? - devmode->dmYResolution : devmode->dmPrintQuality; + + /* For some printers, printer quality can specify 1200IQ + * In this case, dmPrintQuality comes out 600 and + * dmYResolution comes out 2, similarly for 2400IQ + * dmPrintQuality comes out 600 and dmYResolution comes out 4 + * which is not a valid resolution + * so for IQ setting, we modify y-resolution only when it is + * greater than 10. + */ + int yRes = (devmode->dmFields & DM_YRESOLUTION) && + (devmode->dmYResolution > 10) ? + devmode->dmYResolution : devmode->dmPrintQuality; + env->CallVoidMethod(printCtrl, AwtPrintControl::setResID, xRes, yRes); } diff -r 21bfc4452441 -r df99c6e834bc jdk/test/java/awt/print/PrinterJob/PrintTestLexmarkIQ.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/print/PrinterJob/PrintTestLexmarkIQ.java Fri Jun 17 16:52:38 2016 +0530 @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 6966350 + * @summary Verifies if Empty pages are printed on Lexmark E352dn PS3 + * with "1200 IQ" setting + * @run main/manual PrintTestLexmarkIQ + */ +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; +import java.awt.print.PageFormat; +import java.awt.print.Paper; +import java.awt.print.Printable; +import static java.awt.print.Printable.NO_SUCH_PAGE; +import static java.awt.print.Printable.PAGE_EXISTS; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +public class PrintTestLexmarkIQ implements Printable { + + private static Thread mainThread; + private static boolean testPassed; + private static boolean testGeneratedInterrupt; + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + doTest(PrintTestLexmarkIQ::printTest); + }); + mainThread = Thread.currentThread(); + try { + Thread.sleep(90000); + } catch (InterruptedException e) { + if (!testPassed && testGeneratedInterrupt) { + throw new RuntimeException(" Empty pages printed "); + } + } + if (!testGeneratedInterrupt) { + throw new RuntimeException("user has not executed the test"); + } + } + + private static void printTest() { + PrinterJob pj = PrinterJob.getPrinterJob(); + + PageFormat pf = pj.defaultPage(); + Paper paper = new Paper(); + double margin = 36; // half inch + paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, + paper.getHeight() - margin * 2); + pf.setPaper(paper); + + pj.setPrintable(new PrintTestLexmarkIQ(), pf); + if (pj.printDialog()) { + try { + pj.print(); + } catch (PrinterException e) { + System.out.println(e); + } + } + } + + public static synchronized void pass() { + testPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + } + + public static synchronized void fail() { + testPassed = false; + testGeneratedInterrupt = true; + mainThread.interrupt(); + } + + private static void doTest(Runnable action) { + String description + = " Install Lexmark E352dn PS3 or Dell 5310n printer.\n" + + " A print dialog will be shown.\n" + + " Select Normal 1200IQ setting in Properties->PrintQuality in Dell 5310n \n" + + " or for Lexmark E352dn printer, select Normal 1200IQ setting in\n " + + " Properties -> Advanced -> Graphic -> Print Quality.\n" + + " Press Print. Verify the print output.\n " + + " If empty page is printed, press Fail else press Pass."; + + final JDialog dialog = new JDialog(); + dialog.setTitle("1200IQTest"); + JTextArea textArea = new JTextArea(description); + textArea.setEditable(false); + final JButton testButton = new JButton("Start Test"); + final JButton passButton = new JButton("PASS"); + passButton.setEnabled(false); + passButton.addActionListener((e) -> { + dialog.dispose(); + pass(); + }); + final JButton failButton = new JButton("FAIL"); + failButton.setEnabled(false); + failButton.addActionListener((e) -> { + dialog.dispose(); + fail(); + }); + testButton.addActionListener((e) -> { + testButton.setEnabled(false); + action.run(); + passButton.setEnabled(true); + failButton.setEnabled(true); + }); + JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(textArea, BorderLayout.CENTER); + JPanel buttonPanel = new JPanel(new FlowLayout()); + buttonPanel.add(testButton); + buttonPanel.add(passButton); + buttonPanel.add(failButton); + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + dialog.add(mainPanel); + dialog.pack(); + dialog.setVisible(true); + } + + public int print(Graphics g, PageFormat pf, int pi) + throws PrinterException { + if (pi != 0) { + return NO_SUCH_PAGE; + } + Graphics2D g2 = (Graphics2D) g; + g2.setFont(new Font("Serif", Font.PLAIN, 36)); + g2.setPaint(Color.black); + g2.drawString("Java Source and Support", 100, 100); + Rectangle2D outline = new Rectangle2D.Double(pf.getImageableX(), pf + .getImageableY(), pf.getImageableWidth(), pf + .getImageableHeight()); + g2.draw(outline); + return PAGE_EXISTS; + } + +}