/* * Copyright (c) 2006, 2011, 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 4521945 7006865 * @summary Test printing images of different types. * @author prr * @run main/manual=yesno/timeout=900 ImageTypes */ import java.io.*; import static java.awt.Color.*; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import java.awt.print.*; import java.awt.image.*; import static java.awt.image.BufferedImage.*; import javax.print.*; import javax.print.attribute.*; import javax.print.attribute.standard.*; public class ImageTypes extends Frame implements ActionListener { private ImageCanvas c; public static void main(String args[]) { ImageTypes f = new ImageTypes(); f.show(); } public ImageTypes () { super("Image Types Printing Test"); c = new ImageCanvas(); add("Center", c); Button printThisButton = new Button("Print"); printThisButton.addActionListener(this); Panel p = new Panel(); p.add(printThisButton); add("South", p); add("North", getInstructions()); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pack(); } private TextArea getInstructions() { TextArea ta = new TextArea(10, 60); ta.setFont(new Font("Dialog", Font.PLAIN, 11)); ta.setText ("This is a manual test as it requires that you compare "+ "the on-screen rendering with the printed output.\n"+ "Select the 'Print' button to print out the test.\n"+ "For each image compare the printed one to the on-screen one.\n"+ "The test PASSES if the onscreen and printed rendering match."); return ta; } public void actionPerformed(ActionEvent e) { PrinterJob pj = PrinterJob.getPrinterJob(); PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); if (pj != null && pj.printDialog(attrs)) { pj.setPrintable(c); try { pj.print(attrs); } catch (PrinterException pe) { pe.printStackTrace(); throw new RuntimeException("Exception whilst printing."); } finally { System.out.println("PRINT RETURNED OK."); } } } } class ImageCanvas extends Component implements Printable { IndexColorModel icm2 = null; IndexColorModel icm4 = null; BufferedImage opaqueImg = null; BufferedImage transImg = null; int sw=99, sh=99; void paintImage(BufferedImage bi, Color c1, Color c2) { GradientPaint tp= new GradientPaint(0.0f, 0.0f, c1, 10f, 8f, c2, true); Graphics2D g2d = (Graphics2D)bi.getGraphics(); g2d.setPaint(tp); g2d.fillRect(0, 0, sw, sh); g2d.setColor(gray); int cnt=0; Font font = new Font("Serif", Font.PLAIN, 11); g2d.setFont(font); FontMetrics fm = g2d.getFontMetrics(); for (int y=12;y<sh;y+=12) { int x = 0; while (x < sw) { String s = (new Integer(++cnt)).toString(); g2d.drawString(s, x, y); x+= fm.stringWidth(s); } } } ImageCanvas() { opaqueImg = new BufferedImage(sw, sh, TYPE_INT_RGB); Color o1 = new Color(0, 0, 0); Color o2 = new Color(255, 255, 255); paintImage(opaqueImg, o1, o2); transImg = new BufferedImage(sw, sh, TYPE_INT_ARGB); Color t1 = new Color(255, 255, 255, 220); Color t2 = new Color(255, 200, 0, 220); paintImage(transImg, t1, t2); /* greyscale 2bpp */ byte[] arr2bpp = {(byte)0, (byte)0x55, (byte)0xaa, (byte)0xff}; icm2 = new IndexColorModel(2, 4, arr2bpp, arr2bpp, arr2bpp); /* color 4bpp */ int[] cmap = new int[16]; cmap[0] = black.getRGB(); cmap[1] = white.getRGB(); cmap[2] = gray.getRGB(); cmap[3] = lightGray.getRGB(); cmap[4] = red.getRGB(); cmap[5] = green.getRGB(); cmap[6] = blue.getRGB(); cmap[7] = yellow.getRGB(); cmap[8] = cyan.getRGB(); cmap[9] = magenta.getRGB(); cmap[10] = orange.getRGB(); cmap[11] = pink.getRGB(); cmap[12] = darkGray.getRGB(); cmap[13] = 192 << 16 ; // dark red. cmap[14] = 192 << 8; // dark green cmap[15] = 192; // dark blue icm4 = new IndexColorModel(4, 16, cmap, 0, false, -1, DataBuffer.TYPE_BYTE); } public int print(Graphics g, PageFormat pgFmt, int pgIndex) { if (pgIndex > 0) { return Printable.NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D)g; g2d.translate(pgFmt.getImageableX(), pgFmt.getImageableY()); paint(g2d); return Printable.PAGE_EXISTS; } private void drawImage(Graphics g, int biType, IndexColorModel icm) { BufferedImage bi; if (icm != null) { bi = new BufferedImage(sw, sh, biType, icm); } else { bi = new BufferedImage(sw, sh, biType); } Graphics big = bi.getGraphics(); if (bi.getColorModel().getPixelSize() <=2) { big.drawImage(opaqueImg, 0, 0, null); } else { big.drawImage(transImg, 0, 0, null); } g.drawImage(bi, 0, 0, null); } public void paint(Graphics g) { int incX = sw+10, incY = sh+10; g.translate(10, 10); drawImage(g, TYPE_INT_RGB, null); g.translate(incX, 0); drawImage(g, TYPE_INT_BGR, null); g.translate(incX, 0); drawImage(g, TYPE_INT_ARGB, null); g.translate(incX, 0); drawImage(g, TYPE_INT_ARGB_PRE, null); g.translate(-3*incX, incY); drawImage(g, TYPE_3BYTE_BGR, null); g.translate(incX, 0); drawImage(g, TYPE_4BYTE_ABGR, null); g.translate(incX, 0); drawImage(g, TYPE_4BYTE_ABGR_PRE, null); g.translate(incX, 0); drawImage(g, TYPE_USHORT_555_RGB, null); g.translate(-3*incX, incY); drawImage(g, TYPE_USHORT_555_RGB, null); g.translate(incX, 0); drawImage(g, TYPE_USHORT_GRAY, null); g.translate(incX, 0); drawImage(g, TYPE_BYTE_GRAY, null); g.translate(incX, 0); drawImage(g, TYPE_BYTE_INDEXED, null); g.translate(-3*incX, incY); drawImage(g, TYPE_BYTE_BINARY, null); g.translate(incX, 0); drawImage(g, TYPE_BYTE_BINARY, icm2); g.translate(incX, 0); drawImage(g, TYPE_BYTE_BINARY, icm4); g.translate(incX, 0); drawImage(g, TYPE_BYTE_INDEXED, icm2); g.translate(-3*incX, incY); drawImage(g, TYPE_BYTE_INDEXED, icm4); g.translate(incX, 0); } /* Size is chosen to match default imageable width of a NA letter * page. This means there will be clipping, what is clipped will * depend on PageFormat orientation. */ public Dimension getPreferredSize() { return new Dimension(468, 600); } }