1/* 2 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/** 25 * @test 26 * @bug 4271596 27 * @bug 4460699 28 * @summary Rotated text printing 29 * @author prr 30 * @run main/manual PrintRotatedText 31 */ 32 33/* Text is drawn as spokes of a wheel with both a uniform scale and 34 * a non-uniform scale. 35 * The test is checking whether the implementation properly handles this 36 * and in particular that asking win32 GDI to draw text rotated works 37 * properly. 38 * 39 */ 40import java.awt.*; 41import java.awt.event.*; 42import java.awt.font.*; 43import java.awt.geom.*; 44import java.awt.print.*; 45 46public class PrintRotatedText extends Frame implements ActionListener { 47 static String fontname="Lucida Sans Regular"; // our font 48 private TextCanvas c; 49 50 public static void main(String args[]) { 51 52 PrintRotatedText f = new PrintRotatedText(); 53 f.show(); 54 } 55 56 public PrintRotatedText() { 57 super("JDK 1.2 Text Printing"); 58 59 String []fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); 60 for (int i=0;i<fonts.length;i++) { 61 if (fonts[i].equals("Times New Roman")) { 62 fontname = "Times New Roman"; 63 } 64 } 65 c = new TextCanvas(); 66 add("Center", c); 67 68 Button printButton = new Button("Print"); 69 printButton.addActionListener(this); 70 add("South", printButton); 71 72 addWindowListener(new WindowAdapter() { 73 public void windowClosing(WindowEvent e) { 74 System.exit(0); 75 } 76 }); 77 78 pack(); 79 } 80 81 public void actionPerformed(ActionEvent e) { 82 83 PrinterJob pj = PrinterJob.getPrinterJob(); 84 85 if (pj != null && pj.printDialog()) { 86 87 pj.setPageable(c); 88 try { 89 pj.print(); 90 } catch (PrinterException pe) { 91 } finally { 92 System.err.println("PRINT RETURNED"); 93 } 94 } 95 } 96 97 class TextCanvas extends Panel implements Pageable, Printable { 98 99 public static final int MAXPAGE = 8; 100 // public static final String extra ="\u0391A\u2200B\u2702C\u2778D"; 101 public static final String extra ="\u0394\u03A9ABCD"; 102 public String estr=extra; 103 104 public int getNumberOfPages() { 105 return MAXPAGE; 106 } 107 108 public PageFormat getPageFormat(int pageIndex) { 109 if (pageIndex > MAXPAGE) throw new IndexOutOfBoundsException(); 110 PageFormat pf = new PageFormat(); 111 Paper p = pf.getPaper(); 112 p.setImageableArea(36, 36, p.getWidth()-72, p.getHeight()-72); 113 pf.setPaper(p); 114 115/* 116 if (pageIndex==1) 117 pf.setOrientation(PageFormat.LANDSCAPE); 118 else if (pageIndex==2) 119 pf.setOrientation(PageFormat.REVERSE_LANDSCAPE); 120*/ 121 122 return pf; 123 } 124 125 public Printable getPrintable(int pageIndex) { 126 if (pageIndex > MAXPAGE) throw new IndexOutOfBoundsException(); 127 return this; 128 } 129 130 public int print(Graphics g, PageFormat pgFmt, int pgIndex) { 131System.out.println("****"+pgIndex); 132 double iw = pgFmt.getImageableWidth(); 133 double ih = pgFmt.getImageableHeight(); 134 Graphics2D g2d = (Graphics2D)g; 135 g2d.translate(pgFmt.getImageableX(), pgFmt.getImageableY()); 136 //g2d.drawString("top left of page format",20,20 ); 137 int modulo = pgIndex % 4; 138 int divvy = pgIndex / 4; 139 if (divvy != 0 ) { 140 g2d.setFont(new Font(fontname,Font.PLAIN, 18)); 141 estr = ""; 142 } else { 143 estr = extra; 144 } 145 146 int xs = 1; 147 int ys = 1; 148 149 if (modulo == 1) { 150 xs = -1; 151 } 152 if (modulo == 2) { 153 ys = -1; 154 } 155 if (modulo == 3) { 156 xs = -1; 157 ys = -1; 158 } 159 160 g2d.translate(iw*0.25, ih*0.2); 161 drawTheText((Graphics2D)g2d.create(), xs*1.0,ys* 1.0); 162 g2d.translate(iw*0.25, ih*0.2); 163 drawTheText((Graphics2D)g2d.create(), xs*1.0,ys* 1.5); 164 g2d.translate(-iw*0.2, ih*0.3); 165 drawTheText((Graphics2D)g2d.create(), xs*1.5, ys*1.0); 166 167 return Printable.PAGE_EXISTS; 168 } 169 170 private void drawTheText(Graphics2D g2d, double sx, double sy) { 171 double mat[]= new double[6]; 172 173 g2d.drawOval(-75,-75,150,150); 174 int degrees = 30; 175 for (int i=0;i<360;i=i+degrees) { 176 AffineTransform saveXfm = g2d.getTransform(); 177 g2d.scale(sx, sy); 178 int ttype = g2d.getTransform().getType(); 179 String s = "ANGLE="+i; 180 s +=estr; 181 g2d.drawString(s, 20, 0); 182 FontRenderContext frc = g2d.getFontRenderContext(); 183 Font f = g2d.getFont(); 184 Rectangle2D r2d = f.getStringBounds(s, frc); 185 g2d.drawLine(20, 1, 20+(int)r2d.getWidth(), 1); 186 g2d.scale(1.0/sx, 1.0/sy); 187 g2d.setTransform(saveXfm); 188 189 g2d.rotate(Math.toRadians(degrees)); 190 } 191 } 192 193 public void paint(Graphics g) { 194 g.translate(200,200); 195 g.setFont(new Font("serif", Font.PLAIN, 12)); 196 drawTheText((Graphics2D)g, 1.0, 1.5); 197 } 198 199 public Dimension getPreferredSize() { 200 return new Dimension(400, 400); 201 } 202 } 203 204} 205