29package com.jogamp.opengl.test.junit.jogl.tile;
31import java.awt.Component;
32import java.awt.Container;
33import java.awt.Rectangle;
34import java.awt.Window;
35import java.awt.print.PageFormat;
36import java.awt.print.Paper;
37import java.awt.print.Printable;
38import java.awt.print.PrinterException;
39import java.awt.print.PrinterJob;
40import java.io.FileNotFoundException;
41import java.io.FileOutputStream;
42import java.util.Locale;
44import com.jogamp.opengl.GLAutoDrawable;
45import javax.print.StreamPrintService;
46import javax.print.StreamPrintServiceFactory;
47import javax.print.attribute.HashPrintRequestAttributeSet;
48import javax.print.attribute.PrintRequestAttributeSet;
49import javax.print.attribute.standard.MediaSizeName;
51import jogamp.nativewindow.awt.AWTMisc;
53import org.junit.Assert;
55import com.jogamp.common.os.Platform;
56import com.jogamp.common.util.awt.AWTEDTExecutor;
57import com.jogamp.common.util.locks.LockFactory;
58import com.jogamp.common.util.locks.RecursiveLock;
59import com.jogamp.nativewindow.awt.AWTPrintLifecycle;
60import com.jogamp.opengl.test.junit.util.UITestCase;
61import com.jogamp.opengl.util.TileRenderer;
70 private final RecursiveLock lock = LockFactory.createRecursiveLock();
71 private int printCount = 0;
90 final int offscrnImageType,
final int dpi,
final int numSamples,
final int tileWidth,
final int tileHeight,
final boolean resizeWithinPrintTest) {
93 final PrintRequestAttributeSet aset =
new HashPrintRequestAttributeSet();
94 aset.add(MediaSizeName.ISO_A1);
95 aset.add(MediaSizeName.ISO_A2);
96 aset.add(MediaSizeName.ISO_A3);
97 aset.add(MediaSizeName.ISO_A4);
101 final String psMimeType =
"application/postscript";
102 final String pdfMimeType =
"application/pdf";
103 final PrinterJob pj = PrinterJob.getPrinterJob();
105 StreamPrintServiceFactory[] factories = PrinterJob.lookupStreamPrintServices(pdfMimeType);
106 if (factories.length > 0) {
107 final String fname = getPrintFilename(offscrnImageType, dpi, numSamples, tileWidth, tileHeight,
"pdf", resizeWithinPrintTest);
108 System.err.println(
"doPrint: dpi "+dpi+
", "+fname);
109 FileOutputStream outstream;
111 outstream =
new FileOutputStream(fname);
112 return doPrintAutoImpl(cont, pj, factories[0].getPrintService(outstream), pOrientation, paper,
113 offscrnImageType, dpi, numSamples, tileWidth, tileHeight, resizeWithinPrintTest);
114 }
catch (
final FileNotFoundException e) {
115 Assert.assertNull(
"Unexpected exception", e);
118 System.err.println(
"No PDF");
120 factories = PrinterJob.lookupStreamPrintServices(psMimeType);
121 if (factories.length > 0) {
122 final String fname = getPrintFilename(offscrnImageType, dpi, numSamples, tileWidth, tileHeight,
"ps", resizeWithinPrintTest);
123 System.err.println(
"doPrint: dpi "+dpi+
", "+fname);
124 FileOutputStream outstream;
126 outstream =
new FileOutputStream(fname);
127 return doPrintAutoImpl(cont, pj, factories[0].getPrintService(outstream), pOrientation, paper, offscrnImageType, dpi, numSamples, tileWidth, tileHeight, resizeWithinPrintTest);
128 }
catch (
final FileNotFoundException e) {
129 Assert.assertNull(
"Unexpected exception", e);
132 System.err.println(
"No PS");
138 private String getPrintFilename(
final int offscrnImageType,
final int dpi,
final int numSamples,
final int tileWidth,
final int tileHeight,
final String suffix,
final boolean resizeWithinPrintTest) {
139 final int maxSimpleTestNameLen =
getMaxTestNameLen()+getClass().getSimpleName().length()+1;
140 final String simpleTestName = getSimpleTestName(
".");
141 final String onoffscrn = 0 > offscrnImageType ?
"on_screen" :
"offscrn_"+offscrnImageType;
142 final String aa = 0 <= numSamples ?
"aa"+numSamples :
"aaN";
143 return String.format((Locale)
null,
"%-"+maxSimpleTestNameLen+
"s-n%04d-%s-dpi%03d-%s-tSz%04dx%04d-resize%d.%s",
144 simpleTestName, printCount, onoffscrn, dpi, aa, tileWidth, tileHeight, resizeWithinPrintTest?1:0, suffix).replace(
' ',
'_');
146 private PrintableBase doPrintAutoImpl(
final Container cont,
final PrinterJob job,
147 final StreamPrintService ps,
final int pOrientation,
final Paper paper,
148 final int offscrnImageType,
final int dpi,
final int numSamples,
final int tileWidth,
final int tileHeight,
final boolean resizeWithinPrintTest) {
150 final PageFormat pageFormat = job.defaultPage();
151 if(
null != paper ) {
156 pageFormat.setPaper(paper);
158 pageFormat.setOrientation(pOrientation);
159 job.setPrintService(ps);
160 final PrintableBase printable;
161 if( 0 < offscrnImageType ) {
162 printable =
new OffscreenPrintable(job, cont, dpi, numSamples, tileWidth, tileHeight, offscrnImageType, getPrintFilename(offscrnImageType, dpi, numSamples, tileWidth, tileHeight,
"png", resizeWithinPrintTest));
164 printable =
new OnscreenPrintable(job, cont, dpi, numSamples, tileWidth, tileHeight);
166 printable.job.setPrintable(printable, pageFormat);
167 doPrintImpl(printable, resizeWithinPrintTest);
169 }
catch (
final PrinterException pe) {
170 pe.printStackTrace();
186 printable.
job.setPrintable(printable);
187 final boolean ok = printable.
job.printDialog();
189 doPrintImpl(printable,
false);
197 private final AWTMisc.ComponentAction resizePlusAction =
new AWTMisc.ComponentAction() {
199 public void run(
final Component c) {
200 final Rectangle r = c.getBounds();
205 private final AWTMisc.ComponentAction resizeMinusAction =
new AWTMisc.ComponentAction() {
207 public void run(
final Component c) {
208 final Rectangle r = c.getBounds();
214 private void doPrintImpl(
final PrintableBase printable,
final boolean resizeWithinPrintTest) {
215 final double scaleGLMatXY = 72.0 / printable.
dpi;
216 System.err.println(
"PRINTable: "+printable.getClass().getSimpleName());
217 System.err.println(
"PRINT DPI: "+printable.dpi+
", AA "+printable.numSamples+
", scaleGL "+scaleGLMatXY);
218 final AWTPrintLifecycle.Context ctx =
219 AWTPrintLifecycle.Context.setupPrint(printable.cont, scaleGLMatXY, scaleGLMatXY,
220 printable.numSamples, printable.tileWidth, printable.tileHeight);
221 System.err.println(
"PRINT AWTPrintLifecycle.setup.count "+ctx.getCount());
222 final int w = printable.cont.getWidth();
223 final int h = printable.cont.getHeight();
224 final long t0 = Platform.currentTimeMillis();
226 AWTEDTExecutor.singleton.invoke(
true,
new Runnable() {
229 if( resizeWithinPrintTest ) {
230 System.err.println(
"PRINT resizeWithinPrint size+ "+(w+64)+
"x"+(h+64));
231 AWTMisc.performAction(printable.cont,
GLAutoDrawable.class, resizePlusAction);
232 printable.cont.validate();
233 if( printable.cont instanceof Window ) {
234 ((Window)printable.cont).pack();
237 printable.job.print();
238 }
catch (
final PrinterException ex) {
239 ex.printStackTrace();
244 final long td = Platform.currentTimeMillis() - t0;
245 System.err.println(
"PRINT Duration "+td+
" ms");
246 if( resizeWithinPrintTest ) {
247 AWTEDTExecutor.singleton.invoke(
true,
new Runnable() {
249 System.err.println(
"PRINT resizeWithinPrint repaint");
250 printable.cont.repaint();
251 System.err.println(
"PRINT resizeWithinPrint size- "+w+
"x"+h);
252 AWTMisc.performAction(printable.cont, GLAutoDrawable.class, resizeMinusAction);
253 printable.cont.validate();
254 if( printable.cont instanceof Window ) {
255 ((Window)printable.cont).pack();
259 System.err.println(
"PRINT AWTPrintLifecycle.release.count "+ctx.getCount());
Base Printable implementation class.
void waitUntilIdle()
Wait for idle .
Base unit test class implementing issuing PrinterJob#print() on a Printable implementation,...
PrintableBase doPrintManual(final Container cont, final int dpi, final int numSamples, final int tileWidth, final int tileHeight)
PrintableBase doPrintAuto(final Container cont, final int pOrientation, final Paper paper, final int offscrnImageType, final int dpi, final int numSamples, final int tileWidth, final int tileHeight, final boolean resizeWithinPrintTest)
void waitUntilPrintJobsIdle(final PrintableBase p)
Wait for idle .
A higher-level abstraction than GLDrawable which supplies an event based mechanism (GLEventListener) ...