//#include "Png_Funcs.h"
#include "OpenGL.h"

struct image_attr *im_p;

GLuint LoadTexture( struct image_attr *im ){
	GLuint texture;
	glGenTextures( 1, &texture );
	glBindTexture( GL_TEXTURE_2D, texture );
	glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, im->width, im->height, 0, GL_BGR, GL_UNSIGNED_BYTE, im->image);
	return texture;
}

void FreeTexture( GLuint texture ){
	glDeleteTextures( 1, &texture );
}

void BindTexture(GLuint texture){
	glBindTexture( GL_TEXTURE_2D, texture );
	//glRotatef( angle, 1.0f, 1.0f, 1.0f );

    glBegin (GL_QUADS);
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0); //with 
    glTexCoord2d(1.0,0.0); glVertex2d(+1.0,-1.0); //so that
    glTexCoord2d(1.0,1.0); glVertex2d(+1.0,+1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,+1.0);
    glEnd();
	//This is how texture coordinates are arranged
	//
	//  0,1   ---   1,1
	//       |     |
	//       |     |
	//       |     |
	//  0,0   ---   1,0


}

void display(void){
    glClearColor (0.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glEnable( GL_TEXTURE_2D );
	GLuint texture;
	texture = LoadTexture( im_p );
	BindTexture(texture);
	glutSwapBuffers();
	FreeTexture(texture);

}


void reshape(int w, int h){
    glViewport (0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
    glMatrixMode (GL_MODELVIEW);

}



int Run_GL(struct image_attr *im){
	im_p = im;
	int bla1;
	char **bla2 = NULL;
    glutInit (&bla1, bla2);
    //query_ext(); 
    glutInitDisplayMode (GLUT_DOUBLE| GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize (im->width, im->height);
    glutInitWindowPosition (0, 0);
    glutCreateWindow ("A basic OpenGL Window");
    glutDisplayFunc (display);
    glutIdleFunc (display);
    glutReshapeFunc (reshape);
    //glutMotionFunc(mouse_active);
    //glutPassiveMotionFunc(mouse_passive); 
    //query_ext();
    //glutSpecialFunc(special);
    glutMainLoop ();
    return 0;
}