package com.jogamp.opengl.test.junit.graph;

import java.io.IOException;

import javax.media.nativewindow.NativeWindowFactory;
import javax.media.opengl.GL;
import javax.media.opengl.GL2ES2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLCapabilitiesImmutable;
import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.jogamp.graph.curve.Region;
import com.jogamp.graph.curve.opengl.TextRenderer;
import com.jogamp.graph.font.FontFactory;
import com.jogamp.graph.geom.opengl.SVertex;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.test.junit.graph.demos.GPUTextRendererListenerBase01;


public class TestTextRenderer01 {

    public static void main(String args[]) throws IOException {
        String tstname = TestTextRenderer01.class.getName();
        org.junit.runner.JUnitCore.main(tstname);
    }    
        
	@BeforeClass
	public static void initClass() {
		GLProfile.initSingleton(true);
		NativeWindowFactory.initSingleton(true);
	}

	static void destroyWindow(GLWindow window) {
		if(null!=window) {
			window.destroy();
		}
	}

	static GLWindow createWindow(String title, GLCapabilitiesImmutable caps, int width, int height) {
		Assert.assertNotNull(caps);

		GLWindow window = GLWindow.create(caps);
		window.setSize(width, height);
		window.setPosition(10, 10);
		window.setTitle(title);
		Assert.assertNotNull(window);
		window.setVisible(true);

		return window;
	}

	@Test
	public void testTextRendererR2T01() throws InterruptedException {
        GLProfile glp = GLProfile.getGL2ES2();
		
		GLCapabilities caps = new GLCapabilities(glp);
		caps.setAlphaBits(4);	

		GLWindow window = createWindow("text-r2t1-msaa0", caps, 800,400);
		TextGLListener textGLListener = new TextGLListener(Region.TWO_PASS);
        textGLListener.attachInputListenerTo(window);
        window.addGLEventListener(textGLListener);
        
        textGLListener.setFontSet(FontFactory.UBUNTU, 0, 0);
        textGLListener.setTech(-400, -30, 0f, -1000, window.getWidth()*2);
		window.display();
		
		textGLListener.setTech(-400, -30, 0, -380, window.getWidth()*3);
        window.display();
		
		textGLListener.setTech(-400, -20, 0, -80, window.getWidth()*4);
        window.display();

        textGLListener.setFontSet(FontFactory.JAVA, 0, 0);
        textGLListener.setTech(-400, -30, 0f, -1000, window.getWidth()*2);
        window.display();
        
        textGLListener.setTech(-400, -30, 0, -380, window.getWidth()*3);
        window.display();
        
        textGLListener.setTech(-400, -20, 0, -80, window.getWidth()*4);
        window.display();
        
		destroyWindow(window); 
	}
	
	@Test
	public void testTextRendererMSAA01() throws InterruptedException {
		GLProfile glp = GLProfile.get(GLProfile.GL2ES2);
		GLCapabilities caps = new GLCapabilities(glp);
		caps.setAlphaBits(4);	
		caps.setSampleBuffers(true);
		caps.setNumSamples(4);

		GLWindow window = createWindow("text-r2t0-msaa1", caps, 800, 400);
		TextGLListener textGLListener = new TextGLListener(Region.SINGLE_PASS);
        textGLListener.attachInputListenerTo(window);
        window.addGLEventListener(textGLListener);
        
        textGLListener.setFontSet(FontFactory.UBUNTU, 0, 0);
        textGLListener.setTech(-400, -30, 0f, -1000, 0);
        window.display();
        
        textGLListener.setTech(-400, -30, 0, -380, 0);
        window.display();
        
        textGLListener.setTech(-400, -20, 0, -80, 0);
        window.display();
        
        textGLListener.setFontSet(FontFactory.JAVA, 0, 0);
        textGLListener.setTech(-400, -30, 0f, -1000, 0);
        window.display();
        
        textGLListener.setTech(-400, -30, 0, -380, 0);
        window.display();
        
        textGLListener.setTech(-400, -20, 0, -80, 0);
        window.display();
        
		destroyWindow(window); 
	}
	
	private class TextGLListener extends GPUTextRendererListenerBase01 {
	    String winTitle;
	    
		public TextGLListener(int type) {
			super(SVertex.factory(), type, false, false);
		}
		
		public void attachInputListenerTo(GLWindow window) {
		    super.attachInputListenerTo(window);
		    winTitle = window.getTitle();
		}
		public void setTech(float xt, float yt, float angle, int zoom, int fboSize){
			setMatrix(xt, yt, angle, zoom, fboSize);       
		}

		public void init(GLAutoDrawable drawable) {
			GL2ES2 gl = drawable.getGL().getGL2ES2();
			super.init(drawable);
			gl.setSwapInterval(1);
			gl.glEnable(GL.GL_DEPTH_TEST);
			
			final TextRenderer textRenderer = (TextRenderer) getRenderer();
			
			textRenderer.init(gl);
			textRenderer.setAlpha(gl, 1.0f);
			textRenderer.setColor(gl, 0.0f, 0.0f, 0.0f);
		}
		
		public void display(GLAutoDrawable drawable) {
			super.display(drawable);

			try {
				printScreen(drawable, "./", winTitle, false);
			} catch (GLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}