1/* 2 * glRead/DrawPixels test 3 */ 4 5 6#include <GL/glew.h> 7#include <stdio.h> 8#include <string.h> 9#include <stdlib.h> 10#include "glut_wrap.h" 11 12static int Width = 250, Height = 250; 13static GLfloat Zoom = 1.0; 14 15static void Init(void) 16{ 17 fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 18 fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); 19 fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); 20 fflush(stderr); 21 glClearColor(0.3, 0.1, 0.3, 0.0); 22} 23 24static void Reshape(int width, int height) 25{ 26 Width = width / 2; 27 Height = height; 28 /* draw on left half (we'll read that area) */ 29 glViewport(0, 0, Width, height); 30 glMatrixMode(GL_PROJECTION); 31 glLoadIdentity(); 32 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); 33 glMatrixMode(GL_MODELVIEW); 34} 35 36static void Key(unsigned char key, int x, int y) 37{ 38 switch (key) { 39 case 27: 40 exit(0); 41 default: 42 break; 43 } 44 glutPostRedisplay(); 45} 46 47static void Draw(void) 48{ 49 GLfloat *image = (GLfloat *) malloc(Width * Height * 4 * sizeof(GLfloat)); 50 51 glClear(GL_COLOR_BUFFER_BIT); 52 53 glBegin(GL_TRIANGLES); 54 glColor3f(.8,0,0); 55 glVertex3f(-0.9, -0.9, -30.0); 56 glColor3f(0,.9,0); 57 glVertex3f( 0.9, -0.9, -30.0); 58 glColor3f(0,0,.7); 59 glVertex3f( 0.0, 0.9, -30.0); 60 glEnd(); 61 62 glBegin(GL_QUADS); 63 glColor3f(1, 1, 1); 64 glVertex2f(-1.0, -1.0); 65 glVertex2f(-0.9, -1.0); 66 glVertex2f(-0.9, -0.9); 67 glVertex2f(-1.0, -0.9); 68 glEnd(); 69 70 glReadPixels(0, 0, Width, Height, GL_RGBA, GL_FLOAT, image); 71 printf("Pixel(0,0) = %f, %f, %f, %f\n", 72 image[0], image[1], image[2], image[3]); 73 /* draw to right half of window */ 74 glWindowPos2iARB(Width, 0); 75 glPixelZoom(Zoom, Zoom); 76 glDrawPixels(Width, Height, GL_RGBA, GL_FLOAT, image); 77 free(image); 78 79 glutSwapBuffers(); 80} 81 82int main(int argc, char **argv) 83{ 84 glutInit(&argc, argv); 85 glutInitWindowPosition(0, 0); 86 glutInitWindowSize(Width*2, Height); 87 glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE); 88 if (glutCreateWindow(argv[0]) == GL_FALSE) { 89 exit(1); 90 } 91 92 if (argc > 1) 93 Zoom = atof(argv[1]); 94 95 glewInit(); 96 97 Init(); 98 99 glutReshapeFunc(Reshape); 100 glutKeyboardFunc(Key); 101 glutDisplayFunc(Draw); 102 glutMainLoop(); 103 return 0; 104} 105