/** * Copyright 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl.test.junit.jogl.util.texture; import com.jogamp.common.util.awt.AWTEDTExecutor; import com.jogamp.opengl.test.junit.jogl.demos.gl2.TextureDraw01GL2Listener; import com.jogamp.opengl.test.junit.util.MiscUtils; import com.jogamp.opengl.test.junit.util.UITestCase; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.awt.GLCanvas; import javax.swing.ImageIcon; import javax.swing.JLabel; import com.jogamp.opengl.util.awt.AWTGLReadBufferUtil; import com.jogamp.opengl.util.texture.TextureData; import com.jogamp.opengl.util.texture.awt.AWTTextureIO; import java.awt.AlphaComposite; import java.awt.Canvas; import java.awt.Color; import java.awt.Frame; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import org.junit.Assert; import org.junit.After; import org.junit.Assume; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.FixMethodOrder; import org.junit.runners.MethodSorters; /** * Demonstrates TextureData w/ AWT usage in both directions, * i.e. generating a texture based on an AWT BufferedImage data * as well as reading out GL framebuffer and displaying it * as an BufferedImage. */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestTexture01AWT extends UITestCase { static long durationPerTest = 500; static GLProfile glp; static GLCapabilities caps; BufferedImage textureImage; @BeforeClass public static void initClass() { if(!GLProfile.isAvailable(GLProfile.GL2GL3)) { UITestCase.setTestSupported(false); return; } glp = GLProfile.getMaxFixedFunc(true); Assert.assertNotNull(glp); caps = new GLCapabilities(glp); Assert.assertNotNull(caps); } @Before public void initTest() { // create base image BufferedImage baseImage = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR); Assert.assertNotNull(baseImage); Graphics2D g = baseImage.createGraphics(); Assert.assertNotNull(g); g.setPaint(new GradientPaint(0, 0, Color.CYAN, baseImage.getWidth(), baseImage.getHeight(), Color.BLUE)); g.fillRect(0, 0, baseImage.getWidth(), baseImage.getHeight()); g.dispose(); // create texture image final int imageType = BufferedImage.TYPE_3BYTE_BGR; textureImage = new BufferedImage(baseImage.getWidth(), baseImage.getHeight(), imageType); Assert.assertNotNull(textureImage); g = textureImage.createGraphics(); g.setComposite(AlphaComposite.Src); g.drawImage(baseImage, 0, 0, null); g.dispose(); baseImage.flush(); baseImage=null; } @After public void cleanupTest() { Assert.assertNotNull(textureImage); textureImage.flush(); textureImage=null; } @Test public void test1() throws InterruptedException { final AWTGLReadBufferUtil awtGLReadBufferUtil = new AWTGLReadBufferUtil(caps.getGLProfile(), false); final Frame frame0 = new Frame("GL -> AWT"); final Canvas canvas = new Canvas(); frame0.add(canvas); final GLCanvas glCanvas = new GLCanvas(caps); final Frame frame1 = new Frame("AWT -> Texture"); Assert.assertNotNull(frame1); frame1.add(glCanvas); // create texture final TextureData textureData = AWTTextureIO.newTextureData(caps.getGLProfile(), textureImage, false); glCanvas.addGLEventListener(new TextureDraw01GL2Listener(textureData)); glCanvas.addGLEventListener(new GLEventListener() { @Override public void init(final GLAutoDrawable drawable) { } @Override public void dispose(final GLAutoDrawable drawable) { } @Override public void display(final GLAutoDrawable drawable) { final BufferedImage outputImage = awtGLReadBufferUtil.readPixelsToBufferedImage(drawable.getGL(), true /* awtOrientation */); final ImageIcon imageIcon = new ImageIcon(outputImage); final JLabel imageLabel = new JLabel(imageIcon); try { AWTEDTExecutor.singleton.invoke(true, new Runnable() { public void run() { frame0.removeAll(); frame0.add(imageLabel); frame0.validate(); }}); } catch (final Exception e) { e.printStackTrace(); } } @Override public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) { frame0.setSize(frame1.getWidth(), frame1.getHeight()); frame0.setLocation(frame1.getX()+frame1.getWidth()+32, frame0.getY()); frame0.validate(); } }); try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { frame1.setSize(256, 256); frame1.setLocation(0, 0); frame1.setVisible(true); frame0.setSize(frame1.getWidth(), frame1.getHeight()); frame0.setLocation(frame1.getX()+frame1.getWidth()+32, frame0.getY()); frame0.setVisible(true); }}); } catch( final Throwable throwable ) { throwable.printStackTrace(); Assume.assumeNoException( throwable ); } Thread.sleep(durationPerTest); try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { frame0.setVisible(false); frame0.dispose(); frame1.setVisible(false); frame1.dispose(); }}); } catch( final Throwable throwable ) { throwable.printStackTrace(); Assume.assumeNoException( throwable ); } } public static void main(final String args[]) throws IOException { for(int i=0; i<args.length; i++) { if(args[i].equals("-time")) { durationPerTest = MiscUtils.atol(args[++i], durationPerTest); } } final String tstname = TestTexture01AWT.class.getName(); org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(new String[] { tstname, "filtertrace=true", "haltOnError=false", "haltOnFailure=false", "showoutput=true", "outputtoformatters=true", "logfailedtests=true", "logtestlistenerevents=true", "formatter=org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter", "formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,TEST-"+tstname+".xml" } ); } }