#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; }