7 #define PIXEL_CENTER(x) ((long)(x) + 0.5)
13 #define OPENGL_WIDTH 48
14 #define OPENGL_HEIGHT 13
17 GLenum rgb
, doubleBuffer
, windType
;
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,
41 static void Init(void)
48 static void Reshape(int width
, int height
)
52 windH
= (GLint
)height
;
55 static void RotateColorMask(void)
57 static GLint rotation
= 0;
59 rotation
= (rotation
+ 1) & 0x3;
62 glColorMask(GL_TRUE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
66 glColorMask(GL_FALSE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
70 glColorMask(GL_TRUE
, GL_FALSE
, GL_TRUE
, GL_TRUE
);
74 glColorMask(GL_TRUE
, GL_TRUE
, GL_FALSE
, GL_TRUE
);
80 static void Key(unsigned char key
, int x
, int y
)
102 static void Viewport(GLint row
, GLint column
)
106 boxW
= (windW
- (COLS
+ 1) * GAP
) / COLS
;
107 boxH
= (windH
- (ROWS
+ 1) * GAP
) / ROWS
;
109 x
= GAP
+ column
* (boxW
+ GAP
);
110 y
= GAP
+ row
* (boxH
+ GAP
);
112 glViewport(x
, y
, boxW
, boxH
);
114 glMatrixMode(GL_PROJECTION
);
116 glOrtho(-boxW
/2, boxW
/2, -boxH
/2, boxH
/2, 0.0, 1.0);
117 glMatrixMode(GL_MODELVIEW
);
119 glEnable(GL_SCISSOR_TEST
);
120 glScissor(x
, y
, boxW
, boxH
);
123 static void Point(void)
128 SetColor(COLOR_WHITE
);
130 for (i
= 1; i
< 8; i
++) {
132 SetColor(COLOR_BLACK
+i
);
145 static void Lines(void)
151 glTranslatef(-12, 0, 0);
152 for (i
= 1; i
< 8; i
++) {
153 SetColor(COLOR_BLACK
+i
);
155 glVertex2i(-boxW
/4, -boxH
/4);
156 glVertex2i(boxW
/4, boxH
/4);
158 glTranslatef(4, 0, 0);
168 static void LineStrip(void)
171 glBegin(GL_LINE_STRIP
);
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));
182 glBegin(GL_LINE_STRIP
);
187 static void LineLoop(void)
190 glBegin(GL_LINE_LOOP
);
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));
201 glEnable(GL_LOGIC_OP
);
205 glBlendFunc(GL_ONE
, GL_ONE
);
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));
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));
216 glDisable(GL_LOGIC_OP
);
219 SetColor(COLOR_GREEN
);
224 glBegin(GL_LINE_LOOP
);
229 static void Bitmap(void)
233 SetColor(COLOR_GREEN
);
234 glVertex2i(-boxW
/2, 0);
235 glVertex2i(boxW
/2, 0);
236 glVertex2i(0, -boxH
/2);
237 glVertex2i(0, boxH
/2);
240 glVertex2i(0, -3+OPENGL_HEIGHT
);
241 SetColor(COLOR_BLUE
);
243 glVertex2i(OPENGL_WIDTH
, -3);
246 SetColor(COLOR_GREEN
);
248 glPixelStorei(GL_UNPACK_LSB_FIRST
, GL_TRUE
);
249 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
252 glBitmap(OPENGL_WIDTH
, OPENGL_HEIGHT
, 0, 3, 0.0, 0.0, OpenGL_bits
);
255 static void Triangles(void)
258 glBegin(GL_TRIANGLES
);
259 SetColor(COLOR_GREEN
);
260 glVertex2i(-boxW
/4, -boxH
/4);
262 glVertex2i(-boxW
/8, -boxH
/16);
263 SetColor(COLOR_BLUE
);
264 glVertex2i(boxW
/8, -boxH
/16);
266 SetColor(COLOR_GREEN
);
267 glVertex2i(-boxW
/4, boxH
/4);
269 glVertex2i(-boxW
/8, boxH
/16);
270 SetColor(COLOR_BLUE
);
271 glVertex2i(boxW
/8, boxH
/16);
274 glBegin(GL_TRIANGLES
);
276 glVertex2i(-100, 100);
280 static void TriangleStrip(void)
283 glBegin(GL_TRIANGLE_STRIP
);
284 SetColor(COLOR_GREEN
);
285 glVertex2i(-boxW
/4, -boxH
/4);
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);
298 glBegin(GL_TRIANGLE_STRIP
);
300 glVertex2i(-100, 100);
304 static void TriangleFan(void)
307 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
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
;
328 glBegin(GL_TRIANGLE_FAN
);
329 SetColor(COLOR_WHITE
);
331 for (i
= 0; i
< 8; i
++) {
332 SetColor(COLOR_WHITE
-i
);
337 glBegin(GL_TRIANGLE_FAN
);
339 glVertex2i(-100, 100);
343 static void Rect(void)
346 SetColor(COLOR_GREEN
);
347 glRecti(-boxW
/4, -boxH
/4, boxW
/4, boxH
/4);
350 static void PolygonFunc(void)
353 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
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
;
375 for (i
= 0; i
< 8; i
++) {
376 SetColor(COLOR_WHITE
-i
);
383 glVertex2i(100, 100);
387 static void Quads(void)
391 SetColor(COLOR_GREEN
);
392 glVertex2i(-boxW
/4, -boxH
/4);
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);
400 SetColor(COLOR_GREEN
);
401 glVertex2i(-boxW
/4, boxH
/4);
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);
412 glVertex2i(100, 100);
413 glVertex2i(-100, 100);
417 static void QuadStrip(void)
420 glBegin(GL_QUAD_STRIP
);
421 SetColor(COLOR_GREEN
);
422 glVertex2i(-boxW
/4, -boxH
/4);
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);
435 glBegin(GL_QUAD_STRIP
);
437 glVertex2i(100, 100);
438 glVertex2i(-100, 100);
442 static void Draw(void)
445 glViewport(0, 0, windW
, windH
);
446 glDisable(GL_SCISSOR_TEST
);
448 glPushAttrib(GL_COLOR_BUFFER_BIT
);
450 glColorMask(1, 1, 1, 1);
453 glClearColor(0.0, 0.0, 0.0, 0.0);
454 glClear(GL_COLOR_BUFFER_BIT
);
459 glShadeModel(GL_SMOOTH
);
461 glShadeModel(GL_FLAT
);
465 glPolygonMode(GL_FRONT_AND_BACK
, GL_FILL
);
467 glPolygonMode(GL_FRONT_AND_BACK
, GL_LINE
);
470 Viewport(0, 0); Point();
471 Viewport(0, 1); Lines();
472 Viewport(0, 2); LineStrip();
473 Viewport(0, 3); LineLoop();
475 Viewport(1, 0); Bitmap();
476 Viewport(1, 1); TriangleFan();
477 Viewport(1, 2); Triangles();
478 Viewport(1, 3); TriangleStrip();
480 Viewport(2, 0); Rect();
481 Viewport(2, 1); PolygonFunc();
482 Viewport(2, 2); Quads();
483 Viewport(2, 3); QuadStrip();
492 static GLenum
Args(int argc
, char **argv
)
497 doubleBuffer
= GL_FALSE
;
499 for (i
= 1; i
< argc
; i
++) {
500 if (strcmp(argv
[i
], "-ci") == 0) {
502 } else if (strcmp(argv
[i
], "-rgb") == 0) {
504 } else if (strcmp(argv
[i
], "-sb") == 0) {
505 doubleBuffer
= GL_FALSE
;
506 } else if (strcmp(argv
[i
], "-db") == 0) {
507 doubleBuffer
= GL_TRUE
;
509 printf("%s (Bad option).\n", argv
[i
]);
516 int main(int argc
, char **argv
)
518 glutInit(&argc
, argv
);
520 if (Args(argc
, argv
) == GL_FALSE
) {
526 glutInitWindowPosition(0, 0); glutInitWindowSize( windW
, windH
);
528 windType
= (rgb
) ? GLUT_RGB
: GLUT_INDEX
;
529 windType
|= (doubleBuffer
) ? GLUT_DOUBLE
: GLUT_SINGLE
;
530 glutInitDisplayMode(windType
);
532 if (glutCreateWindow("Primitive Test") == GL_FALSE
) {
540 glutReshapeFunc(Reshape
);
541 glutKeyboardFunc(Key
);
542 glutDisplayFunc(Draw
);