1/*
2 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and
5 * its documentation for any purpose is hereby granted without fee, provided
6 * that (i) the above copyright notices and this permission notice appear in
7 * all copies of the software and related documentation, and (ii) the name of
8 * Silicon Graphics may not be used in any advertising or
9 * publicity relating to the software without the specific, prior written
10 * permission of Silicon Graphics.
11 *
12 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
13 * ANY KIND,
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 * OF THIS SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <string.h>
27#include <stdlib.h>
28#include "glut_wrap.h"
29
30
31#define CI_RED COLOR_RED
32#define CI_ANTI_ALIAS_GREEN 16
33#define CI_ANTI_ALIAS_YELLOW 32
34#define CI_ANTI_ALIAS_RED 48
35
36
37GLenum rgb, doubleBuffer, windType;
38GLint windW, windH;
39
40#include "tkmap.c"
41
42GLenum mode;
43GLint size;
44float point[3] = {
45    1.0, 1.0, 0.0
46};
47
48
49static void Init(void)
50{
51    GLint i;
52
53    glClearColor(0.0, 0.0, 0.0, 0.0);
54
55    glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
56
57    if (!rgb) {
58	for (i = 0; i < 16; i++) {
59	    glutSetColor(i+CI_ANTI_ALIAS_RED, i/15.0, 0.0, 0.0);
60	    glutSetColor(i+CI_ANTI_ALIAS_YELLOW, i/15.0, i/15.0, 0.0);
61	    glutSetColor(i+CI_ANTI_ALIAS_GREEN, 0.0, i/15.0, 0.0);
62	}
63    }
64
65    mode = GL_FALSE;
66    size = 1;
67}
68
69static void Reshape(int width, int height)
70{
71
72    windW = (GLint)width;
73    windH = (GLint)height;
74
75    glViewport(0, 0, width, height);
76
77    glMatrixMode(GL_PROJECTION);
78    glLoadIdentity();
79    gluOrtho2D(-windW/2, windW/2, -windH/2, windH/2);
80    glMatrixMode(GL_MODELVIEW);
81}
82
83static void Key2(int key, int x, int y)
84{
85
86    switch (key) {
87      case GLUT_KEY_LEFT:
88	point[0] -= 0.25;
89	break;
90      case GLUT_KEY_RIGHT:
91	point[0] += 0.25;
92	break;
93      case GLUT_KEY_UP:
94	point[1] += 0.25;
95	break;
96      case GLUT_KEY_DOWN:
97	point[1] -= 0.25;
98	break;
99      default:
100	return;
101    }
102
103    glutPostRedisplay();
104}
105
106static void Key(unsigned char key, int x, int y)
107{
108
109    switch (key) {
110      case 27:
111	exit(1);
112      case '1':
113	mode = !mode;
114	break;
115      case 'W':
116	size++;
117	break;
118      case 'w':
119	size--;
120	if (size < 1) {
121	    size = 1;
122	}
123	break;
124      default:
125	return;
126    }
127
128    glutPostRedisplay();
129}
130
131static void Draw(void)
132{
133
134    glClear(GL_COLOR_BUFFER_BIT);
135
136    SetColor(COLOR_YELLOW);
137    glBegin(GL_LINE_STRIP);
138	glVertex2f(-windW/2, 0);
139	glVertex2f(windW/2, 0);
140    glEnd();
141    glBegin(GL_LINE_STRIP);
142	glVertex2f(0, -windH/2);
143	glVertex2f(0, windH/2);
144    glEnd();
145
146    if (mode) {
147	glEnable(GL_BLEND);
148	glEnable(GL_POINT_SMOOTH);
149    } else {
150	glDisable(GL_BLEND);
151	glDisable(GL_POINT_SMOOTH);
152    }
153
154    glPointSize(size);
155    if (mode) {
156	(rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_ANTI_ALIAS_RED);
157    } else {
158	(rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_RED);
159    }
160    glBegin(GL_POINTS);
161	glVertex3fv(point);
162    glEnd();
163
164    glDisable(GL_POINT_SMOOTH);
165    glDisable(GL_BLEND);
166
167    glPointSize(1);
168    SetColor(COLOR_GREEN);
169    glBegin(GL_POINTS);
170	glVertex3fv(point);
171    glEnd();
172
173    glFlush();
174
175    if (doubleBuffer) {
176	glutSwapBuffers();
177    }
178}
179
180static GLenum Args(int argc, char **argv)
181{
182    GLint i;
183
184    rgb = GL_TRUE;
185    doubleBuffer = GL_FALSE;
186
187    for (i = 1; i < argc; i++) {
188	if (strcmp(argv[i], "-ci") == 0) {
189	    rgb = GL_FALSE;
190	} else if (strcmp(argv[i], "-rgb") == 0) {
191	    rgb = GL_TRUE;
192	} else if (strcmp(argv[i], "-sb") == 0) {
193	    doubleBuffer = GL_FALSE;
194	} else if (strcmp(argv[i], "-db") == 0) {
195	    doubleBuffer = GL_TRUE;
196	} else {
197	    printf("%s (Bad option).\n", argv[i]);
198	    return GL_FALSE;
199	}
200    }
201    return GL_TRUE;
202}
203
204int main(int argc, char **argv)
205{
206    glutInit(&argc, argv);
207
208    if (Args(argc, argv) == GL_FALSE) {
209	exit(1);
210    }
211
212    windW = 300;
213    windH = 300;
214    glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
215
216    windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
217    windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
218    glutInitDisplayMode(windType);
219
220    if (glutCreateWindow("Point Test") == GL_FALSE) {
221	exit(1);
222    }
223
224    InitMap();
225
226    Init();
227
228    glutReshapeFunc(Reshape);
229    glutKeyboardFunc(Key);
230    glutSpecialFunc(Key2);
231    glutDisplayFunc(Draw);
232    glutMainLoop();
233	return 0;
234}
235