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 <glad/glad.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
36 GLenum doubleBuffer;
37 GLint line = 0;
38 
MakeImage(void)39 static 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 
UpdateLine(void)61 static 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 
Init(void)87 static 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 
Reshape(int width,int height)107 static 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 
Key(unsigned char key,int x,int y)118 static 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 
Draw(void)133 static 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 
Args(int argc,char ** argv)155 static 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 
main(int argc,char ** argv)174 int 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    gladLoadGL();
196 
197    Init();
198 
199    glutReshapeFunc(Reshape);
200    glutKeyboardFunc(Key);
201    glutDisplayFunc(Draw);
202    glutMainLoop();
203    return 0;
204 }
205