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 <GL/glew.h>
29#include "glut_wrap.h"
30
31
32#define CI_OFFSET_1 16
33#define CI_OFFSET_2 32
34
35#define SIZE 16
36GLenum doubleBuffer;
37GLint line = 0;
38
39static void MakeImage(void)
40{
41   GLubyte tex2d[SIZE][SIZE][3];
42   GLint s, t;
43
44   for (s = 0; s < SIZE; s++) {
45      for (t = 0; t < SIZE; t++) {
46         tex2d[t][s][0] = s*255/(SIZE-1);
47         tex2d[t][s][1] = t*255/(SIZE-1);
48         tex2d[t][s][2] = 0*255/(SIZE-1);
49      }
50   }
51
52   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
53   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
54                SIZE, SIZE,
55                0,
56                GL_RGB, GL_UNSIGNED_BYTE, tex2d);
57   glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
58   glEnable(GL_TEXTURE_2D);
59}
60
61static void UpdateLine(void)
62{
63   GLubyte tex[SIZE][3];
64   GLubyte b = 0;
65   GLint s, t;
66
67   t = line % SIZE;
68   if (line % (SIZE * 2) < SIZE)
69      b = 255;
70   else
71      b = 0;
72
73   for (s = 0; s < SIZE; s++) {
74      tex[s][0] = s*255/(SIZE-1);
75      tex[s][1] = t*255/(SIZE-1);
76      tex[s][2] = b;
77   }
78
79   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
80   glTexSubImage2D(GL_TEXTURE_2D, 0,
81                   0, t,
82                   SIZE, 1,
83                   GL_RGB, GL_UNSIGNED_BYTE, tex);
84   glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
85}
86
87static void Init(void)
88{
89   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
90   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
91   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
92   fflush(stderr);
93
94   glClearColor(0.0, 0.0, 1.0, 0.0);
95
96   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
97   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
98   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
99   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
100   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
101
102   MakeImage();
103   UpdateLine();
104   line++;
105}
106
107static void Reshape(int width, int height)
108{
109
110    glViewport(0, 0, (GLint)width, (GLint)height);
111
112    glMatrixMode(GL_PROJECTION);
113    glLoadIdentity();
114    glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
115    glMatrixMode(GL_MODELVIEW);
116}
117
118static void Key(unsigned char key, int x, int y)
119{
120
121   switch (key) {
122   case 27:
123      exit(1);
124   default:
125      UpdateLine();
126      line++;
127      break;
128   }
129
130   glutPostRedisplay();
131}
132
133static void Draw(void)
134{
135   glClear(GL_COLOR_BUFFER_BIT);
136
137   glBegin(GL_QUADS);
138   glTexCoord2f(1,0);
139   glVertex3f( 0.9, -0.9, -30.0);
140   glTexCoord2f(1,1);
141   glVertex3f( 0.9,  0.9, -30.0);
142   glTexCoord2f(0,1);
143   glVertex3f(-0.9,  0.9, -30.0);
144   glTexCoord2f(0,0);
145   glVertex3f(-0.9,  -0.9, -30.0);
146   glEnd();
147
148   glFlush();
149
150   if (doubleBuffer) {
151      glutSwapBuffers();
152   }
153}
154
155static GLenum Args(int argc, char **argv)
156{
157   GLint i;
158
159   doubleBuffer = GL_FALSE;
160
161   for (i = 1; i < argc; i++) {
162      if (strcmp(argv[i], "-sb") == 0) {
163         doubleBuffer = GL_FALSE;
164      } else if (strcmp(argv[i], "-db") == 0) {
165         doubleBuffer = GL_TRUE;
166      } else {
167         fprintf(stderr, "%s (Bad option).\n", argv[i]);
168         return GL_FALSE;
169      }
170   }
171   return GL_TRUE;
172}
173
174int main(int argc, char **argv)
175{
176   GLenum type;
177
178   glutInit(&argc, argv);
179
180   if (Args(argc, argv) == GL_FALSE) {
181      exit(1);
182   }
183
184   glutInitWindowPosition(0, 0);
185   glutInitWindowSize(250, 250);
186
187   type = GLUT_RGB | GLUT_ALPHA;
188   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
189   glutInitDisplayMode(type);
190
191   if (glutCreateWindow(*argv) == GL_FALSE) {
192      exit(1);
193   }
194
195   glewInit();
196
197   Init();
198
199   glutReshapeFunc(Reshape);
200   glutKeyboardFunc(Key);
201   glutDisplayFunc(Draw);
202   glutMainLoop();
203   return 0;
204}
205