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