paltex.c revision 32001f49
1
2/*
3 * Paletted texture demo.  Written by Brian Paul.
4 * This program is in the public domain.
5 */
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <math.h>
10#include <string.h>
11#ifdef _WIN32
12#include <windows.h>
13#endif
14#include <GL/glew.h>
15#include "glut_wrap.h"
16
17
18static float Rot = 0.0;
19static GLboolean Anim = 1;
20
21
22static void Idle( void )
23{
24   float t = glutGet(GLUT_ELAPSED_TIME) * 0.001;  /* in seconds */
25   Rot = t * 360 / 4;  /* 1 rotation per 4 seconds */
26   glutPostRedisplay();
27}
28
29
30static void Display( void )
31{
32   /* draw background gradient */
33   glDisable(GL_TEXTURE_2D);
34   glBegin(GL_POLYGON);
35   glColor3f(1.0, 0.0, 0.2); glVertex2f(-1.5, -1.0);
36   glColor3f(1.0, 0.0, 0.2); glVertex2f( 1.5, -1.0);
37   glColor3f(0.0, 0.0, 1.0); glVertex2f( 1.5,  1.0);
38   glColor3f(0.0, 0.0, 1.0); glVertex2f(-1.5,  1.0);
39   glEnd();
40
41   glPushMatrix();
42   glRotatef(Rot, 0, 0, 1);
43
44   glEnable(GL_TEXTURE_2D);
45   glBegin(GL_POLYGON);
46   glTexCoord2f(0, 1);  glVertex2f(-1, -0.5);
47   glTexCoord2f(1, 1);  glVertex2f( 1, -0.5);
48   glTexCoord2f(1, 0);  glVertex2f( 1,  0.5);
49   glTexCoord2f(0, 0);  glVertex2f(-1,  0.5);
50   glEnd();
51
52   glPopMatrix();
53
54   glutSwapBuffers();
55}
56
57
58static void Reshape( int width, int height )
59{
60   glViewport( 0, 0, width, height );
61   glMatrixMode( GL_PROJECTION );
62   glLoadIdentity();
63   glOrtho( -1.5, 1.5, -1.0, 1.0, -1.0, 1.0 );
64   glMatrixMode( GL_MODELVIEW );
65   glLoadIdentity();
66}
67
68
69static void Key( unsigned char key, int x, int y )
70{
71   (void) x;
72   (void) y;
73   switch (key) {
74      case 27:
75         exit(0);
76         break;
77      case 's':
78         Rot += 0.5;
79         break;
80      case ' ':
81         Anim = !Anim;
82         if (Anim)
83            glutIdleFunc( Idle );
84         else
85            glutIdleFunc( NULL );
86         break;
87   }
88   glutPostRedisplay();
89}
90
91
92static void Init( void )
93{
94#define HEIGHT 8
95#define WIDTH 32
96   /* 257 = HEIGHT * WIDTH + 1 (for trailing '\0') */
97   static char texture[257] = {"\
98                                \
99    MMM    EEEE   SSS    AAA    \
100   M M M  E      S   S  A   A   \
101   M M M  EEEE    SS    A   A   \
102   M M M  E         SS  AAAAA   \
103   M   M  E      S   S  A   A   \
104   M   M   EEEE   SSS   A   A   \
105                                "
106      };
107   GLubyte table[256][4];
108
109   if (!glutExtensionSupported("GL_EXT_paletted_texture")) {
110      printf("Sorry, GL_EXT_paletted_texture not supported\n");
111      exit(0);
112   }
113
114   /* load the color table for each texel-index */
115   memset(table, 0, 256*4);
116   table[' '][0] = 255;
117   table[' '][1] = 255;
118   table[' '][2] = 255;
119   table[' '][3] = 64;
120   table['M'][0] = 255;
121   table['M'][1] = 0;
122   table['M'][2] = 0;
123   table['M'][3] = 255;
124   table['E'][0] = 0;
125   table['E'][1] = 255;
126   table['E'][2] = 0;
127   table['E'][3] = 255;
128   table['S'][0] = 0;
129   table['S'][1] = 0;
130   table['S'][2] = 255;
131   table['S'][3] = 255;
132   table['A'][0] = 255;
133   table['A'][1] = 255;
134   table['A'][2] = 0;
135   table['A'][3] = 255;
136
137#ifdef GL_EXT_paletted_texture
138
139#if defined(GL_EXT_shared_texture_palette) && defined(USE_SHARED_PALETTE)
140   printf("Using shared palette\n");
141   glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT,    /* target */
142                   GL_RGBA,          /* internal format */
143                   256,              /* table size */
144                   GL_RGBA,          /* table format */
145                   GL_UNSIGNED_BYTE, /* table type */
146                   table);           /* the color table */
147   glEnable(GL_SHARED_TEXTURE_PALETTE_EXT);
148#else
149   glColorTableEXT(GL_TEXTURE_2D,    /* target */
150                   GL_RGBA,          /* internal format */
151                   256,              /* table size */
152                   GL_RGBA,          /* table format */
153                   GL_UNSIGNED_BYTE, /* table type */
154                   table);           /* the color table */
155#endif
156
157   glTexImage2D(GL_TEXTURE_2D,       /* target */
158                0,                   /* level */
159                GL_COLOR_INDEX8_EXT, /* internal format */
160                WIDTH, HEIGHT,       /* width, height */
161                0,                   /* border */
162                GL_COLOR_INDEX,      /* texture format */
163                GL_UNSIGNED_BYTE,    /* texture type */
164                texture);            /* the texture */
165#endif
166
167   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
168   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
169   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
170   glEnable(GL_TEXTURE_2D);
171
172   glEnable(GL_BLEND);
173   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
174#undef HEIGHT
175#undef WIDTH
176}
177
178
179
180/*
181 * Color ramp test
182 */
183static void Init2( void )
184{
185#define HEIGHT 32
186#define WIDTH 256
187   static char texture[HEIGHT][WIDTH];
188   GLubyte table[256][4];
189   int i, j;
190
191   if (!glutExtensionSupported("GL_EXT_paletted_texture")) {
192      printf("Sorry, GL_EXT_paletted_texture not supported\n");
193      exit(0);
194   }
195
196   for (j = 0; j < HEIGHT; j++) {
197      for (i = 0; i < WIDTH; i++) {
198         texture[j][i] = i;
199      }
200   }
201
202   for (i = 0; i < 255; i++) {
203      table[i][0] = i;
204      table[i][1] = 0;
205      table[i][2] = 0;
206      table[i][3] = 255;
207   }
208
209#ifdef GL_EXT_paletted_texture
210
211#if defined(GL_EXT_shared_texture_palette) && defined(USE_SHARED_PALETTE)
212   printf("Using shared palette\n");
213   glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT,    /* target */
214                   GL_RGBA,          /* internal format */
215                   256,              /* table size */
216                   GL_RGBA,          /* table format */
217                   GL_UNSIGNED_BYTE, /* table type */
218                   table);           /* the color table */
219   glEnable(GL_SHARED_TEXTURE_PALETTE_EXT);
220#else
221   glColorTableEXT(GL_TEXTURE_2D,    /* target */
222                   GL_RGBA,          /* internal format */
223                   256,              /* table size */
224                   GL_RGBA,          /* table format */
225                   GL_UNSIGNED_BYTE, /* table type */
226                   table);           /* the color table */
227#endif
228
229   glTexImage2D(GL_TEXTURE_2D,       /* target */
230                0,                   /* level */
231                GL_COLOR_INDEX8_EXT, /* internal format */
232                WIDTH, HEIGHT,       /* width, height */
233                0,                   /* border */
234                GL_COLOR_INDEX,      /* texture format */
235                GL_UNSIGNED_BYTE,    /* texture type */
236                texture);            /* teh texture */
237#endif
238
239   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
240   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
241   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
242   glEnable(GL_TEXTURE_2D);
243
244   glEnable(GL_BLEND);
245   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
246}
247
248
249int main( int argc, char *argv[] )
250{
251   glutInitWindowSize( 400, 300 );
252   glutInit( &argc, argv );
253   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
254   glutCreateWindow(argv[0]);
255   glewInit();
256
257   Init();
258   (void) Init2; /* silence warning */
259
260   glutReshapeFunc( Reshape );
261   glutKeyboardFunc( Key );
262   glutDisplayFunc( Display );
263   if (Anim)
264      glutIdleFunc( Idle );
265
266   glutMainLoop();
267   return 0;
268}
269