1 #define GL_GLEXT_PROTOTYPES
8 #define PIXEL_CENTER(x) ((long)(x) + 0.5)
14 #define OPENGL_WIDTH 48
15 #define OPENGL_HEIGHT 13
18 GLenum provoking
= GL_LAST_VERTEX_CONVENTION_EXT
;
19 GLenum rgb
, doubleBuffer
, windType
;
24 GLubyte OpenGL_bits
[] = {
25 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
26 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
27 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
28 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
29 0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,
30 0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
31 0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,
32 0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
33 0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,
34 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
35 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,
36 0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
37 0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,
43 static void Init(void)
50 static void Reshape(int width
, int height
)
54 windH
= (GLint
)height
;
57 static void RotateColorMask(void)
59 static GLint rotation
= 0;
61 rotation
= (rotation
+ 1) & 0x3;
64 glColorMask(GL_TRUE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
68 glColorMask(GL_FALSE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
72 glColorMask(GL_TRUE
, GL_FALSE
, GL_TRUE
, GL_TRUE
);
76 glColorMask(GL_TRUE
, GL_TRUE
, GL_FALSE
, GL_TRUE
);
82 static void Key(unsigned char key
, int x
, int y
)
98 if (provoking
== GL_FIRST_VERTEX_CONVENTION_EXT
) {
99 printf("provoke last\n");
100 provoking
= GL_LAST_VERTEX_CONVENTION_EXT
;
103 printf("provoke first\n");
104 provoking
= GL_FIRST_VERTEX_CONVENTION_EXT
;
106 glProvokingVertexEXT(provoking
);
115 static void Viewport(GLint row
, GLint column
)
119 boxW
= (windW
- (COLS
+ 1) * GAP
) / COLS
;
120 boxH
= (windH
- (ROWS
+ 1) * GAP
) / ROWS
;
122 x
= GAP
+ column
* (boxW
+ GAP
);
123 y
= GAP
+ row
* (boxH
+ GAP
);
125 glViewport(x
, y
, boxW
, boxH
);
127 glMatrixMode(GL_PROJECTION
);
129 glOrtho(-boxW
/2, boxW
/2, -boxH
/2, boxH
/2, 0.0, 1.0);
130 glMatrixMode(GL_MODELVIEW
);
132 glEnable(GL_SCISSOR_TEST
);
133 glScissor(x
, y
, boxW
, boxH
);
136 static void Point(void)
141 SetColor(COLOR_WHITE
);
143 for (i
= 1; i
< 8; i
++) {
145 SetColor(COLOR_BLACK
+i
);
158 static void Lines(void)
164 glTranslatef(-12, 0, 0);
165 for (i
= 1; i
< 8; i
++) {
167 SetColor(COLOR_BLACK
+i
);
168 glVertex2i(-boxW
/4, -boxH
/4);
169 SetColor(COLOR_BLACK
+i
+1);
170 glVertex2i(boxW
/4, boxH
/4);
172 glTranslatef(4, 0, 0);
182 static void LineStrip(void)
185 glBegin(GL_LINE_STRIP
);
187 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(-boxH
/4));
188 SetColor(COLOR_GREEN
);
189 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(boxH
/4));
190 SetColor(COLOR_BLUE
);
191 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(boxH
/4));
192 SetColor(COLOR_WHITE
);
193 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(-boxH
/4));
196 glBegin(GL_LINE_STRIP
);
201 static void LineLoop(void)
204 glBegin(GL_LINE_LOOP
);
206 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(-boxH
/4));
207 SetColor(COLOR_GREEN
);
208 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(boxH
/4));
209 SetColor(COLOR_BLUE
);
210 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(boxH
/4));
211 SetColor(COLOR_WHITE
);
212 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(-boxH
/4));
215 glEnable(GL_LOGIC_OP
);
219 glBlendFunc(GL_ONE
, GL_ONE
);
221 SetColor(COLOR_MAGENTA
);
222 glBegin(GL_LINE_LOOP
);
223 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(-boxH
/8));
224 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(boxH
/8));
226 glBegin(GL_LINE_LOOP
);
227 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(boxH
/8+5));
228 glVertex2f(PIXEL_CENTER(boxW
/8), PIXEL_CENTER(boxH
/8+5));
230 glDisable(GL_LOGIC_OP
);
233 SetColor(COLOR_GREEN
);
238 glBegin(GL_LINE_LOOP
);
243 static void Bitmap(void)
247 SetColor(COLOR_GREEN
);
248 glVertex2i(-boxW
/2, 0);
249 glVertex2i(boxW
/2, 0);
250 glVertex2i(0, -boxH
/2);
251 glVertex2i(0, boxH
/2);
254 glVertex2i(0, -3+OPENGL_HEIGHT
);
255 SetColor(COLOR_BLUE
);
257 glVertex2i(OPENGL_WIDTH
, -3);
260 SetColor(COLOR_GREEN
);
262 glPixelStorei(GL_UNPACK_LSB_FIRST
, GL_TRUE
);
263 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
266 glBitmap(OPENGL_WIDTH
, OPENGL_HEIGHT
, 0, 3, 0.0, 0.0, OpenGL_bits
);
269 static void Triangles(void)
272 glBegin(GL_TRIANGLES
);
273 SetColor(COLOR_GREEN
);
274 glVertex2i(-boxW
/4, -boxH
/4);
276 glVertex2i(-boxW
/8, -boxH
/16);
277 SetColor(COLOR_BLUE
);
278 glVertex2i(boxW
/8, -boxH
/16);
280 SetColor(COLOR_GREEN
);
281 glVertex2i(-boxW
/4, boxH
/4);
283 glVertex2i(-boxW
/8, boxH
/16);
284 SetColor(COLOR_BLUE
);
285 glVertex2i(boxW
/8, boxH
/16);
288 glBegin(GL_TRIANGLES
);
290 glVertex2i(-100, 100);
294 static void TriangleStrip(void)
297 glBegin(GL_TRIANGLE_STRIP
);
298 SetColor(COLOR_GREEN
);
299 glVertex2i(-boxW
/4, -boxH
/4);
301 glVertex2i(-boxW
/4, boxH
/4);
302 SetColor(COLOR_BLUE
);
303 glVertex2i(0, -boxH
/4);
304 SetColor(COLOR_WHITE
);
305 glVertex2i(0, boxH
/4);
306 SetColor(COLOR_CYAN
);
307 glVertex2i(boxW
/4, -boxH
/4);
308 SetColor(COLOR_YELLOW
);
309 glVertex2i(boxW
/4, boxH
/4);
312 glBegin(GL_TRIANGLE_STRIP
);
314 glVertex2i(-100, 100);
318 static void TriangleFan(void)
321 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
333 vx
[0][0] = x0
; vx
[0][1] = y1
;
334 vx
[1][0] = x0
; vx
[1][1] = y2
;
335 vx
[2][0] = x1
; vx
[2][1] = y3
;
336 vx
[3][0] = x2
; vx
[3][1] = y3
;
337 vx
[4][0] = x3
; vx
[4][1] = y2
;
338 vx
[5][0] = x3
; vx
[5][1] = y1
;
339 vx
[6][0] = x2
; vx
[6][1] = y0
;
340 vx
[7][0] = x1
; vx
[7][1] = y0
;
342 glBegin(GL_TRIANGLE_FAN
);
343 SetColor(COLOR_WHITE
);
345 for (i
= 0; i
< 8; i
++) {
346 SetColor(COLOR_WHITE
-i
);
351 glBegin(GL_TRIANGLE_FAN
);
353 glVertex2i(-100, 100);
357 static void Rect(void)
360 SetColor(COLOR_GREEN
);
361 glRecti(-boxW
/4, -boxH
/4, boxW
/4, boxH
/4);
364 static void PolygonFunc(void)
367 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
379 vx
[0][0] = x0
; vx
[0][1] = y1
;
380 vx
[1][0] = x0
; vx
[1][1] = y2
;
381 vx
[2][0] = x1
; vx
[2][1] = y3
;
382 vx
[3][0] = x2
; vx
[3][1] = y3
;
383 vx
[4][0] = x3
; vx
[4][1] = y2
;
384 vx
[5][0] = x3
; vx
[5][1] = y1
;
385 vx
[6][0] = x2
; vx
[6][1] = y0
;
386 vx
[7][0] = x1
; vx
[7][1] = y0
;
389 for (i
= 0; i
< 8; i
++) {
390 SetColor(COLOR_WHITE
-i
);
397 glVertex2i(100, 100);
401 static void Quads(void)
405 SetColor(COLOR_GREEN
);
406 glVertex2i(-boxW
/4, -boxH
/4);
408 glVertex2i(-boxW
/8, -boxH
/16);
409 SetColor(COLOR_BLUE
);
410 glVertex2i(boxW
/8, -boxH
/16);
411 SetColor(COLOR_WHITE
);
412 glVertex2i(boxW
/4, -boxH
/4);
414 SetColor(COLOR_GREEN
);
415 glVertex2i(-boxW
/4, boxH
/4);
417 glVertex2i(-boxW
/8, boxH
/16);
418 SetColor(COLOR_BLUE
);
419 glVertex2i(boxW
/8, boxH
/16);
420 SetColor(COLOR_WHITE
);
421 glVertex2i(boxW
/4, boxH
/4);
426 glVertex2i(100, 100);
427 glVertex2i(-100, 100);
431 static void QuadStrip(void)
434 glBegin(GL_QUAD_STRIP
);
435 SetColor(COLOR_GREEN
);
436 glVertex2i(-boxW
/4, -boxH
/4);
438 glVertex2i(-boxW
/4, boxH
/4);
439 SetColor(COLOR_BLUE
);
440 glVertex2i(0, -boxH
/4);
441 SetColor(COLOR_WHITE
);
442 glVertex2i(0, boxH
/4);
443 SetColor(COLOR_CYAN
);
444 glVertex2i(boxW
/4, -boxH
/4);
445 SetColor(COLOR_YELLOW
);
446 glVertex2i(boxW
/4, boxH
/4);
449 glBegin(GL_QUAD_STRIP
);
451 glVertex2i(100, 100);
452 glVertex2i(-100, 100);
456 static void Draw(void)
459 glViewport(0, 0, windW
, windH
);
460 glDisable(GL_SCISSOR_TEST
);
462 glPushAttrib(GL_COLOR_BUFFER_BIT
);
464 glColorMask(1, 1, 1, 1);
467 glClearColor(0.0, 0.0, 0.0, 0.0);
468 glClear(GL_COLOR_BUFFER_BIT
);
473 glShadeModel(GL_SMOOTH
);
475 glShadeModel(GL_FLAT
);
479 glPolygonMode(GL_FRONT_AND_BACK
, GL_FILL
);
481 glPolygonMode(GL_FRONT_AND_BACK
, GL_LINE
);
484 Viewport(0, 0); Point();
485 Viewport(0, 1); Lines();
486 Viewport(0, 2); LineStrip();
487 Viewport(0, 3); LineLoop();
489 Viewport(1, 0); Bitmap();
490 Viewport(1, 1); TriangleFan();
491 Viewport(1, 2); Triangles();
492 Viewport(1, 3); TriangleStrip();
494 Viewport(2, 0); Rect();
495 Viewport(2, 1); PolygonFunc();
496 Viewport(2, 2); Quads();
497 Viewport(2, 3); QuadStrip();
506 static GLenum
Args(int argc
, char **argv
)
511 doubleBuffer
= GL_FALSE
;
513 for (i
= 1; i
< argc
; i
++) {
514 if (strcmp(argv
[i
], "-ci") == 0) {
516 } else if (strcmp(argv
[i
], "-rgb") == 0) {
518 } else if (strcmp(argv
[i
], "-sb") == 0) {
519 doubleBuffer
= GL_FALSE
;
520 } else if (strcmp(argv
[i
], "-db") == 0) {
521 doubleBuffer
= GL_TRUE
;
523 printf("%s (Bad option).\n", argv
[i
]);
530 int main(int argc
, char **argv
)
532 glutInit(&argc
, argv
);
534 if (Args(argc
, argv
) == GL_FALSE
) {
540 glutInitWindowPosition(0, 0); glutInitWindowSize( windW
, windH
);
542 windType
= (rgb
) ? GLUT_RGB
: GLUT_INDEX
;
543 windType
|= (doubleBuffer
) ? GLUT_DOUBLE
: GLUT_SINGLE
;
544 glutInitDisplayMode(windType
);
546 if (glutCreateWindow("Primitive Test") == GL_FALSE
) {
554 glutReshapeFunc(Reshape
);
555 glutKeyboardFunc(Key
);
556 glutDisplayFunc(Draw
);