blob: 82d32b0705c29b8a1204c81f7fe4d4bd06704ad9 [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001
2/*
3 * glDrawPixels demo/test/benchmark
4 *
5 * Brian Paul September 25, 1997 This file is in the public domain.
6 */
7
jtgafb833d1999-08-19 00:55:39 +00008#include <stdio.h>
9#include <stdlib.h>
10#include <math.h>
Brian Paul2d84ed82005-01-09 17:39:06 +000011#include <string.h>
jtgafb833d1999-08-19 00:55:39 +000012#include <GL/glut.h>
13
Brian Paul2d84ed82005-01-09 17:39:06 +000014#include "readtex.h"
jtgafb833d1999-08-19 00:55:39 +000015
16#define IMAGE_FILE "../images/girl.rgb"
17
18static int ImgWidth, ImgHeight;
19static GLenum ImgFormat;
20static GLubyte *Image = NULL;
21
22static int Xpos, Ypos;
23static int SkipPixels, SkipRows;
24static int DrawWidth, DrawHeight;
25static int Scissor = 0;
Brian Paul6a731f32002-01-26 17:49:30 +000026static int Fog = 0;
27static GLfloat Zpos = -1.0;
jtgafb833d1999-08-19 00:55:39 +000028static float Xzoom, Yzoom;
Brian Pauld13c0a91999-10-21 22:13:58 +000029static GLboolean DrawFront = GL_FALSE;
Brian Paul9d3e5db2000-09-08 21:45:21 +000030static GLboolean Dither = GL_TRUE;
jtgafb833d1999-08-19 00:55:39 +000031
32
33static void Reset( void )
34{
35 Xpos = Ypos = 20;
36 DrawWidth = ImgWidth;
37 DrawHeight = ImgHeight;
38 SkipPixels = SkipRows = 0;
39 Scissor = 0;
Brian Paul6a731f32002-01-26 17:49:30 +000040 Fog = 0;
41 Zpos = -1.0;
jtgafb833d1999-08-19 00:55:39 +000042 Xzoom = Yzoom = 1.0;
43}
44
45
46static void Display( void )
47{
48 glClear( GL_COLOR_BUFFER_BIT );
49
50#if 0
51 glRasterPos2i(Xpos, Ypos);
52#else
53 /* This allows negative raster positions: */
Brian Paul6a731f32002-01-26 17:49:30 +000054 glRasterPos3f(0, 0, Zpos);
jtgafb833d1999-08-19 00:55:39 +000055 glBitmap(0, 0, 0, 0, Xpos, Ypos, NULL);
56#endif
57
58 glPixelStorei(GL_UNPACK_SKIP_PIXELS, SkipPixels);
59 glPixelStorei(GL_UNPACK_SKIP_ROWS, SkipRows);
60
61 glPixelZoom( Xzoom, Yzoom );
62
63 if (Scissor)
64 glEnable(GL_SCISSOR_TEST);
65
Brian Paul6a731f32002-01-26 17:49:30 +000066 if (Fog)
67 glEnable(GL_FOG);
68
jtgafb833d1999-08-19 00:55:39 +000069 glDrawPixels(DrawWidth, DrawHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
70
71 glDisable(GL_SCISSOR_TEST);
Brian Paul6a731f32002-01-26 17:49:30 +000072 glDisable(GL_FOG);
jtgafb833d1999-08-19 00:55:39 +000073
Brian Pauld13c0a91999-10-21 22:13:58 +000074 if (!DrawFront)
75 glutSwapBuffers();
jtgafb833d1999-08-19 00:55:39 +000076}
77
78
79static void Benchmark( void )
80{
81 int startTime, endTime;
82 int draws = 500;
83 double seconds, pixelsPerSecond;
84
85 printf("Benchmarking...\n");
86 /* GL set-up */
87 glPixelStorei(GL_UNPACK_SKIP_PIXELS, SkipPixels);
88 glPixelStorei(GL_UNPACK_SKIP_ROWS, SkipRows);
89 glPixelZoom( Xzoom, Yzoom );
90 if (Scissor)
91 glEnable(GL_SCISSOR_TEST);
Brian Paul6a731f32002-01-26 17:49:30 +000092 if (Fog)
93 glEnable(GL_FOG);
jtgafb833d1999-08-19 00:55:39 +000094
Brian Pauld13c0a91999-10-21 22:13:58 +000095 if (DrawFront)
96 glDrawBuffer(GL_FRONT);
97 else
98 glDrawBuffer(GL_BACK);
99
jtgafb833d1999-08-19 00:55:39 +0000100 /* Run timing test */
101 draws = 0;
102 startTime = glutGet(GLUT_ELAPSED_TIME);
103 do {
104 glDrawPixels(DrawWidth, DrawHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
105 draws++;
106 endTime = glutGet(GLUT_ELAPSED_TIME);
107 } while (endTime - startTime < 4000); /* 4 seconds */
108
109 /* GL clean-up */
110 glDisable(GL_SCISSOR_TEST);
Brian Paul6a731f32002-01-26 17:49:30 +0000111 glDisable(GL_FOG);
jtgafb833d1999-08-19 00:55:39 +0000112
113 /* Results */
114 seconds = (double) (endTime - startTime) / 1000.0;
115 pixelsPerSecond = draws * DrawWidth * DrawHeight / seconds;
116 printf("Result: %d draws in %f seconds = %f pixels/sec\n",
117 draws, seconds, pixelsPerSecond);
118}
119
120
121static void Reshape( int width, int height )
122{
123 glViewport( 0, 0, width, height );
124 glMatrixMode( GL_PROJECTION );
125 glLoadIdentity();
Brian Paul6a731f32002-01-26 17:49:30 +0000126 glOrtho( 0.0, width, 0.0, height, 0.0, 2.0 );
jtgafb833d1999-08-19 00:55:39 +0000127 glMatrixMode( GL_MODELVIEW );
128 glLoadIdentity();
129
130 glScissor(width/4, height/4, width/2, height/2);
131}
132
133
134static void Key( unsigned char key, int x, int y )
135{
136 (void) x;
137 (void) y;
138 switch (key) {
139 case ' ':
140 Reset();
141 break;
Brian Paul9d3e5db2000-09-08 21:45:21 +0000142 case 'd':
143 Dither = !Dither;
144 if (Dither)
145 glEnable(GL_DITHER);
146 else
147 glDisable(GL_DITHER);
148 break;
jtgafb833d1999-08-19 00:55:39 +0000149 case 'w':
150 if (DrawWidth > 0)
151 DrawWidth--;
152 break;
153 case 'W':
154 DrawWidth++;
155 break;
156 case 'h':
157 if (DrawHeight > 0)
158 DrawHeight--;
159 break;
160 case 'H':
161 DrawHeight++;
162 break;
163 case 'p':
164 if (SkipPixels > 0)
165 SkipPixels--;
166 break;
167 case 'P':
168 SkipPixels++;
169 break;
170 case 'r':
171 if (SkipRows > 0)
172 SkipRows--;
173 break;
174 case 'R':
175 SkipRows++;
176 break;
177 case 's':
178 Scissor = !Scissor;
179 break;
180 case 'x':
181 Xzoom -= 0.1;
182 break;
183 case 'X':
184 Xzoom += 0.1;
185 break;
186 case 'y':
187 Yzoom -= 0.1;
188 break;
189 case 'Y':
190 Yzoom += 0.1;
191 break;
Brian Paul6a731f32002-01-26 17:49:30 +0000192 case 'z':
193 Zpos -= 0.1;
194 printf("RasterPos Z = %g\n", Zpos);
195 break;
196 case 'Z':
197 Zpos += 0.1;
198 printf("RasterPos Z = %g\n", Zpos);
199 break;
jtgafb833d1999-08-19 00:55:39 +0000200 case 'b':
201 Benchmark();
202 break;
Brian Paul6a731f32002-01-26 17:49:30 +0000203 case 'F':
204 Fog = !Fog;
205 printf("Fog %d\n", Fog);
206 break;
Brian Pauld13c0a91999-10-21 22:13:58 +0000207 case 'f':
208 DrawFront = !DrawFront;
209 if (DrawFront)
210 glDrawBuffer(GL_FRONT);
211 else
212 glDrawBuffer(GL_BACK);
213 printf("glDrawBuffer(%s)\n", DrawFront ? "GL_FRONT" : "GL_BACK");
214 break;
jtgafb833d1999-08-19 00:55:39 +0000215 case 27:
216 exit(0);
217 break;
218 }
219 glutPostRedisplay();
220}
221
222
223static void SpecialKey( int key, int x, int y )
224{
225 (void) x;
226 (void) y;
227 switch (key) {
228 case GLUT_KEY_UP:
229 Ypos += 1;
230 break;
231 case GLUT_KEY_DOWN:
232 Ypos -= 1;
233 break;
234 case GLUT_KEY_LEFT:
235 Xpos -= 1;
236 break;
237 case GLUT_KEY_RIGHT:
238 Xpos += 1;
239 break;
240 }
241 glutPostRedisplay();
242}
243
244
Brian Paulb271ce82004-11-10 23:16:22 +0000245static void Init( GLboolean ciMode, const char *filename )
jtgafb833d1999-08-19 00:55:39 +0000246{
Brian Paul6a731f32002-01-26 17:49:30 +0000247 static const GLfloat fogColor[4] = {0, 1, 0, 0};
248
jtgafb833d1999-08-19 00:55:39 +0000249 printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
250 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
251
Brian Paulb271ce82004-11-10 23:16:22 +0000252 Image = LoadRGBImage( filename, &ImgWidth, &ImgHeight, &ImgFormat );
jtgafb833d1999-08-19 00:55:39 +0000253 if (!Image) {
Brian Paulb271ce82004-11-10 23:16:22 +0000254 printf("Couldn't read %s\n", filename);
jtgafb833d1999-08-19 00:55:39 +0000255 exit(0);
256 }
257
258 if (ciMode) {
259 /* Convert RGB image to grayscale */
Brian Paulf02a5f62002-07-12 15:54:01 +0000260 GLubyte *indexImage = (GLubyte *) malloc( ImgWidth * ImgHeight );
jtgafb833d1999-08-19 00:55:39 +0000261 GLint i;
262 for (i=0; i<ImgWidth*ImgHeight; i++) {
263 int gray = Image[i*3] + Image[i*3+1] + Image[i*3+2];
264 indexImage[i] = gray / 3;
265 }
266 free(Image);
267 Image = indexImage;
268 ImgFormat = GL_COLOR_INDEX;
269
270 for (i=0;i<255;i++) {
271 float g = i / 255.0;
272 glutSetColor(i, g, g, g);
273 }
274 }
275
276 printf("Loaded %d by %d image\n", ImgWidth, ImgHeight );
277
278 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
279 glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth);
280
Brian Paul6a731f32002-01-26 17:49:30 +0000281 glFogi(GL_FOG_MODE, GL_LINEAR);
282 glFogf(GL_FOG_START, 0);
283 glFogf(GL_FOG_END, 2);
284 glFogfv(GL_FOG_COLOR, fogColor);
285
jtgafb833d1999-08-19 00:55:39 +0000286 Reset();
287}
288
289
290static void Usage(void)
291{
292 printf("Keys:\n");
Brian Paul8de4a381999-10-28 18:23:29 +0000293 printf(" SPACE Reset Parameters\n");
jtgafb833d1999-08-19 00:55:39 +0000294 printf(" Up/Down Move image up/down\n");
295 printf(" Left/Right Move image left/right\n");
Brian Paul8de4a381999-10-28 18:23:29 +0000296 printf(" x Decrease X-axis PixelZoom\n");
297 printf(" X Increase X-axis PixelZoom\n");
298 printf(" y Decrease Y-axis PixelZoom\n");
299 printf(" Y Increase Y-axis PixelZoom\n");
300 printf(" w Decrease glDrawPixels width*\n");
301 printf(" W Increase glDrawPixels width*\n");
302 printf(" h Decrease glDrawPixels height*\n");
303 printf(" H Increase glDrawPixels height*\n");
304 printf(" p Decrease GL_UNPACK_SKIP_PIXELS*\n");
305 printf(" P Increase GL_UNPACK_SKIP_PIXELS*\n");
306 printf(" r Decrease GL_UNPACK_SKIP_ROWS*\n");
307 printf(" R Increase GL_UNPACK_SKIP_ROWS*\n");
jtgafb833d1999-08-19 00:55:39 +0000308 printf(" s Toggle GL_SCISSOR_TEST\n");
Brian Paul6a731f32002-01-26 17:49:30 +0000309 printf(" F Toggle GL_FOG\n");
310 printf(" z Decrease RasterPos Z\n");
311 printf(" Z Increase RasterPos Z\n");
312
Brian Pauld13c0a91999-10-21 22:13:58 +0000313 printf(" f Toggle front/back buffer drawing\n");
jtgafb833d1999-08-19 00:55:39 +0000314 printf(" b Benchmark test\n");
315 printf(" ESC Exit\n");
Brian Paul8de4a381999-10-28 18:23:29 +0000316 printf("* Warning: no limits are imposed on these parameters so it's\n");
317 printf(" possible to cause a segfault if you go too far.\n");
jtgafb833d1999-08-19 00:55:39 +0000318}
319
320
321int main( int argc, char *argv[] )
322{
323 GLboolean ciMode = GL_FALSE;
Brian Paulb271ce82004-11-10 23:16:22 +0000324 const char *filename = IMAGE_FILE;
325 int i = 1;
jtgafb833d1999-08-19 00:55:39 +0000326
Brian Paulb271ce82004-11-10 23:16:22 +0000327 if (argc > i && strcmp(argv[i], "-ci")==0) {
jtgafb833d1999-08-19 00:55:39 +0000328 ciMode = GL_TRUE;
Brian Paulb271ce82004-11-10 23:16:22 +0000329 i++;
330 }
331 if (argc > i) {
332 filename = argv[i];
jtgafb833d1999-08-19 00:55:39 +0000333 }
334
335 glutInit( &argc, argv );
336 glutInitWindowPosition( 0, 0 );
337 glutInitWindowSize( 500, 400 );
338
339 if (ciMode)
340 glutInitDisplayMode( GLUT_INDEX | GLUT_DOUBLE );
341 else
Brian Paul9d3e5db2000-09-08 21:45:21 +0000342 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE);
jtgafb833d1999-08-19 00:55:39 +0000343
344 glutCreateWindow(argv[0]);
345
Brian Paulb271ce82004-11-10 23:16:22 +0000346 Init(ciMode, filename);
jtgafb833d1999-08-19 00:55:39 +0000347 Usage();
348
349 glutReshapeFunc( Reshape );
350 glutKeyboardFunc( Key );
351 glutSpecialFunc( SpecialKey );
352 glutDisplayFunc( Display );
353
354 glutMainLoop();
355 return 0;
356}