6966350: Empty pages when printing on Lexmark E352dn PS3 with "1200 IQ" setting
authorpsadhukhan
Fri, 17 Jun 2016 16:52:38 +0530
changeset 39520 df99c6e834bc
parent 39519 21bfc4452441
child 39521 c169f36c9a4b
6966350: Empty pages when printing on Lexmark E352dn PS3 with "1200 IQ" setting Reviewed-by: prr, jdv
jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp
jdk/test/java/awt/print/PrinterJob/PrintTestLexmarkIQ.java
--- 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);
             }
--- /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;
+    }
+
+}