#include "main.h" #include #include #include #include "control.h" /* * IMPORTANT - DO NOT CHANGE THIS FILE - IMPORTANT */ int window_width = 300; int window_height = 300; Image* currentImage = NULL; Image* originalImage = NULL; bool quietMode = false; bool textMode = false; int main (int argc, char** argv) { // initialize parameters char* toLoad = init(argc, argv); if (textMode) { if (toLoad) image_load(toLoad); textMenuLoop(); } else { // set up the window glutInit(&argc, &argv[0]); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(100,100); glutInitWindowSize(window_width, window_height); glutCreateWindow("hmc cs155 image processor"); // register call back functions glutDisplayFunc(display); glutReshapeFunc(unreshape); glClearColor(0.0,0.0,0.0,0.0); glDisable(GL_DEPTH_TEST); // setup main menu make_menu(); // register keyboard callback function glutKeyboardFunc(keyboard_func); if (toLoad) image_load(toLoad); // wait for something to happen glutMainLoop(); } return 0; } char* init (int argc, char** argv) { // init random number generator srand48(time(0)); char* toLoad = NULL; // parse the command line options bool noMoreArgs = false; bool noMoreFlags = false; if (argc > 1) { for (int i = 1; i < argc; i++) { if (noMoreArgs) usage(); if (!noMoreFlags && argv[i][0] == '-') { switch (argv[i][1]) { case 't': textMode = true; break; case 'q': quietMode = true; break; case '-': if (argv[i][2] == '\0') noMoreFlags = true; else usage(); break; default: usage(); } } else { noMoreArgs = true; // image_load(argv[i]); toLoad = argv[i]; } } } return toLoad; } void usage () { cerr << "usage: ./ip [ -t ] [ -q ] [ -- ] [ file ]" << endl; exit(-1); } void display () { if (textMode) return; // check if there have been any openGL problems GLenum errCode = glGetError(); if (errCode != GL_NO_ERROR) { const GLubyte* errString = gluErrorString(errCode); cerr << "OpenGL error: " << errString << endl; } // clear the frame buffer glClear(GL_COLOR_BUFFER_BIT); // draw the image if (currentImage) currentImage->glDrawPixelsWrapper(); // swap buffers glutSwapBuffers(); } void unreshape (int width, int height) { // don't allow user to manuall resize the window reshape(window_width, window_height); } void reshape (int width, int height) { // set window height and width window_width = max(width, 64); window_height = max(height, 64); if (textMode) return; // change the actual window's size glutReshapeWindow(window_width, window_height); // the lower left corner of the viewport is 0,0 // the upper right corner is width, height glViewport(0, 0, (GLint) window_width, (GLint) window_height); // setup orthographic projection matrix glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, window_width, 0.0, window_height); // default mode should be modelview glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }