From 76048cd784ea6df32f19e97bb228e4ead880ea07 Mon Sep 17 00:00:00 2001
From: Sven Gothel
Date: Sun, 8 Sep 2013 03:02:36 +0200
Subject: Test: Don't resize frame, tweek print-matrix; AWTPrintLifecycle: Add
scale and convenient AWT container traversal context; GLCanvas/GLJPanel
properly handle existing MSAA and req. AA;
- Test: Don't resize frame, tweek print-matrix
- Use scaleComp72 to scale the frame to fit on page,
i.e. global print matrix
- Use scaleGLMatXY = 72.0 / glDPI
to locally scale on the GL drawable as being passed to AWTPrintLifecycle.setup(..)
- Hence frame stays untouched/stable, no need for 'offscreen' print test,
which is removed.
- AWTPrintLifecycle: Add scale and convenient AWT container traversal context
Use a simple decoration for all AWTPrintLifecycle impl. components within a container:
final AWTPrintLifecycle.Context ctx = AWTPrintLifecycle.Context.setupPrint(frame, g2d, scaleGLMatXY, scaleGLMatXY);
try {
} finally {
ctx.releasePrint();
}
- GLCanvas/GLJPanel properly handle existing MSAA and req. AA;
- GLCanvas: Workaround bug where onscreen MSAA cannot switch to offscreen FBO,
i.e. stay 'onscreen'
- GLJPanel: Use new offscreen FBO if MSAA is requested and not yet used.
- GLJPanel.Offscreen.postGL(): always swapBufer(), was missing for !GLSL swapping
Results GLCanvas / GLJPanel:
- Good scaling
- Stable behavior / visibility
- High DPI mode works
---
make/scripts/tests.sh | 4 +-
.../javax/media/opengl/awt/AWTPrintLifecycle.java | 49 +++++++-
.../classes/javax/media/opengl/awt/GLCanvas.java | 85 ++++++++------
.../classes/javax/media/opengl/awt/GLJPanel.java | 121 ++++++++++++++------
.../classes/jogamp/opengl/awt/AWTTilePainter.java | 53 ++++++---
.../classes/jogamp/nativewindow/awt/AWTMisc.java | 27 +++++
.../junit/jogl/tile/TestTiledPrintingGearsAWT.java | 59 +++++-----
.../jogl/tile/TestTiledPrintingGearsSwingAWT.java | 58 +++++-----
.../test/junit/jogl/tile/TiledPrintingAWTBase.java | 124 +++++++--------------
9 files changed, 345 insertions(+), 235 deletions(-)
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index fee4b3ec0..2b7a2563e 100644
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -216,7 +216,7 @@ function jrun() {
#D_ARGS="-Djogl.debug.GLContext -Dnewt.debug=all -Djogamp.debug.Lock -Djogamp.common.utils.locks.Lock.timeout=10000"
#D_ARGS="-Djogl.debug.GLContext -Dnewt.debug=all"
#D_ARGS="-Dnewt.debug=all"
- D_ARGS="-Djogl.debug.GLCanvas -Djogl.debug.GLJPanel -Djogl.debug.TileRenderer"
+ #D_ARGS="-Djogl.debug.GLCanvas -Djogl.debug.GLJPanel -Djogl.debug.TileRenderer"
#D_ARGS="-Djogl.debug.PNGImage"
#D_ARGS="-Djogl.debug.JPEGImage"
#D_ARGS="-Djogl.debug.GLDrawable -Dnativewindow.debug.GraphicsConfiguration -Djogl.debug.CapabilitiesChooser"
@@ -330,7 +330,7 @@ function testawtswt() {
#testnoawt com.jogamp.opengl.test.junit.jogl.tile.TestRandomTiledRendering2GL2NEWT $*
#testawt com.jogamp.opengl.test.junit.jogl.tile.TestRandomTiledRendering3GL2AWT $*
testawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledPrintingGearsAWT $*
-#testawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledPrintingGearsSwingAWT $*
+testawt com.jogamp.opengl.test.junit.jogl.tile.TestTiledPrintingGearsSwingAWT $*
#
# core/newt (testnoawt and testawt)
diff --git a/src/jogl/classes/javax/media/opengl/awt/AWTPrintLifecycle.java b/src/jogl/classes/javax/media/opengl/awt/AWTPrintLifecycle.java
index 077ee42a9..293bdb809 100644
--- a/src/jogl/classes/javax/media/opengl/awt/AWTPrintLifecycle.java
+++ b/src/jogl/classes/javax/media/opengl/awt/AWTPrintLifecycle.java
@@ -29,9 +29,12 @@ package javax.media.opengl.awt;
import javax.media.opengl.GLAutoDrawable;
import java.awt.Component;
+import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import jogamp.nativewindow.awt.AWTMisc;
+
/**
* Interface describing print lifecycle to support AWT printing
* on AWT {@link GLAutoDrawable}s.
@@ -41,11 +44,55 @@ public interface AWTPrintLifecycle {
/**
* Shall be called before {@link Component#print(Graphics)}.
* @param g2d the {@link Graphics2D} instance, which will be used for printing.
+ * @param scaleMatX {@link Graphics2D} {@link Graphics2D#scale(double, double) scaling factor}, i.e. rendering 1/scaleMatX * width pixels
+ * @param scaleMatY {@link Graphics2D} {@link Graphics2D#scale(double, double) scaling factor}, i.e. rendering 1/scaleMatY * height pixels
*/
- void setupPrint(Graphics2D g2d);
+ void setupPrint(Graphics2D g2d, double scaleMatX, double scaleMatY);
/**
* Shall be called after very last {@link Component#print(Graphics)}.
*/
void releasePrint();
+
+ public static class Context {
+ public static Context setupPrint(Container c, Graphics2D g2d, double scaleMatX, double scaleMatY) {
+ final Context t = new Context(c, g2d, scaleMatX, scaleMatY);
+ t.setupPrint(c);
+ return t;
+ }
+
+ public void releasePrint() {
+ count = AWTMisc.performAction(cont, AWTPrintLifecycle.class, releaseAction);
+ }
+
+ public int getCount() { return count; }
+
+ private final Container cont;
+ private final Graphics2D g2d;
+ private final double scaleMatX;
+ private final double scaleMatY;
+ private int count;
+
+ private final AWTMisc.ComponentAction setupAction = new AWTMisc.ComponentAction() {
+ @Override
+ public void run(Component c) {
+ ((AWTPrintLifecycle)c).setupPrint(g2d, scaleMatX, scaleMatY);
+ } };
+ private final AWTMisc.ComponentAction releaseAction = new AWTMisc.ComponentAction() {
+ @Override
+ public void run(Component c) {
+ ((AWTPrintLifecycle)c).releasePrint();
+ } };
+
+ private Context(Container c, Graphics2D g2d, double scaleMatX, double scaleMatY) {
+ this.cont = c;
+ this.g2d = g2d;
+ this.scaleMatX = scaleMatX;
+ this.scaleMatY = scaleMatY;
+ this.count = 0;
+ }
+ private void setupPrint(Container c) {
+ count = AWTMisc.performAction(c, AWTPrintLifecycle.class, setupAction);
+ }
+ }
}
diff --git a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
index 8f9684db1..b2ffc17a2 100644
--- a/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
+++ b/src/jogl/classes/javax/media/opengl/awt/GLCanvas.java
@@ -86,7 +86,6 @@ import javax.media.opengl.GLDrawable;
import javax.media.opengl.GLDrawableFactory;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLException;
-import javax.media.opengl.GLOffscreenAutoDrawable;
import javax.media.opengl.GLProfile;
import javax.media.opengl.GLRunnable;
import javax.media.opengl.Threading;
@@ -733,11 +732,11 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
private volatile boolean printActive = false;
private boolean printUseAA = false;
private GLAnimatorControl printAnimator = null;
- private GLOffscreenAutoDrawable printGLAD = null;
+ private GLAutoDrawable printGLAD = null;
private AWTTilePainter printAWTTiles = null;
@Override
- public void setupPrint(Graphics2D g2d) {
+ public void setupPrint(Graphics2D g2d, double scaleMatX, double scaleMatY) {
if( !validateGLDrawable() ) {
if(DEBUG) {
System.err.println(getThreadName()+": Info: GLCanvas setupPrint - skipped GL render, drawable not valid yet");
@@ -758,7 +757,7 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
printUseAA = null != _useAA && ( _useAA == RenderingHints.VALUE_ANTIALIAS_DEFAULT || _useAA == RenderingHints.VALUE_ANTIALIAS_ON );
}
if( DEBUG ) {
- System.err.println("AWT print.setup: canvasSize "+getWidth()+"x"+getWidth()+", useAA "+printUseAA+", printAnimator "+printAnimator);
+ System.err.println("AWT print.setup: canvasSize "+getWidth()+"x"+getWidth()+", scaleMat "+scaleMatX+" x "+scaleMatY+", useAA "+printUseAA+", printAnimator "+printAnimator);
{
final Set> rEntries = rHints.entrySet();
int count = 0;
@@ -770,7 +769,10 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
final AffineTransform aTrans = g2d.getTransform();
System.err.println(" scale "+aTrans.getScaleX()+" x "+aTrans.getScaleY());
System.err.println(" move "+aTrans.getTranslateX()+" x "+aTrans.getTranslateY());
- }
+ }
+ final int componentCount = isOpaque() ? 3 : 4;
+ final TileRenderer printRenderer = new TileRenderer();
+ printAWTTiles = new AWTTilePainter(printRenderer, componentCount, scaleMatX, scaleMatY, DEBUG);
AWTEDTExecutor.singleton.invoke(getTreeLock(), true /* allowOnNonEDT */, true /* wait */, setupPrintOnEDT);
}
private final Runnable setupPrintOnEDT = new Runnable() {
@@ -782,30 +784,31 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
printAnimator.remove(GLCanvas.this);
}
final GLCapabilities caps = (GLCapabilities)getChosenGLCapabilities().cloneMutable();
- caps.setDoubleBuffered(false);
final GLProfile glp = caps.getGLProfile();
- if( printUseAA && !caps.getSampleBuffers() ) {
- if ( !glp.isGL2ES3() ) {
- if( DEBUG ) {
- System.err.println("Ignore MSAA due to gl-profile < GL2ES3");
+ if( caps.getSampleBuffers() ) {
+ // bug / issue w/ swapGLContextAndAllGLEventListener and onscreen MSAA w/ NV/GLX
+ printGLAD = GLCanvas.this;
+ } else {
+ caps.setDoubleBuffered(false);
+ caps.setOnscreen(false);
+ if( printUseAA && !caps.getSampleBuffers() ) {
+ if ( !glp.isGL2ES3() ) {
+ if( DEBUG ) {
+ System.err.println("Ignore MSAA due to gl-profile < GL2ES3");
+ }
+ printUseAA = false;
+ } else {
+ caps.setSampleBuffers(true);
+ caps.setNumSamples(8);
}
- printUseAA = false;
- } else {
- caps.setSampleBuffers(true);
- caps.setNumSamples(8); // FIXME
}
+ final GLDrawableFactory factory = GLDrawableFactory.getFactory(caps.getGLProfile());
+ printGLAD = factory.createOffscreenAutoDrawable(null, caps, null, PRINT_TILE_SIZE, PRINT_TILE_SIZE, null);
+ GLDrawableUtil.swapGLContextAndAllGLEventListener(GLCanvas.this, printGLAD);
}
- caps.setOnscreen(false);
- final GLDrawableFactory factory = GLDrawableFactory.getFactory(caps.getGLProfile());
- printGLAD = factory.createOffscreenAutoDrawable(null, caps, null, PRINT_TILE_SIZE, PRINT_TILE_SIZE, null);
- GLDrawableUtil.swapGLContextAndAllGLEventListener(GLCanvas.this, printGLAD);
- destroyOnEDTAction.run();
- final int componentCount = isOpaque() ? 3 : 4;
- final TileRenderer printRenderer = new TileRenderer();
- printRenderer.setTileSize(printGLAD.getWidth(), printGLAD.getHeight(), 0);
- printRenderer.attachToAutoDrawable(printGLAD);
- printAWTTiles = new AWTTilePainter(printRenderer, componentCount, DEBUG);
+ printAWTTiles.renderer.setTileSize(printGLAD.getWidth(), printGLAD.getHeight(), 0);
+ printAWTTiles.renderer.attachToAutoDrawable(printGLAD);
if( DEBUG ) {
System.err.println("AWT print.setup "+printAWTTiles);
System.err.println("AWT print.setup AA "+printUseAA+", "+caps);
@@ -832,9 +835,10 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
}
printAWTTiles.dispose();
printAWTTiles= null;
- createDrawableAndContext( false );
- GLDrawableUtil.swapGLContextAndAllGLEventListener(printGLAD, GLCanvas.this);
- printGLAD.destroy();
+ if( printGLAD != GLCanvas.this ) {
+ GLDrawableUtil.swapGLContextAndAllGLEventListener(printGLAD, GLCanvas.this);
+ printGLAD.destroy();
+ }
printGLAD = null;
if( null != printAnimator ) {
printAnimator.add(GLCanvas.this);
@@ -854,17 +858,26 @@ public class GLCanvas extends Canvas implements AWTGLAutoDrawable, WindowClosing
// we cannot dispatch print on AWT-EDT due to printing internal locking ..
}
sendReshape = false; // clear reshape flag
- final Graphics2D printGraphics = (Graphics2D)graphics;
- printAWTTiles.updateGraphics2DAndClipBounds(printGraphics);
- final TileRenderer tileRenderer = printAWTTiles.getTileRenderer();
- if( DEBUG ) {
- System.err.println("AWT print.0: "+tileRenderer);
+
+ final Graphics2D g2d = (Graphics2D)graphics;
+ printAWTTiles.setupGraphics2DAndClipBounds(g2d);
+ try {
+ final TileRenderer tileRenderer = printAWTTiles.renderer;
+ if( DEBUG ) {
+ System.err.println("AWT print.0: "+tileRenderer);
+ }
+ do {
+ if( printGLAD != GLCanvas.this ) {
+ tileRenderer.display();
+ } else {
+ Threading.invoke(true, displayOnEDTAction, getTreeLock());
+ }
+ } while ( !tileRenderer.eot() );
+ } finally {
+ printAWTTiles.resetGraphics2D();
}
- do {
- tileRenderer.display();
- } while ( !tileRenderer.eot() );
if( DEBUG ) {
- System.err.println("AWT print.X: "+tileRenderer);
+ System.err.println("AWT print.X: "+printAWTTiles);
}
}
diff --git a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
index 2488bd443..b549ad30c 100644
--- a/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
+++ b/src/jogl/classes/javax/media/opengl/awt/GLJPanel.java
@@ -98,6 +98,7 @@ import com.jogamp.nativewindow.awt.AWTWindowClosingProtocol;
import com.jogamp.opengl.FBObject;
import com.jogamp.opengl.util.GLPixelBuffer.GLPixelAttributes;
import com.jogamp.opengl.util.GLPixelBuffer.SingletonGLPixelBufferProvider;
+import com.jogamp.opengl.util.GLDrawableUtil;
import com.jogamp.opengl.util.GLPixelStorageModes;
import com.jogamp.opengl.util.TileRenderer;
import com.jogamp.opengl.util.awt.AWTGLPixelBuffer;
@@ -500,12 +501,15 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
}
}
+ private static final int PRINT_TILE_SIZE = 512;
private volatile boolean printActive = false;
+ private boolean printUseAA = false;
private GLAnimatorControl printAnimator = null;
+ private GLAutoDrawable printGLAD = null;
private AWTTilePainter printAWTTiles = null;
@Override
- public void setupPrint(Graphics2D g2d) {
+ public void setupPrint(Graphics2D g2d, double scaleMatX, double scaleMatY) {
if (!isInitialized) {
if(DEBUG) {
System.err.println(getThreadName()+": Info: GLJPanel setupPrint - skipped GL render, drawable not valid yet");
@@ -521,6 +525,28 @@ public class GLJPanel extends JPanel implements AWTGLAutoDrawable, WindowClosing
printActive = true;
sendReshape = false; // clear reshape flag
handleReshape = false; // ditto
+ final RenderingHints rHints = g2d.getRenderingHints();
+ {
+ final Object _useAA = rHints.get(RenderingHints.KEY_ANTIALIASING);
+ printUseAA = null != _useAA && ( _useAA == RenderingHints.VALUE_ANTIALIAS_DEFAULT || _useAA == RenderingHints.VALUE_ANTIALIAS_ON );
+ }
+ if( DEBUG ) {
+ System.err.println("AWT print.setup: canvasSize "+getWidth()+"x"+getWidth()+", scaleMat "+scaleMatX+" x "+scaleMatY+", useAA "+printUseAA+", printAnimator "+printAnimator);
+ {
+ final Set> rEntries = rHints.entrySet();
+ int count = 0;
+ for(Iterator> rEntryIter = rEntries.iterator(); rEntryIter.hasNext(); count++) {
+ final Entry
*/
public class AWTTilePainter {
- final private TileRenderer renderer;
- final private int componentCount;
- final private boolean verbose;
+ public final TileRenderer renderer;
+ public final int componentCount;
+ public final double scaleMatX, scaleMatY;
+ public final boolean verbose;
private AWTGLPixelBuffer tBuffer = null;
private BufferedImage vFlipImage = null;
private Graphics2D g2d = null;
+ private AffineTransform saveAT = null;
/**
* Assumes a configured {@link TileRenderer}, i.e.
@@ -69,30 +72,43 @@ public class AWTTilePainter {
*
* componentCount reflects opaque, i.e. 4 if non opaque.
*
+ * Copies the current {@link Graphics2D} {@link AffineTransform}
+ * and scales {@link Graphics2D} w/ scaleMatX x scaleMatY.
+ * After rendering, the {@link AffineTransform} should be reset via {@link #resetGraphics2D()}.
+ *
+ *
* Sets the {@link TileRenderer}'s {@link TileRenderer#setImageSize(int, int) image size}
* and {@link TileRenderer#setTileOffset(int, int) tile offset} according the
* the {@link Graphics2D#getClipBounds() graphics clip bounds}.
*
* @param g2d
*/
- public void updateGraphics2DAndClipBounds(Graphics2D g2d) {
+ public void setupGraphics2DAndClipBounds(Graphics2D g2d) {
this.g2d = g2d;
+ saveAT = g2d.getTransform();
+ g2d.scale(scaleMatX, scaleMatY);
+
final Rectangle gClipOrig = g2d.getClipBounds();
final Rectangle gClip = new Rectangle(gClipOrig);
if( 0 > gClip.x ) {
@@ -106,10 +122,15 @@ public class AWTTilePainter {
if( verbose ) {
System.err.println("AWT print.0: "+gClipOrig+" -> "+gClip);
}
- renderer.setImageSize(gClip.width, gClip.height);
+ renderer.setImageSize(gClip.width, gClip.height);
renderer.setTileOffset(gClip.x, gClip.y);
}
+ /** See {@ #setupGraphics2DAndClipBounds(Graphics2D)}. */
+ public void resetGraphics2D() {
+ g2d.setTransform(saveAT);
+ }
+
/**
* Disposes resources and {@link TileRenderer#detachFromAutoDrawable() detaches}
* the {@link TileRenderer}'s {@link GLAutoDrawable}.
@@ -194,24 +215,20 @@ public class AWTTilePainter {
}
final Shape oClip = g2d.getClip();
g2d.clipRect(pX, pYf, tWidth, tHeight);
- final Shape clip = g2d.getClip();
g2d.drawImage(dstImage, pX, pYf, dstImage.getWidth(), dstImage.getHeight(), null); // Null ImageObserver since image data is ready.
- g2d.setColor(Color.BLACK);
- g2d.drawRect(pX, pYf, tWidth, tHeight);
- {
+ if( verbose ) {
+ System.err.println("XXX tile-post.X clip "+oClip+" -> "+g2d.getClip());
+ g2d.setColor(Color.BLACK);
+ g2d.drawRect(pX, pYf, tWidth, tHeight);
final Rectangle r = oClip.getBounds();
g2d.setColor(Color.YELLOW);
g2d.drawRect(r.x, r.y, r.width, r.height);
- }
- g2d.setClip(oClip);
- if( verbose ) {
- System.err.println("XXX tile-post.X clip "+oClip+" -> "+clip);
System.err.println("XXX tile-post.X "+renderer);
System.err.println("XXX tile-post.X dst-img "+dstImage.getWidth()+"x"+dstImage.getHeight()+" -> "+pX+"/"+pYf);
}
+ g2d.setClip(oClip);
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {}
- };
-
+ };
}
diff --git a/src/nativewindow/classes/jogamp/nativewindow/awt/AWTMisc.java b/src/nativewindow/classes/jogamp/nativewindow/awt/AWTMisc.java
index 66be82a44..f38e7ea2b 100644
--- a/src/nativewindow/classes/jogamp/nativewindow/awt/AWTMisc.java
+++ b/src/nativewindow/classes/jogamp/nativewindow/awt/AWTMisc.java
@@ -69,6 +69,33 @@ public class AWTMisc {
return (Container) c;
}
+ public static interface ComponentAction {
+ /**
+ * @param c the component to perform the action on
+ */
+ public void run(Component c);
+ }
+
+ public static int performAction(Container c, Class> cType, ComponentAction action) {
+ int count = 0;
+ final int cc = c.getComponentCount();
+ for(int i=0; i
- * We assume AWT painting happens w/ 72 dpi!
- *
+ * We fit the frame into the imageable area with for 72 dpi,
+ * assuming that is the default AWT painting density.
*
* The frame borders are considered.
*
+ *
+ * The frame's scale factor is used for the graphics print matrix
+ * of the overall print-job, hence no frame resize is required.
+ *
+ *
+ * The GL scale factor 'scaleGLMatXY', 72dpi/glDPI, is passed to the GL object
+ * which locally scales the print matrix and renders the scene with 1/scaleGLMatXY pixels.
+ *
*/
final Insets frameInsets = frame.getInsets();
final int frameWidth = frame.getWidth();
final int frameHeight= frame.getHeight();
- final int frameWidthS;
- final int frameHeightS;
- final double scaleComp;
+ final double scaleComp72;
{
final int frameBorderW = frameInsets.left + frameInsets.right;
final int frameBorderH = frameInsets.top + frameInsets.bottom;
final double sx = pf.getImageableWidth() / ( frameWidth + frameBorderW );
final double sy = pf.getImageableHeight() / ( frameHeight + frameBorderH );
- scaleComp = Math.min(sx, sy) * ( printDPI/72.0 );
- if( 0f < scaleComp ) {
- frameWidthS = (int) ( frameWidth*scaleComp ); // cut off FIXME
- frameHeightS = (int) ( frameHeight*scaleComp ); // cut off FIXME
- } else {
- frameWidthS = frameWidth;
- frameHeightS = frameHeight;
- }
+ scaleComp72 = Math.min(sx, sy);
}
- // Since we fit the frame size into the imageable size respecting the DPI,
- // we simply can scale the print graphics matrix to the DPI
- // w/o the need to fiddle w/ the margins (matrix translation).
- final double scaleGraphics = 72.0 / printDPI;
-
- System.err.println("PRINT offscreen: "+printOffscreen+", thread "+Thread.currentThread().getName());
- System.err.println("PRINT DPI: "+printDPI+", AA "+printAA+", scaleGraphics "+scaleGraphics+", scaleComp "+scaleComp+
- ", frame: border "+frameInsets+", size "+frameWidth+"x"+frameHeight+" -> "+frameWidthS+"x"+frameHeightS);
+ final double scaleGLMatXY = 72.0 / glDPI;
+ System.err.println("PRINT thread "+Thread.currentThread().getName());
+ System.err.println("PRINT DPI: "+glDPI+", AA "+printAA+", scaleGL "+scaleGLMatXY+", scaleComp72 "+scaleComp72+
+ ", frame: border "+frameInsets+", size "+frameWidth+"x"+frameHeight);
final Graphics2D printG2D = (Graphics2D)g;
- final Graphics2D offscreenG2D;
- final BufferedImage offscreenImage;
- final Graphics2D g2d;
- if( printOffscreen ) {
- offscreenImage = new BufferedImage(frameWidthS, frameHeightS, BufferedImage.TYPE_4BYTE_ABGR);
- offscreenG2D = (Graphics2D) offscreenImage.getGraphics();
- offscreenG2D.setClip(0, 0, frameWidthS, frameHeightS);
- g2d = offscreenG2D;
- } else {
- offscreenG2D = null;
- offscreenImage = null;
- g2d = printG2D;
+ final Graphics2D g2d = printG2D;
- g2d.translate(pf.getImageableX(), pf.getImageableY());
- g2d.scale(scaleGraphics, scaleGraphics);
- }
+ g2d.translate(pf.getImageableX(), pf.getImageableY());
+ g2d.scale(scaleComp72, scaleComp72);
+
if( printAA ) {
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
- awtPrintObject.setupPrint(g2d);
+ final AWTPrintLifecycle.Context ctx = AWTPrintLifecycle.Context.setupPrint(frame, g2d, scaleGLMatXY, scaleGLMatXY);
try {
+ System.err.println("PRINT AWTPrintLifecycle.setup.count "+ctx.getCount());
AWTEDTExecutor.singleton.invoke(true, new Runnable() {
- public void run() {
- frame.setSize(frameWidthS, frameHeightS);
- frame.invalidate();
- frame.validate();
- }
- });
-
- AWTEDTExecutor.singleton.invoke(true, new Runnable() {
- public void run() {
- frame.printAll(g2d);
- } } );
-
- System.err.println("PRINT DPI: reset frame size "+frameWidth+"x"+frameHeight);
- AWTEDTExecutor.singleton.invoke(true, new Runnable() {
- public void run() {
- frame.setSize(frameWidth, frameHeight);
- frame.invalidate();
- frame.validate();
+ public void run() {
+ frame.printAll(g2d);
}
});
} finally {
- awtPrintObject.releasePrint();
- }
-
- if( printOffscreen ) {
- printG2D.translate(pf.getImageableX(), pf.getImageableY());
- printG2D.scale(scaleGraphics, scaleGraphics);
- printG2D.drawImage(offscreenImage, 0, 0, offscreenImage.getWidth(), offscreenImage.getHeight(), null); // Null ImageObserver since image data is ready.
+ ctx.releasePrint();
+ System.err.println("PRINT AWTPrintLifecycle.release.count "+ctx.getCount());
}
/* tell the caller that this page is part of the printed document */
@@ -230,8 +187,7 @@ public abstract class TiledPrintingAWTBase extends UITestCase implements Printab
super();
}
- public void doPrintAuto(Frame frame, AWTPrintLifecycle awtPrintObject,
- Printable printable, int pOrientation, Paper paper, boolean offscreen, int dpi, boolean antialiasing) {
+ public void doPrintAuto(Frame frame, int pOrientation, Paper paper, int dpi, boolean antialiasing) {
lock.lock();
try {
final PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
@@ -253,7 +209,7 @@ public abstract class TiledPrintingAWTBase extends UITestCase implements Printab
FileOutputStream outstream;
try {
outstream = new FileOutputStream(fname);
- Assert.assertTrue(doPrintAutoImpl(frame, awtPrintObject, printable, pj, factories[0].getPrintService(outstream), pOrientation, paper, offscreen, dpi, antialiasing));
+ Assert.assertTrue(doPrintAutoImpl(frame, pj, factories[0].getPrintService(outstream), pOrientation, paper, dpi, antialiasing));
} catch (FileNotFoundException e) {
Assert.assertNull("Unexpected exception", e);
}
@@ -268,7 +224,7 @@ public abstract class TiledPrintingAWTBase extends UITestCase implements Printab
FileOutputStream outstream;
try {
outstream = new FileOutputStream(fname);
- Assert.assertTrue(doPrintAutoImpl(frame, awtPrintObject, printable, pj, factories[0].getPrintService(outstream), pOrientation, paper, offscreen, dpi, antialiasing));
+ Assert.assertTrue(doPrintAutoImpl(frame, pj, factories[0].getPrintService(outstream), pOrientation, paper, dpi, antialiasing));
} catch (FileNotFoundException e) {
Assert.assertNull("Unexpected exception", e);
}
@@ -285,13 +241,11 @@ public abstract class TiledPrintingAWTBase extends UITestCase implements Printab
final String sAA = antialiasing ? "aa_" : "raw";
return String.format("%-"+maxSimpleTestNameLen+"s-n%04d-dpi%03d-%s.%s", simpleTestName, printCount, dpi, sAA, suffix).replace(' ', '_');
}
- private boolean doPrintAutoImpl(Frame frame, AWTPrintLifecycle awtPrintObject,
- Printable printable, PrinterJob job, StreamPrintService ps, int pOrientation,
- Paper paper, boolean offscreen, int dpi, boolean antialiasing) {
- this.awtPrintObject = awtPrintObject;
+ private boolean doPrintAutoImpl(Frame frame, PrinterJob job,
+ StreamPrintService ps, int pOrientation, Paper paper, int dpi,
+ boolean antialiasing) {
this.frame = frame;
- printOffscreen = offscreen;
- printDPI = dpi;
+ glDPI = dpi;
printAA = antialiasing;
boolean ok = true;
try {
@@ -305,7 +259,7 @@ public abstract class TiledPrintingAWTBase extends UITestCase implements Printab
}
pageFormat.setOrientation(pOrientation); // PageFormat.LANDSCAPE or PageFormat.PORTRAIT
job.setPrintService(ps);
- job.setPrintable(printable, pageFormat);
+ job.setPrintable(this, pageFormat);
job.print();
} catch (PrinterException pe) {
pe.printStackTrace();
@@ -314,16 +268,14 @@ public abstract class TiledPrintingAWTBase extends UITestCase implements Printab
return ok;
}
- public void doPrintManual(Frame frame, AWTPrintLifecycle awtPrintObject, Printable printable, boolean offscreen, int dpi, boolean antialiasing) {
+ public void doPrintManual(Frame frame, int dpi, boolean antialiasing) {
lock.lock();
try {
- this.awtPrintObject = awtPrintObject;
this.frame = frame;
- printOffscreen = offscreen;
- printDPI = dpi;
+ glDPI = dpi;
printAA = antialiasing;
PrinterJob job = PrinterJob.getPrinterJob();
- job.setPrintable(printable);
+ job.setPrintable(this);
boolean ok = job.printDialog();
if (ok) {
try {
--
cgit v1.2.3