@Override public void destroyGLAutoDrawable(final GLAutoDrawable glad) throws InterruptedException, InvocationTargetException { if (glad.getChosenGLCapabilities().isOnscreen()) { final Frame frame = AWTMisc.getFrame((Component) glad); javax.swing.SwingUtilities.invokeAndWait( new Runnable() { public void run() { final Frame _frame = frame; _frame.dispose(); } }); } else { glad.destroy(); } }
void doTest( final boolean onscreen, final GLEventListener demo, final GLProfile glp, final int msaaCount) throws IOException { final GLCapabilities caps = new GLCapabilities(glp); caps.setDoubleBuffered(onscreen); if (msaaCount > 0) { caps.setSampleBuffers(true); caps.setNumSamples(msaaCount); } final int maxTileSize = 256; final GLAutoDrawable glad; if (onscreen) { final GLWindow glWin = GLWindow.create(caps); glWin.setSize(maxTileSize, maxTileSize); glWin.setVisible(true); glad = glWin; } else { final GLDrawableFactory factory = GLDrawableFactory.getFactory(glp); glad = factory.createOffscreenAutoDrawable(null, caps, null, maxTileSize, maxTileSize); } glad.addGLEventListener(demo); // Fix the image size for now final int imageWidth = glad.getSurfaceWidth() * 6; final int imageHeight = glad.getSurfaceHeight() * 4; final String filename = this.getSnapshotFilename( 0, "-tile", glad.getChosenGLCapabilities(), imageWidth, imageHeight, false, TextureIO.PNG, null); final File file = new File(filename); // Initialize the tile rendering library final TileRenderer renderer = new TileRenderer(); renderer.setImageSize(imageWidth, imageHeight); renderer.setTileSize(glad.getSurfaceWidth(), glad.getSurfaceHeight(), 0); renderer.attachAutoDrawable(glad); final GLPixelBuffer.GLPixelBufferProvider pixelBufferProvider = GLPixelBuffer.defaultProviderWithRowStride; final boolean[] flipVertically = {false}; final GLEventListener preTileGLEL = new GLEventListener() { @Override public void init(final GLAutoDrawable drawable) { final GL gl = drawable.getGL(); final GLPixelAttributes pixelAttribs = pixelBufferProvider.getAttributes(gl, 3); final GLPixelBuffer pixelBuffer = pixelBufferProvider.allocate(gl, pixelAttribs, imageWidth, imageHeight, 1, true, 0); renderer.setImageBuffer(pixelBuffer); if (drawable.isGLOriented()) { flipVertically[0] = false; } else { flipVertically[0] = true; } } @Override public void dispose(final GLAutoDrawable drawable) {} @Override public void display(final GLAutoDrawable drawable) {} @Override public void reshape( final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {} }; renderer.setGLEventListener(preTileGLEL, null); while (!renderer.eot()) { renderer.display(); } renderer.detachAutoDrawable(); // Restore viewport and Gear's PMV matrix // .. even though we close the demo, this is for documentation! glad.invoke( true, new GLRunnable() { @Override public boolean run(final GLAutoDrawable drawable) { drawable .getGL() .glViewport(0, 0, drawable.getSurfaceWidth(), drawable.getSurfaceHeight()); demo.reshape(drawable, 0, 0, drawable.getSurfaceWidth(), drawable.getSurfaceHeight()); return false; } }); final GLPixelBuffer imageBuffer = renderer.getImageBuffer(); final TextureData textureData = new TextureData( caps.getGLProfile(), 0 /* internalFormat */, imageWidth, imageHeight, 0, imageBuffer.pixelAttributes, false, false, flipVertically[0], imageBuffer.buffer, null /* Flusher */); TextureIO.write(textureData, file); glad.destroy(); }