#include <GL/gl.h>
#include <GL/glu.h>
#include "aux.h"

GLenum doubleBuffer, directRender;
GLint windW, windH;

char *fileName;
AUX_RGBImageRec *image;
float point[3];
float zoom;
GLint x, y;


static void myinit(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    x = 0;
    y = windH;
    zoom = 1.8;
}

static void my_reshape(int width, int height)
{

    windW = (GLint)width;
    windH = (GLint)height;

    glViewport(0, 0, windW, windH);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, windW, 0, windH);
    glMatrixMode(GL_MODELVIEW);
}

static void plusKey(void) { zoom += 0.2; printf("%f\n",zoom); }
static void minusKey(void) { zoom -= 0.2; if (zoom < 0.2) { zoom = 0.2; } printf("%f\n",zoom); }

void Mouse(AUX_EVENTREC *event)
{

    x = event->data[AUX_MOUSEX];
    y = event->data[AUX_MOUSEY];

}

static void display(void)
{

    glClear(GL_COLOR_BUFFER_BIT);

    point[0] = (windW / 2) - (image->sizeX / 2);
    point[1] = (windH / 2) - (image->sizeY / 2);
    point[2] = 0;
    glRasterPos3fv(point);

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelZoom(1.0, 1.0);
    glDrawPixels(image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
		 image->data);

    point[0] = (float)x;
    point[1] = windH - (float)y;
    point[2] = 0.0;
    glRasterPos3fv(point);

    glPixelZoom(zoom, zoom);
    glCopyPixels((windW/2)-(image->sizeX/2),
		 (windH/2)-(image->sizeY/2),
		 image->sizeX, image->sizeY, GL_COLOR);

    glFlush();

    if (doubleBuffer) {
	auxSwapBuffers();
    }
}

static GLenum Args(int argc, char **argv)
{
    GLint i;

    doubleBuffer = GL_FALSE;
    directRender = GL_FALSE;

    for (i = 1; i < argc; i++) {
	if (strcmp(argv[i], "-sb") == 0) {
	    doubleBuffer = GL_FALSE;
	} else if (strcmp(argv[i], "-db") == 0) {
	    doubleBuffer = GL_TRUE;
	} else if (strcmp(argv[i], "-dr") == 0) {
	    directRender = GL_TRUE;
	} else if (strcmp(argv[i], "-ir") == 0) {
	    directRender = GL_FALSE;
	} else if (strcmp(argv[i], "-f") == 0) {
	    if (i+1 >= argc || argv[i+1][0] == '-') {
		printf("-f (No file name).\n");
		return GL_FALSE;
	    } else {
		fileName = argv[++i];
	    }
	} else {
	    printf("%s (Bad option).\n", argv[i]);
	    return GL_FALSE;
	}
    }
    return GL_TRUE;
}

int main(int argc, char **argv)
{
    GLenum type;

    if (Args(argc, argv) == GL_FALSE) {
	auxQuit();
    }

    image = auxRGBImageLoad(fileName);

    windW = 300;
    windH = 300;
    auxInitPosition(0, 0, windW, windH);

    type = AUX_RGB;
    type |= (doubleBuffer) ? AUX_DOUBLE : AUX_SINGLE;
    type |= (directRender) ? AUX_DIRECT : AUX_INDIRECT;
    auxInitDisplayMode(type);

    if (auxInitWindow("Copy Test") == GL_FALSE) {
	auxQuit();
    }

    myinit();

    auxReshapeFunc(my_reshape);
    auxKeyFunc(AUX_Z,plusKey);
    auxKeyFunc(AUX_z,minusKey);
    auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,Mouse);
    auxMainLoop(display);
    return 0;
}