1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include "glut_wrap.h"
5 
6 
7 #define PIXEL_CENTER(x) ((long)(x) + 0.5)
8 
9 #define GAP 10
10 #define ROWS 3
11 #define COLS 4
12 
13 #define OPENGL_WIDTH 48
14 #define OPENGL_HEIGHT 13
15 
16 
17 GLenum rgb, doubleBuffer, windType;
18 GLint windW, windH;
19 
20 GLenum mode1, mode2;
21 GLint boxW, boxH;
22 GLubyte OpenGL_bits[] = {
23    0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
24    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
25    0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
26    0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
27    0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,
28    0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
29    0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,
30    0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
31    0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,
32    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
33    0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,
34    0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
35    0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,
36 };
37 
38 
39 #include "tkmap.c"
40 
Init(void)41 static void Init(void)
42 {
43 
44     mode1 = GL_TRUE;
45     mode2 = GL_TRUE;
46 }
47 
Reshape(int width,int height)48 static void Reshape(int width, int height)
49 {
50 
51     windW = (GLint)width;
52     windH = (GLint)height;
53 }
54 
RotateColorMask(void)55 static void RotateColorMask(void)
56 {
57     static GLint rotation = 0;
58 
59     rotation = (rotation + 1) & 0x3;
60     switch (rotation) {
61       case 0:
62 	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
63 	glIndexMask( 0xff );
64 	break;
65       case 1:
66 	glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
67 	glIndexMask(0xFE);
68 	break;
69       case 2:
70 	glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
71 	glIndexMask(0xFD);
72 	break;
73       case 3:
74 	glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
75 	glIndexMask(0xFB);
76 	break;
77     }
78 }
79 
Key(unsigned char key,int x,int y)80 static void Key(unsigned char key, int x, int y)
81 {
82 
83     switch (key) {
84       case 27:
85 	exit(1);
86       case '1':
87 	mode1 = !mode1;
88 	break;
89       case '2':
90 	mode2 = !mode2;
91 	break;
92       case '3':
93 	RotateColorMask();
94 	break;
95       default:
96 	return;
97     }
98 
99     glutPostRedisplay();
100 }
101 
Viewport(GLint row,GLint column)102 static void Viewport(GLint row, GLint column)
103 {
104     GLint x, y;
105 
106     boxW = (windW - (COLS + 1) * GAP) / COLS;
107     boxH = (windH - (ROWS + 1) * GAP) / ROWS;
108 
109     x = GAP + column * (boxW + GAP);
110     y = GAP + row * (boxH + GAP);
111 
112     glViewport(x, y, boxW, boxH);
113 
114     glMatrixMode(GL_PROJECTION);
115     glLoadIdentity();
116     glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
117     glMatrixMode(GL_MODELVIEW);
118 
119     glEnable(GL_SCISSOR_TEST);
120     glScissor(x, y, boxW, boxH);
121 }
122 
Point(void)123 static void Point(void)
124 {
125     GLint i;
126 
127     glBegin(GL_POINTS);
128 	SetColor(COLOR_WHITE);
129 	glVertex2i(0, 0);
130 	for (i = 1; i < 8; i++) {
131 	    GLint j = i * 2;
132 	    SetColor(COLOR_BLACK+i);
133 	    glVertex2i(-j, -j);
134 	    glVertex2i(-j, 0);
135 	    glVertex2i(-j, j);
136 	    glVertex2i(0, j);
137 	    glVertex2i(j, j);
138 	    glVertex2i(j, 0);
139 	    glVertex2i(j, -j);
140 	    glVertex2i(0, -j);
141 	}
142     glEnd();
143 }
144 
Lines(void)145 static void Lines(void)
146 {
147     GLint i;
148 
149     glPushMatrix();
150 
151     glTranslatef(-12, 0, 0);
152     for (i = 1; i < 8; i++) {
153 	SetColor(COLOR_BLACK+i);
154 	glBegin(GL_LINES);
155 	    glVertex2i(-boxW/4, -boxH/4);
156 	    glVertex2i(boxW/4, boxH/4);
157 	glEnd();
158 	glTranslatef(4, 0, 0);
159     }
160 
161     glPopMatrix();
162 
163     glBegin(GL_LINES);
164 	glVertex2i(0, 0);
165     glEnd();
166 }
167 
LineStrip(void)168 static void LineStrip(void)
169 {
170 
171     glBegin(GL_LINE_STRIP);
172 	SetColor(COLOR_RED);
173 	glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
174 	SetColor(COLOR_GREEN);
175 	glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
176 	SetColor(COLOR_BLUE);
177 	glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
178 	SetColor(COLOR_WHITE);
179 	glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
180     glEnd();
181 
182     glBegin(GL_LINE_STRIP);
183 	glVertex2i(0, 0);
184     glEnd();
185 }
186 
LineLoop(void)187 static void LineLoop(void)
188 {
189 
190     glBegin(GL_LINE_LOOP);
191 	SetColor(COLOR_RED);
192 	glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
193 	SetColor(COLOR_GREEN);
194 	glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
195 	SetColor(COLOR_BLUE);
196 	glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
197 	SetColor(COLOR_WHITE);
198 	glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
199     glEnd();
200 
201     glEnable(GL_LOGIC_OP);
202     glLogicOp(GL_XOR);
203 
204     glEnable(GL_BLEND);
205     glBlendFunc(GL_ONE, GL_ONE);
206 
207     SetColor(COLOR_MAGENTA);
208     glBegin(GL_LINE_LOOP);
209 	glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
210 	glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
211     glEnd();
212     glBegin(GL_LINE_LOOP);
213 	glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
214 	glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
215     glEnd();
216     glDisable(GL_LOGIC_OP);
217     glDisable(GL_BLEND);
218 
219     SetColor(COLOR_GREEN);
220     glBegin(GL_POINTS);
221 	glVertex2i(0, 0);
222     glEnd();
223 
224     glBegin(GL_LINE_LOOP);
225 	glVertex2i(0, 0);
226     glEnd();
227 }
228 
Bitmap(void)229 static void Bitmap(void)
230 {
231 
232     glBegin(GL_LINES);
233 	SetColor(COLOR_GREEN);
234 	glVertex2i(-boxW/2, 0);
235 	glVertex2i(boxW/2, 0);
236 	glVertex2i(0, -boxH/2);
237 	glVertex2i(0, boxH/2);
238 	SetColor(COLOR_RED);
239 	glVertex2i(0, -3);
240 	glVertex2i(0, -3+OPENGL_HEIGHT);
241 	SetColor(COLOR_BLUE);
242 	glVertex2i(0, -3);
243 	glVertex2i(OPENGL_WIDTH, -3);
244     glEnd();
245 
246     SetColor(COLOR_GREEN);
247 
248     glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
249     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
250 
251     glRasterPos2i(0, 0);
252     glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
253 }
254 
Triangles(void)255 static void Triangles(void)
256 {
257 
258     glBegin(GL_TRIANGLES);
259 	SetColor(COLOR_GREEN);
260 	glVertex2i(-boxW/4, -boxH/4);
261 	SetColor(COLOR_RED);
262 	glVertex2i(-boxW/8, -boxH/16);
263 	SetColor(COLOR_BLUE);
264 	glVertex2i(boxW/8, -boxH/16);
265 
266 	SetColor(COLOR_GREEN);
267 	glVertex2i(-boxW/4, boxH/4);
268 	SetColor(COLOR_RED);
269 	glVertex2i(-boxW/8, boxH/16);
270 	SetColor(COLOR_BLUE);
271 	glVertex2i(boxW/8, boxH/16);
272     glEnd();
273 
274     glBegin(GL_TRIANGLES);
275 	glVertex2i(0, 0);
276 	glVertex2i(-100, 100);
277     glEnd();
278 }
279 
TriangleStrip(void)280 static void TriangleStrip(void)
281 {
282 
283     glBegin(GL_TRIANGLE_STRIP);
284 	SetColor(COLOR_GREEN);
285 	glVertex2i(-boxW/4, -boxH/4);
286 	SetColor(COLOR_RED);
287 	glVertex2i(-boxW/4, boxH/4);
288 	SetColor(COLOR_BLUE);
289 	glVertex2i(0, -boxH/4);
290 	SetColor(COLOR_WHITE);
291 	glVertex2i(0, boxH/4);
292 	SetColor(COLOR_CYAN);
293 	glVertex2i(boxW/4, -boxH/4);
294 	SetColor(COLOR_YELLOW);
295 	glVertex2i(boxW/4, boxH/4);
296     glEnd();
297 
298     glBegin(GL_TRIANGLE_STRIP);
299 	glVertex2i(0, 0);
300 	glVertex2i(-100, 100);
301     glEnd();
302 }
303 
TriangleFan(void)304 static void TriangleFan(void)
305 {
306     GLint vx[8][2];
307     GLint x0, y0, x1, y1, x2, y2, x3, y3;
308     GLint i;
309 
310     y0 = -boxH/4;
311     y1 = y0 + boxH/2/3;
312     y2 = y1 + boxH/2/3;
313     y3 = boxH/4;
314     x0 = -boxW/4;
315     x1 = x0 + boxW/2/3;
316     x2 = x1 + boxW/2/3;
317     x3 = boxW/4;
318 
319     vx[0][0] = x0; vx[0][1] = y1;
320     vx[1][0] = x0; vx[1][1] = y2;
321     vx[2][0] = x1; vx[2][1] = y3;
322     vx[3][0] = x2; vx[3][1] = y3;
323     vx[4][0] = x3; vx[4][1] = y2;
324     vx[5][0] = x3; vx[5][1] = y1;
325     vx[6][0] = x2; vx[6][1] = y0;
326     vx[7][0] = x1; vx[7][1] = y0;
327 
328     glBegin(GL_TRIANGLE_FAN);
329 	SetColor(COLOR_WHITE);
330 	glVertex2i(0, 0);
331 	for (i = 0; i < 8; i++) {
332 	    SetColor(COLOR_WHITE-i);
333 	    glVertex2iv(vx[i]);
334 	}
335     glEnd();
336 
337     glBegin(GL_TRIANGLE_FAN);
338 	glVertex2i(0, 0);
339 	glVertex2i(-100, 100);
340     glEnd();
341 }
342 
Rect(void)343 static void Rect(void)
344 {
345 
346     SetColor(COLOR_GREEN);
347     glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
348 }
349 
PolygonFunc(void)350 static void PolygonFunc(void)
351 {
352     GLint vx[8][2];
353     GLint x0, y0, x1, y1, x2, y2, x3, y3;
354     GLint i;
355 
356     y0 = -boxH/4;
357     y1 = y0 + boxH/2/3;
358     y2 = y1 + boxH/2/3;
359     y3 = boxH/4;
360     x0 = -boxW/4;
361     x1 = x0 + boxW/2/3;
362     x2 = x1 + boxW/2/3;
363     x3 = boxW/4;
364 
365     vx[0][0] = x0; vx[0][1] = y1;
366     vx[1][0] = x0; vx[1][1] = y2;
367     vx[2][0] = x1; vx[2][1] = y3;
368     vx[3][0] = x2; vx[3][1] = y3;
369     vx[4][0] = x3; vx[4][1] = y2;
370     vx[5][0] = x3; vx[5][1] = y1;
371     vx[6][0] = x2; vx[6][1] = y0;
372     vx[7][0] = x1; vx[7][1] = y0;
373 
374     glBegin(GL_POLYGON);
375 	for (i = 0; i < 8; i++) {
376 	    SetColor(COLOR_WHITE-i);
377 	    glVertex2iv(vx[i]);
378 	}
379     glEnd();
380 
381     glBegin(GL_POLYGON);
382 	glVertex2i(0, 0);
383 	glVertex2i(100, 100);
384     glEnd();
385 }
386 
Quads(void)387 static void Quads(void)
388 {
389 
390     glBegin(GL_QUADS);
391 	SetColor(COLOR_GREEN);
392 	glVertex2i(-boxW/4, -boxH/4);
393 	SetColor(COLOR_RED);
394 	glVertex2i(-boxW/8, -boxH/16);
395 	SetColor(COLOR_BLUE);
396 	glVertex2i(boxW/8, -boxH/16);
397 	SetColor(COLOR_WHITE);
398 	glVertex2i(boxW/4, -boxH/4);
399 
400 	SetColor(COLOR_GREEN);
401 	glVertex2i(-boxW/4, boxH/4);
402 	SetColor(COLOR_RED);
403 	glVertex2i(-boxW/8, boxH/16);
404 	SetColor(COLOR_BLUE);
405 	glVertex2i(boxW/8, boxH/16);
406 	SetColor(COLOR_WHITE);
407 	glVertex2i(boxW/4, boxH/4);
408     glEnd();
409 
410     glBegin(GL_QUADS);
411 	glVertex2i(0, 0);
412 	glVertex2i(100, 100);
413 	glVertex2i(-100, 100);
414     glEnd();
415 }
416 
QuadStrip(void)417 static void QuadStrip(void)
418 {
419 
420     glBegin(GL_QUAD_STRIP);
421 	SetColor(COLOR_GREEN);
422 	glVertex2i(-boxW/4, -boxH/4);
423 	SetColor(COLOR_RED);
424 	glVertex2i(-boxW/4, boxH/4);
425 	SetColor(COLOR_BLUE);
426 	glVertex2i(0, -boxH/4);
427 	SetColor(COLOR_WHITE);
428 	glVertex2i(0, boxH/4);
429 	SetColor(COLOR_CYAN);
430 	glVertex2i(boxW/4, -boxH/4);
431 	SetColor(COLOR_YELLOW);
432 	glVertex2i(boxW/4, boxH/4);
433     glEnd();
434 
435     glBegin(GL_QUAD_STRIP);
436 	glVertex2i(0, 0);
437 	glVertex2i(100, 100);
438 	glVertex2i(-100, 100);
439     glEnd();
440 }
441 
Draw(void)442 static void Draw(void)
443 {
444 
445     glViewport(0, 0, windW, windH);
446     glDisable(GL_SCISSOR_TEST);
447 
448     glPushAttrib(GL_COLOR_BUFFER_BIT);
449 
450     glColorMask(1, 1, 1, 1);
451     glIndexMask(~0);
452 
453     glClearColor(0.0, 0.0, 0.0, 0.0);
454     glClear(GL_COLOR_BUFFER_BIT);
455 
456     glPopAttrib();
457 
458     if (mode1) {
459 	glShadeModel(GL_SMOOTH);
460     } else {
461 	glShadeModel(GL_FLAT);
462     }
463 
464     if (mode2) {
465 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
466     } else {
467 	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
468     }
469 
470     Viewport(0, 0); Point();
471     Viewport(0, 1); Lines();
472     Viewport(0, 2); LineStrip();
473     Viewport(0, 3); LineLoop();
474 
475     Viewport(1, 0); Bitmap();
476     Viewport(1, 1); TriangleFan();
477     Viewport(1, 2); Triangles();
478     Viewport(1, 3); TriangleStrip();
479 
480     Viewport(2, 0); Rect();
481     Viewport(2, 1); PolygonFunc();
482     Viewport(2, 2); Quads();
483     Viewport(2, 3); QuadStrip();
484 
485     glFlush();
486 
487     if (doubleBuffer) {
488 	glutSwapBuffers();
489     }
490 }
491 
Args(int argc,char ** argv)492 static GLenum Args(int argc, char **argv)
493 {
494     GLint i;
495 
496     rgb = GL_TRUE;
497     doubleBuffer = GL_FALSE;
498 
499     for (i = 1; i < argc; i++) {
500 	if (strcmp(argv[i], "-ci") == 0) {
501 	    rgb = GL_FALSE;
502 	} else if (strcmp(argv[i], "-rgb") == 0) {
503 	    rgb = GL_TRUE;
504 	} else if (strcmp(argv[i], "-sb") == 0) {
505 	    doubleBuffer = GL_FALSE;
506 	} else if (strcmp(argv[i], "-db") == 0) {
507 	    doubleBuffer = GL_TRUE;
508 	} else {
509 	    printf("%s (Bad option).\n", argv[i]);
510 	    return GL_FALSE;
511 	}
512     }
513     return GL_TRUE;
514 }
515 
main(int argc,char ** argv)516 int main(int argc, char **argv)
517 {
518     glutInit(&argc, argv);
519 
520     if (Args(argc, argv) == GL_FALSE) {
521 	exit(1);
522     }
523 
524     windW = 600;
525     windH = 300;
526     glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
527 
528     windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
529     windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
530     glutInitDisplayMode(windType);
531 
532     if (glutCreateWindow("Primitive Test") == GL_FALSE) {
533 	exit(1);
534     }
535 
536     InitMap();
537 
538     Init();
539 
540     glutReshapeFunc(Reshape);
541     glutKeyboardFunc(Key);
542     glutDisplayFunc(Draw);
543     glutMainLoop();
544 	return 0;
545 }
546