/**
* Copyright 2012 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.IOUtil;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.jogl.demos.TextureDraw01Accessor;
import com.jogamp.opengl.test.junit.jogl.demos.es2.TextureDraw01ES2Listener;
import com.jogamp.opengl.test.junit.util.MiscUtils;
import com.jogamp.opengl.test.junit.util.QuitAdapter;
import com.jogamp.opengl.test.junit.util.UITestCase;
import javax.imageio.ImageIO;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.util.texture.TextureData;
import com.jogamp.opengl.util.texture.TextureIO;
import com.jogamp.opengl.util.texture.awt.AWTTextureData;
import com.jogamp.opengl.util.texture.spi.JPEGImage;
import com.jogamp.opengl.util.Animator;
import com.jogamp.opengl.util.GLPixelBuffer.GLPixelAttributes;
import com.jogamp.opengl.util.GLReadBufferUtil;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
import org.junit.Assert;
import org.junit.Test;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestJPEGJoglAWTCompareNewtAWT extends UITestCase {
static boolean showFPS = false;
static long duration = 100; // ms
String[] files = { "test-ntscN_3-01-160x90-90pct-yuv444-base.jpg", // 0
"test-ntscN_3-01-160x90-90pct-yuv444-prog.jpg", // 1
"test-ntscN_3-01-160x90-60pct-yuv422h-base.jpg", // 2
"test-ntscN_3-01-160x90-60pct-yuv422h-prog.jpg", // 3
"j1-baseline.jpg", // 4
"j2-progressive.jpg", // 5
"j3-baseline_gray.jpg", // 6
"test-cmyk-01.jpg", // 7
"test-ycck-01.jpg" }; // 8
void testImpl(final String fname) throws InterruptedException, IOException {
final Animator animator = new Animator();
final GLWindow w1 = testJOGLJpeg(fname);
final GLWindow w2 = testAWTJpeg(fname, w1.getSurfaceWidth() + 50);
animator.add(w1);
animator.add(w2);
animator.setUpdateFPSFrames(60, showFPS ? System.err : null);
final QuitAdapter quitAdapter = new QuitAdapter();
w1.setVisible(true);
w2.setVisible(true);
animator.start();
while(!quitAdapter.shouldQuit() && animator.isAnimating() && animator.getTotalFPSDuration()<duration) {
Thread.sleep(100);
}
animator.stop();
w1.destroy();
w2.destroy();
}
GLWindow testJOGLJpeg(final String fname) throws InterruptedException, IOException {
final URLConnection testTextureUrlConn = IOUtil.getResource(fname, this.getClass().getClassLoader(), this.getClass());
Assert.assertNotNull(testTextureUrlConn);
final InputStream istream = testTextureUrlConn.getInputStream();
Assert.assertNotNull(istream);
final JPEGImage image = JPEGImage.read(istream);
Assert.assertNotNull(image);
System.err.println("JPEGImage: "+image);
final GLProfile glp = GLProfile.getGL2ES2();
final int internalFormat = (image.getBytesPerPixel()==4)?GL.GL_RGBA:GL.GL_RGB;
final TextureData texData = new TextureData(glp, internalFormat,
image.getWidth(),
image.getHeight(),
0,
new GLPixelAttributes(image.getGLFormat(), image.getGLType()),
false /* mipmap */,
false /* compressed */,
false /* must flip-vert */,
image.getData(),
null);
// final TextureData texData = TextureIO.newTextureData(glp, istream, false /* mipmap */, TextureIO.JPG);
System.err.println("TextureData: "+texData);
final GLReadBufferUtil screenshot = new GLReadBufferUtil(true, false);
final GLCapabilities caps = new GLCapabilities(glp);
caps.setAlphaBits(1);
final GLWindow glad1 = GLWindow.create(caps);
glad1.setTitle("JPEG JOGL");
// Size OpenGL to Video Surface
glad1.setSize(texData.getWidth(), texData.getHeight());
glad1.setPosition(0, 0);
// load texture from file inside current GL context to match the way
// the bug submitter was doing it
final GLEventListener gle = new TextureDraw01ES2Listener( texData, 0 ) ;
glad1.addGLEventListener(gle);
glad1.addGLEventListener(new GLEventListener() {
boolean shot = false;
@Override public void init(final GLAutoDrawable drawable) {}
public void display(final GLAutoDrawable drawable) {
// 1 snapshot
if(null!=((TextureDraw01Accessor)gle).getTexture() && !shot) {
shot = true;
snapshot(0, "JoglJPEG", drawable.getGL(), screenshot, TextureIO.PNG, null);
}
}
@Override public void dispose(final GLAutoDrawable drawable) { }
@Override public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) { }
});
return glad1;
}
GLWindow testAWTJpeg(final String fname, final int xpos) throws InterruptedException, IOException {
final URLConnection testTextureUrlConn = IOUtil.getResource(fname, this.getClass().getClassLoader(), this.getClass());
Assert.assertNotNull(testTextureUrlConn);
final InputStream istream = testTextureUrlConn.getInputStream();
Assert.assertNotNull(istream);
final GLProfile glp = GLProfile.getGL2ES2();
TextureData texData = null;
int w = 300, h = 300;
try {
final BufferedImage img = ImageIO.read(istream);
texData = new AWTTextureData(glp, 0, 0, false, img);
System.err.println("TextureData: "+texData);
w = texData.getWidth();
h = texData.getHeight();
} catch (final Exception e) {
System.err.println("AWT ImageIO failure w/ file "+fname+": "+e.getMessage());
// e.printStackTrace(); // : CMYK, YCCK -> com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
}
final GLReadBufferUtil screenshot = new GLReadBufferUtil(true, false);
final GLCapabilities caps = new GLCapabilities(glp);
caps.setAlphaBits(1);
final GLWindow glad1 = GLWindow.create(caps);
glad1.setTitle("JPEG AWT");
// Size OpenGL to Video Surface
glad1.setSize(w, h);
glad1.setPosition(xpos, 0);
// load texture from file inside current GL context to match the way
// the bug submitter was doing it
final GLEventListener gle;
if( texData != null ) {
gle = new TextureDraw01ES2Listener( texData, 0 ) ;
glad1.addGLEventListener(gle);
} else {
gle = null;
}
glad1.addGLEventListener(new GLEventListener() {
boolean shot = false;
@Override public void init(final GLAutoDrawable drawable) {}
public void display(final GLAutoDrawable drawable) {
// 1 snapshot
if( null!=gle && null!=((TextureDraw01Accessor)gle).getTexture() && !shot) {
shot = true;
snapshot(0, "AWTJPEG", drawable.getGL(), screenshot, TextureIO.PNG, null);
}
}
@Override public void dispose(final GLAutoDrawable drawable) { }
@Override public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) { }
});
return glad1;
}
@Test
public void test01YUV444Base__ES2() throws InterruptedException, IOException {
testImpl(files[0]);
}
@Test
public void test01YUV444Prog__ES2() throws InterruptedException, IOException {
testImpl(files[1]);
}
@Test
public void test01YUV422hBase__ES2() throws InterruptedException, IOException {
testImpl(files[2]);
}
@Test
public void test01YUV422hProg_ES2() throws InterruptedException, IOException {
testImpl(files[3]);
}
@Test
public void test02YUV420Base__ES2() throws InterruptedException, IOException {
testImpl(files[4]);
}
@Test
public void test02YUV420Prog_ES2() throws InterruptedException, IOException {
testImpl(files[5]);
}
@Test
public void test02YUV420BaseGray_ES2() throws InterruptedException, IOException {
testImpl(files[6]);
}
@Test
public void test03CMYK_01_ES2() throws InterruptedException, IOException {
testImpl(files[7]);
}
@Test
public void test03YCCK_01_ES2() throws InterruptedException, IOException {
testImpl(files[8]);
}
public static void main(final String args[]) throws IOException {
for(int i=0; i<args.length; i++) {
if(args[i].equals("-time")) {
i++;
duration = MiscUtils.atol(args[i], duration);
}
}
org.junit.runner.JUnitCore.main(TestJPEGJoglAWTCompareNewtAWT.class.getName());
}
}