/* Prosty przyklad wykorzystania bibliotek OpenGL/glfw
 * do otwierania okienka i rysowania na bitmapie 
 */
#include <stdlib.h>
#include <stdio.h>
#include <GL/glfw.h>

int XRES = 320;
int YRES = 240;

GLubyte* buffer;

void PutGrayPixel(int x, int y, GLbyte r)
{
   buffer[3*x+3*y*XRES]   = r;
   buffer[3*x+3*y*XRES+1] = r;
   buffer[3*x+3*y*XRES+2] = r;
}

void display()
{
   glClearColor(0.0, 0.0, 0.0, 1.0);
   glClear(GL_COLOR_BUFFER_BIT);
   glRasterPos2i(0, 0);
   glDrawPixels(XRES, YRES, GL_RGB, GL_UNSIGNED_BYTE, buffer);
   glFlush();
}

void GLFWCALL reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}


/* change view angle, exit upon ESC */
void GLFWCALL key( int k, int action )
{
  if( action != GLFW_PRESS ) return;

  switch (k) {
  case GLFW_KEY_ESC:
    exit(0);
    break;
  case GLFW_KEY_SPACE:
    PutGrayPixel(rand() % XRES, rand() % YRES, 255);
    break;
  default:
    return;
  }
}


int main(int argc,char *argv[])
{
   int i;
   GLFWvidmode mode;

   buffer = (GLubyte*)malloc(XRES*YRES*3);
   memset(buffer,     64,     XRES*YRES*3);
   for (i=0; i<YRES && i<XRES; i++)
      PutGrayPixel(i,i,128);

   if( !glfwInit() ) {
      fprintf(stderr, "GLFW initialization failed\n");
      return 1;
   }
   glfwGetDesktopMode(&mode);
   if( !glfwOpenWindow(XRES, YRES,
                       mode.RedBits, mode.GreenBits, mode.BlueBits,
                       0, 24, 0, GLFW_WINDOW ) ) {
      fprintf(stderr, "Cannot open GLFW window\n");
      glfwTerminate();
      return 1;
   }
   glfwEnable(GLFW_MOUSE_CURSOR);
   glfwEnable(GLFW_KEY_REPEAT);
   glfwSetWindowTitle("Bitmap  example using GLFW");

   glfwSetWindowSizeCallback( reshape );
   glfwSetKeyCallback( key );

   while( glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC) ) {
      if (glfwGetKey(GLFW_KEY_SPACE))
         PutGrayPixel(rand() % XRES, rand() % YRES, 255);
      display();
      glfwSwapBuffers();
   }
   glfwTerminate();
   return 0;
}
