package org.jogamp.glg2d.util; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.Raster; import com.jogamp.opengl.GLDrawableFactory; import com.jogamp.opengl.GLOffscreenAutoDrawable; import com.jogamp.opengl.GLProfile; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; import org.jogamp.glg2d.GLG2DCanvas; import org.jogamp.glg2d.GLG2DSimpleEventListener; import org.jogamp.glg2d.GLGraphics2D; import org.junit.Assert; import com.jogamp.opengl.util.awt.AWTGLReadBufferUtil; public class AutoTester implements Tester { static final int pixels = 500; static GLOffscreenAutoDrawable buffer = GLDrawableFactory.getFactory(GLProfile.getMaxFixedFunc(true)) .createOffscreenAutoDrawable(null, GLG2DCanvas.getDefaultCapabalities(), null, pixels, pixels); private Painter p; @Override public void assertSame() throws InterruptedException { Assert.assertEquals(1, getSimilarityScore(p), 0.05); } @Override public void setPainter(Painter p) { this.p = p; } @Override public void finish() { } public double getSimilarityScore(Painter painter) { BufferedImage gl = drawGL(painter); Raster rasterGl = gl.getData(); BufferedImage g2d = drawG2D(painter); Raster rasterG2d = g2d.getData(); // very naive for now for (int band = 0; band < rasterGl.getNumBands(); band++) { for (int row = 0; row < gl.getWidth(); row++) { for (int col = 0; col < gl.getHeight(); col++) { if (rasterGl.getSample(row, col, band) != rasterG2d.getSample(row, col, band)) { return 0; } } } } return 1; } public JSplitPane getComparison(Painter painter) { JSplitPane split = new JSplitPane(); split.setLeftComponent(new JLabel(new ImageIcon(drawGL(painter)))); split.setRightComponent(new JLabel(new ImageIcon(drawG2D(painter)))); return split; } public static BufferedImage drawG2D(Painter painter) { BufferedImage img = new BufferedImage(pixels, pixels, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = (Graphics2D) img.getGraphics(); g2d.setColor(new JPanel().getBackground()); g2d.fillRect(0, 0, pixels, pixels); painter.paint(g2d); return img; } public static BufferedImage drawGL(final Painter painter) { JPanel panel = new JPanel(); panel.setSize(pixels, pixels); buffer.addGLEventListener(new GLG2DSimpleEventListener(panel) { @Override protected void paintGL(GLGraphics2D g2d) { painter.paint(g2d); } }); buffer.display(); buffer.getContext().makeCurrent(); AWTGLReadBufferUtil util = new AWTGLReadBufferUtil(GLG2DCanvas.getDefaultCapabalities().getGLProfile(), false); return util.readPixelsToBufferedImage( buffer.getContext().getGL( ), true ); } }