texenv.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:20k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /**
  3.  * (c) Copyright 1993, Silicon Graphics, Inc.
  4.  * ALL RIGHTS RESERVED 
  5.  * Permission to use, copy, modify, and distribute this software for 
  6.  * any purpose and without fee is hereby granted, provided that the above
  7.  * copyright notice appear in all copies and that both the copyright notice
  8.  * and this permission notice appear in supporting documentation, and that 
  9.  * the name of Silicon Graphics, Inc. not be used in advertising
  10.  * or publicity pertaining to distribution of the software without specific,
  11.  * written prior permission. 
  12.  *
  13.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  14.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  16.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  17.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  18.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  19.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  20.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  21.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  22.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  23.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  24.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  25.  * 
  26.  * US Government Users Restricted Rights 
  27.  * Use, duplication, or disclosure by the Government is subject to
  28.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  29.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  30.  * clause at DFARS 252.227-7013 and/or in similar or successor
  31.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  32.  * Unpublished-- rights reserved under the copyright laws of the
  33.  * United States.  Contractor/manufacturer is Silicon Graphics,
  34.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  35.  *
  36.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  37.  */
  38. /* Demonstrates texture environment modes and internal image formats.
  39.    Requires the GL_EXT_texture extension.  */
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <GL/glut.h>
  44. #undef max
  45. #undef min
  46. #define max(a,b) ((a) >= (b) ? (a) : (b))
  47. #define min(a,b) ((a) <= (b) ? (a) : (b))
  48. /* *INDENT-OFF* */
  49. GLfloat lightCheck[4] = {0.7, 0.7, 0.7, 1.0};
  50. GLfloat darkCheck[4] = {0.3, 0.3, 0.3, 1.0};
  51. GLfloat labelColor0[4] = {1.0, 1.0, 1.0, 1.0};
  52. GLfloat labelColor1[4] = {1.0, 1.0, 0.4, 1.0};
  53. GLfloat *labelInfoColor = labelColor0;
  54. GLfloat labelLevelColor0[4] = {0.8, 0.8, 0.1, 1.0};
  55. GLfloat labelLevelColor1[4] = {0.0, 0.0, 0.0, 1.0};
  56. /* *INDENT-ON* */
  57. GLboolean doubleBuffered = GL_FALSE;
  58. GLboolean drawBackground = GL_FALSE;
  59. GLboolean drawBlended = GL_TRUE;
  60. GLboolean drawSmooth = GL_FALSE;
  61. GLboolean drawTextured = GL_TRUE;
  62. GLboolean displayLevelInfo = GL_FALSE;
  63. int textureWidth = 64;
  64. int textureHeight = 64;
  65. int winWidth = 580, winHeight = 720;
  66. struct formatInfo {
  67.   GLenum baseFormat;
  68.   GLenum internalFormat;
  69.   char *name;
  70. };
  71. #define NUM_LUMINANCE_FORMATS 
  72.     (sizeof(luminanceFormats) / sizeof(luminanceFormats[0]))
  73. struct formatInfo luminanceFormats[] =
  74. {
  75.   {GL_LUMINANCE, 1, "LUMINANCE"},
  76. #if GL_EXT_texture
  77.   {GL_LUMINANCE, GL_LUMINANCE4_EXT, "LUMINANCE4"},
  78.   {GL_LUMINANCE, GL_LUMINANCE8_EXT, "LUMINANCE8"},
  79.   {GL_LUMINANCE, GL_LUMINANCE12_EXT, "LUMINANCE12"},
  80.   {GL_LUMINANCE, GL_LUMINANCE16_EXT, "LUMINANCE16"},
  81. #endif
  82. };
  83. #define NUM_ALPHA_FORMATS 
  84.     (sizeof(alphaFormats) / sizeof(alphaFormats[0]))
  85. struct formatInfo alphaFormats[] =
  86. {
  87.   {GL_ALPHA, GL_ALPHA, "ALPHA"},
  88. #if GL_EXT_texture
  89.   {GL_ALPHA, GL_ALPHA4_EXT, "ALPHA4"},
  90.   {GL_ALPHA, GL_ALPHA8_EXT, "ALPHA8"},
  91.   {GL_ALPHA, GL_ALPHA12_EXT, "ALPHA12"},
  92.   {GL_ALPHA, GL_ALPHA16_EXT, "ALPHA16"},
  93. #endif
  94. };
  95. #if GL_EXT_texture
  96. #define NUM_INTENSITY_FORMATS 
  97.     (sizeof(intensityFormats) / sizeof(intensityFormats[0]))
  98. struct formatInfo intensityFormats[] =
  99. {
  100.   {GL_INTENSITY_EXT, GL_INTENSITY_EXT, "INTENSITY"},
  101.   {GL_INTENSITY_EXT, GL_INTENSITY4_EXT, "INTENSITY4"},
  102.   {GL_INTENSITY_EXT, GL_INTENSITY8_EXT, "INTENSITY8"},
  103.   {GL_INTENSITY_EXT, GL_INTENSITY12_EXT, "INTENSITY12"},
  104.   {GL_INTENSITY_EXT, GL_INTENSITY16_EXT, "INTENSITY16"},
  105. };
  106. #endif
  107. #define NUM_LUMINANCE_ALPHA_FORMATS 
  108.     (sizeof(luminanceAlphaFormats) / sizeof(luminanceAlphaFormats[0]))
  109. struct formatInfo luminanceAlphaFormats[] =
  110. {
  111.   {GL_LUMINANCE_ALPHA, 2, "LUMINANCE_ALPHA"},
  112. #if GL_EXT_texture
  113.   {GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4_EXT, "LUMINANCE4_ALPHA4"},
  114.   {GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2_EXT, "LUMINANCE6_ALPHA2"},
  115.   {GL_LUMINANCE_ALPHA, GL_LUMINANCE8_ALPHA8_EXT, "LUMINANCE8_ALPHA8"},
  116.   {GL_LUMINANCE_ALPHA, GL_LUMINANCE12_ALPHA4_EXT, "LUMINANCE12_ALPHA4"},
  117.   {GL_LUMINANCE_ALPHA, GL_LUMINANCE12_ALPHA12_EXT, "LUMINANCE12_ALPHA12"},
  118.   {GL_LUMINANCE_ALPHA, GL_LUMINANCE16_ALPHA16_EXT, "LUMINANCE16_ALPHA16"},
  119. #endif
  120. };
  121. #define NUM_RGB_FORMATS 
  122.     (sizeof(rgbFormats) / sizeof(rgbFormats[0]))
  123. struct formatInfo rgbFormats[] =
  124. {
  125.   {GL_RGB, 3, "RGB"},
  126. #if GL_EXT_texture
  127.   {GL_RGB, GL_RGB2_EXT, "RGB2"},
  128.   {GL_RGB, GL_RGB4_EXT, "RGB4"},
  129.   {GL_RGB, GL_RGB5_EXT, "RGB5"},
  130.   {GL_RGB, GL_RGB8_EXT, "RGB8"},
  131.   {GL_RGB, GL_RGB10_EXT, "RGB10"},
  132.   {GL_RGB, GL_RGB12_EXT, "RGB12"},
  133.   {GL_RGB, GL_RGB16_EXT, "RGB16"},
  134. #endif
  135. };
  136. #define NUM_RGBA_FORMATS 
  137.     (sizeof(rgbaFormats) / sizeof(rgbaFormats[0]))
  138. struct formatInfo rgbaFormats[] =
  139. {
  140.   {GL_RGBA, 4, "RGBA"},
  141. #if GL_EXT_texture
  142.   {GL_RGBA, GL_RGBA2_EXT, "RGBA2"},
  143.   {GL_RGBA, GL_RGBA4_EXT, "RGBA4"},
  144.   {GL_RGBA, GL_RGBA8_EXT, "RGBA8"},
  145.   {GL_RGBA, GL_RGBA12_EXT, "RGBA12"},
  146.   {GL_RGBA, GL_RGBA16_EXT, "RGBA16"},
  147.   {GL_RGBA, GL_RGB5_A1_EXT, "RGB5_A1"},
  148.   {GL_RGBA, GL_RGB10_A2_EXT, "RGB10_A2"},
  149. #endif
  150. };
  151. struct baseFormatInfo {
  152.   struct formatInfo *format;
  153.   int current, number;
  154. };
  155. #define NUM_BASE_FORMATS 
  156.     (sizeof(baseFormats) / sizeof(baseFormats[0]))
  157. int baseFormat;
  158. struct baseFormatInfo baseFormats[] =
  159. {
  160.   {luminanceFormats, 0, NUM_LUMINANCE_FORMATS},
  161.   {alphaFormats, 0, NUM_ALPHA_FORMATS},
  162. #if GL_EXT_texture
  163.   {intensityFormats, 0, NUM_INTENSITY_FORMATS},
  164. #endif
  165.   {luminanceAlphaFormats, 0, NUM_LUMINANCE_ALPHA_FORMATS},
  166.   {rgbFormats, 0, NUM_RGB_FORMATS},
  167.   {rgbaFormats, 0, NUM_RGBA_FORMATS},
  168. };
  169. #define NUM_ENV_COLORS 
  170.     (sizeof(envColors) / sizeof(envColors[0]))
  171. int envColor;
  172. GLfloat envColors[][4] =
  173. {
  174.   {0.0, 0.0, 0.0, 1.0},
  175.   {1.0, 0.0, 0.0, 1.0},
  176.   {0.0, 1.0, 0.0, 1.0},
  177.   {0.0, 0.0, 1.0, 1.0},
  178.   {1.0, 1.0, 1.0, 1.0},
  179. };
  180. struct envModeInfo {
  181.   GLenum mode;
  182.   char *name;
  183. };
  184. #define NUM_ENV_MODES 
  185.     (sizeof(envModes) / sizeof(envModes[0]))
  186. struct envModeInfo envModes[] =
  187. {
  188. #if GL_EXT_texture
  189.   {GL_REPLACE_EXT, "REPLACE"},
  190. #endif
  191.   {GL_MODULATE, "MODULATE"},
  192.   {GL_BLEND, "BLEND"},
  193.   {GL_DECAL, "DECAL"},
  194. };
  195. void
  196. checkErrors(void)
  197. {
  198.   GLenum error;
  199.   while ((error = glGetError()) != GL_NO_ERROR) {
  200.     fprintf(stderr, "Error: %sn", (char *) gluErrorString(error));
  201.   }
  202. }
  203. static void
  204. drawString(char *string, GLfloat x, GLfloat y, GLfloat color[4])
  205. {
  206.   glColor4fv(color);
  207.   glRasterPos2f(x, y);
  208.   while (*string) {
  209.     glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, *string);
  210.     string++;
  211.   }
  212. }
  213. static void
  214. drawStringOutline(char *string, GLfloat x, GLfloat y,
  215.   GLfloat color[4], GLfloat outline[4])
  216. {
  217.   drawString(string, x - 1, y, outline);
  218.   drawString(string, x + 1, y, outline);
  219.   drawString(string, x, y - 1, outline);
  220.   drawString(string, x, y + 1, outline);
  221.   drawString(string, x, y, color);
  222. }
  223. static void
  224. begin2D(int width, int height)
  225. {
  226.   glMatrixMode(GL_PROJECTION);
  227.   glPushMatrix();
  228.   glLoadIdentity();
  229.   glOrtho(0, width, 0, height, -1, 1);
  230.   glMatrixMode(GL_MODELVIEW);
  231.   glPushMatrix();
  232.   glLoadIdentity();
  233. }
  234. static void
  235. end2D(void)
  236. {
  237.   glMatrixMode(GL_PROJECTION);
  238.   glPopMatrix();
  239.   glMatrixMode(GL_MODELVIEW);
  240.   glPopMatrix();
  241. }
  242. static void
  243. initialize(void)
  244. {
  245.   glMatrixMode(GL_PROJECTION);
  246.   glLoadIdentity();
  247.   glOrtho(-1.5, 1.5, -1.5, 1.5, -1.5, 1.5);
  248.   glMatrixMode(GL_MODELVIEW);
  249.   glLoadIdentity();
  250.   glShadeModel(GL_FLAT);
  251. }
  252. /* ARGSUSED1 */
  253. void
  254. keyboard(unsigned char c, int x, int y)
  255. {
  256.   switch (c) {
  257.   case 'c':
  258.     envColor = ++envColor % (int) NUM_ENV_COLORS;
  259.     break;
  260.   case 'g':
  261.     drawBackground = !drawBackground;
  262.     break;
  263.   case 'b':
  264.     drawBlended = !drawBlended;
  265.     break;
  266.   case 's':
  267.     drawSmooth = !drawSmooth;
  268.     break;
  269.   case 't':
  270.     drawTextured = !drawTextured;
  271.     break;
  272.   case 'i':
  273.     displayLevelInfo = !displayLevelInfo;
  274.     break;
  275.   case 27:             /* Escape key should force exit. */
  276.     exit(0);
  277.     break;
  278.   default:
  279.     break;
  280.   }
  281.   glutPostRedisplay();
  282. }
  283. /* ARGSUSED1 */
  284. void
  285. special(int key, int x, int y)
  286. {
  287.   switch (key) {
  288.   case GLUT_KEY_DOWN:
  289.     if (++baseFormat > NUM_BASE_FORMATS - 1)
  290.       baseFormat = 0;
  291.     break;
  292.   case GLUT_KEY_UP:
  293.     if (--baseFormat < 0)
  294.       baseFormat = NUM_BASE_FORMATS - 1;
  295.     break;
  296.   case GLUT_KEY_LEFT:
  297.     --baseFormats[baseFormat].current;
  298.     if (baseFormats[baseFormat].current < 0)
  299.       baseFormats[baseFormat].current =
  300.         baseFormats[baseFormat].number - 1;
  301.     break;
  302.   case GLUT_KEY_RIGHT:
  303.     ++baseFormats[baseFormat].current;
  304.     if (baseFormats[baseFormat].current > baseFormats[baseFormat].number - 1)
  305.       baseFormats[baseFormat].current = 0;
  306.     break;
  307.   default:
  308.     break;
  309.   }
  310.   glutPostRedisplay();
  311. }
  312. void
  313. reshape(int w, int h)
  314. {
  315.   winWidth = w;
  316.   winHeight = h;
  317.   /* No need to call glViewPort here since "draw" calls it! */
  318. }
  319. static void
  320. loadTexture(int width, int height, struct formatInfo *format)
  321. {
  322.   int luminanceSize = 0;
  323.   int alphaSize = 0;
  324.   int rgbSize = 0;
  325.   GLenum textureFormat;
  326.   GLubyte *texImage, *p;
  327.   int elementsPerGroup, elementSize, groupSize, rowSize;
  328.   int i, j;
  329.   switch (format->baseFormat) {
  330.   case GL_LUMINANCE:
  331. #if GL_EXT_texture
  332.   case GL_INTENSITY_EXT:
  333. #endif
  334.     luminanceSize = 1;
  335.     textureFormat = GL_LUMINANCE;
  336.     break;
  337.   case GL_ALPHA:
  338.     alphaSize = 1;
  339.     textureFormat = GL_ALPHA;
  340.     break;
  341.   case GL_LUMINANCE_ALPHA:
  342.     luminanceSize = 1;
  343.     alphaSize = 1;
  344.     textureFormat = GL_LUMINANCE_ALPHA;
  345.     break;
  346.   case GL_RGB:
  347.     rgbSize = 3;
  348.     textureFormat = GL_RGB;
  349.     break;
  350.   case GL_RGBA:
  351.     rgbSize = 3;
  352.     alphaSize = 1;
  353.     textureFormat = GL_RGBA;
  354.     break;
  355.   default:
  356.     fprintf(stderr, "bad internal format infon");
  357.     return;
  358.   }
  359.   elementsPerGroup = luminanceSize + alphaSize + rgbSize;
  360.   elementSize = sizeof(GLubyte);
  361.   groupSize = elementsPerGroup * elementSize;
  362.   rowSize = width * groupSize;
  363.   if ((texImage = (GLubyte *) malloc(height * rowSize)) == NULL) {
  364.     fprintf(stderr, "texture malloc failedn");
  365.     return;
  366.   }
  367.   for (i = 0; i < height; ++i) {
  368.     p = texImage + i * rowSize;
  369.     for (j = 0; j < width; ++j) {
  370.       if (luminanceSize > 0) {
  371.         /** 
  372.          ** +-----+-----+
  373.  ** |     |     |
  374.  ** |  W  | LG  |
  375.  ** |     |     |
  376.  ** +-----+-----+
  377.  ** |     |     |
  378.  ** | DG  |  B  |
  379.  ** |     |     |
  380.  ** +-----+-----+
  381.  **/
  382.         if (i > height / 2) {
  383.           if (j < width / 2) {
  384.             p[0] = 0xff;
  385.           } else {
  386.             p[0] = 0xaa;
  387.           }
  388.         } else {
  389.           if (j < width / 2) {
  390.             p[0] = 0x55;
  391.           } else {
  392.             p[0] = 0x00;
  393.           }
  394.         }
  395.         p += elementSize;
  396.       }
  397.       if (rgbSize > 0) {
  398.         /**
  399.          ** +-----+-----+
  400.  ** |     |     |
  401.  ** |  R  |  G  |
  402.          ** |     |     |
  403.  ** +-----+-----+
  404.  ** |     |     |
  405.          ** |  Y  |  B  |
  406.  ** |     |     |
  407.  ** +-----+-----+
  408.  **/
  409.         if (i > height / 2) {
  410.           if (j < width / 2) {
  411.             p[0] = 0xff;
  412.             p[1] = 0x00;
  413.             p[2] = 0x00;
  414.           } else {
  415.             p[0] = 0x00;
  416.             p[1] = 0xff;
  417.             p[2] = 0x00;
  418.           }
  419.         } else {
  420.           if (j < width / 2) {
  421.             p[0] = 0xff;
  422.             p[1] = 0xff;
  423.             p[2] = 0x00;
  424.           } else {
  425.             p[0] = 0x00;
  426.             p[1] = 0x00;
  427.             p[2] = 0xff;
  428.           }
  429.         }
  430.         p += 3 * elementSize;
  431.       }
  432.       if (alphaSize > 0) {
  433.         /**
  434.          ** +-----------+
  435.  ** |     W     |
  436.  ** |  +-----+  |
  437.          ** |  |     |  |
  438.  ** |  |  B  |  |
  439.  ** |  |     |  |
  440.          ** |  +-----+  |
  441.  ** |           |
  442.  ** +-----------+
  443.  **/
  444.         int i2 = i - height / 2;
  445.         int j2 = j - width / 2;
  446.         int h8 = height / 8;
  447.         int w8 = width / 8;
  448.         if (-h8 <= i2 && i2 <= h8 && -w8 <= j2 && j2 <= w8) {
  449.           p[0] = 0x00;
  450.         } else if (-2 * h8 <= i2 && i2 <= 2 * h8 && -2 * w8 <= j2 && j2 <= 2 * w8) {
  451.           p[0] = 0x55;
  452.         } else if (-3 * h8 <= i2 && i2 <= 3 * h8 && -3 * w8 <= j2 && j2 <= 3 * w8) {
  453.           p[0] = 0xaa;
  454.         } else {
  455.           p[0] = 0xff;
  456.         }
  457.         p += elementSize;
  458.       }
  459.     }
  460.   }
  461.   glTexImage2D(GL_TEXTURE_2D, 0,
  462.     format->internalFormat, width, height, 0,
  463.     textureFormat, GL_UNSIGNED_BYTE, texImage);
  464.   free(texImage);
  465. }
  466. static void
  467. drawCheck(int w, int h, GLfloat lightCheck[4], GLfloat darkCheck[4])
  468. {
  469.   float dw = 2.0 / w;
  470.   float dh = 2.0 / h;
  471.   int i, j;
  472.   for (i = 0; i < w; ++i) {
  473.     GLfloat x0 = -1.0 + i * dw;
  474.     GLfloat x1 = x0 + dw;
  475.     glBegin(GL_QUAD_STRIP);
  476.     for (j = 0; j <= h; ++j) {
  477.       GLfloat y = -1.0 + j * dh;
  478.       if ((i ^ j) & 1) {
  479.         glColor4fv(lightCheck);
  480.       } else {
  481.         glColor4fv(darkCheck);
  482.       }
  483.       glVertex2f(x0, y);
  484.       glVertex2f(x1, y);
  485.     }
  486.     glEnd();
  487.   }
  488. }
  489. static void
  490. drawSample(int x, int y, int w, int h,
  491.   struct formatInfo *format, struct envModeInfo *envMode)
  492. {
  493.   glViewport(x, y, w, h);
  494.   glScissor(x, y, w, h);
  495.   glClearColor(0.1, 0.1, 0.1, 1.0);
  496.   glClear(GL_COLOR_BUFFER_BIT);
  497.   begin2D(w, h);
  498.   drawString(format->name, 10, h - 15, labelInfoColor);
  499.   drawString(envMode->name, 10, 5, labelInfoColor);
  500.   end2D();
  501.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, envMode->mode);
  502.   glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, envColors[envColor]);
  503.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  504.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  505.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  506.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  507.   loadTexture(textureWidth, textureHeight, format);
  508.   if (drawBackground) {
  509.     drawCheck(15, 15, lightCheck, darkCheck);
  510.   }
  511.   if (drawBlended) {
  512.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  513.     glEnable(GL_BLEND);
  514.   }
  515.   if (drawSmooth) {
  516.     glShadeModel(GL_SMOOTH);
  517.   }
  518.   if (drawTextured) {
  519.     glEnable(GL_TEXTURE_2D);
  520.   }
  521.   glBegin(GL_QUADS);
  522.   glColor4f(1.0, 0.0, 0.0, 1.0);
  523.   glTexCoord2f(0.0, 0.0);
  524.   glVertex2f(-0.8, -0.8);
  525.   glColor4f(0.0, 1.0, 0.0, 1.0);
  526.   glTexCoord2f(1.0, 0.0);
  527.   glVertex2f(0.8, -0.8);
  528.   glColor4f(0.0, 0.0, 1.0, 1.0);
  529.   glTexCoord2f(1.0, 1.0);
  530.   glVertex2f(0.8, 0.8);
  531.   glColor4f(1.0, 1.0, 1.0, 1.0);
  532.   glTexCoord2f(0.0, 1.0);
  533.   glVertex2f(-0.8, 0.8);
  534.   glEnd();
  535.   glDisable(GL_BLEND);
  536.   glShadeModel(GL_FLAT);
  537.   glDisable(GL_TEXTURE_2D);
  538.   if (displayLevelInfo) {
  539.     GLint width, height, border, components;
  540. #if GL_EXT_texture
  541.     GLint redSize, greenSize, blueSize, alphaSize;
  542.     GLint luminanceSize, intensitySize;
  543. #endif
  544.     char buf[255];
  545.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  546.       GL_TEXTURE_WIDTH, &width);
  547.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  548.       GL_TEXTURE_HEIGHT, &height);
  549.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  550.       GL_TEXTURE_BORDER, &border);
  551.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  552.       GL_TEXTURE_COMPONENTS, &components);
  553. #if GL_EXT_texture
  554.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  555.       GL_TEXTURE_RED_SIZE_EXT, &redSize);
  556.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  557.       GL_TEXTURE_GREEN_SIZE_EXT, &greenSize);
  558.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  559.       GL_TEXTURE_BLUE_SIZE_EXT, &blueSize);
  560.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  561.       GL_TEXTURE_ALPHA_SIZE_EXT, &alphaSize);
  562.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  563.       GL_TEXTURE_LUMINANCE_SIZE_EXT, &luminanceSize);
  564.     glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
  565.       GL_TEXTURE_INTENSITY_SIZE_EXT, &intensitySize);
  566. #endif
  567.     begin2D(w, h);
  568.     sprintf(buf, "dimensions: %d x %d", width, height);
  569.     drawStringOutline(buf, 15, h / 2 + 20, labelLevelColor0, labelLevelColor1);
  570.     sprintf(buf, "border: %d", border);
  571.     drawStringOutline(buf, 15, h / 2 + 10, labelLevelColor0, labelLevelColor1);
  572.     sprintf(buf, "components: 0x%04X", components);
  573.     drawStringOutline(buf, 15, h / 2, labelLevelColor0, labelLevelColor1);
  574.     sprintf(buf, "sizes:");
  575.     drawStringOutline(buf, 15, h / 2 - 10, labelLevelColor0, labelLevelColor1);
  576. #if GL_EXT_texture
  577.     sprintf(buf, "  %d/%d/%d/%d/%d/%d",
  578.       redSize, greenSize, blueSize, alphaSize,
  579.       luminanceSize, intensitySize);
  580.     drawStringOutline(buf, 15, h / 2 - 20, labelLevelColor0, labelLevelColor1);
  581. #endif
  582.     end2D();
  583.   }
  584. }
  585. static void
  586. display(void)
  587. {
  588.   int numX = NUM_ENV_MODES, numY = NUM_BASE_FORMATS;
  589.   float xBase = (float) winWidth * 0.01;
  590.   float xOffset = (winWidth - xBase) / numX;
  591.   float xSize = max(xOffset - xBase, 1);
  592.   float yBase = (float) winHeight * 0.01;
  593.   float yOffset = (winHeight - yBase) / numY;
  594.   float ySize = max(yOffset - yBase, 1);
  595.   float x, y;
  596.   int i, j;
  597.   glViewport(0, 0, winWidth, winHeight);
  598.   glDisable(GL_SCISSOR_TEST);
  599.   glClearColor(0.0, 0.0, 0.0, 0.0);
  600.   glClear(GL_COLOR_BUFFER_BIT);
  601.   glEnable(GL_SCISSOR_TEST);
  602.   x = xBase;
  603.   y = (winHeight - 1) - yOffset;
  604.   for (i = 0; i < NUM_BASE_FORMATS; ++i) {
  605.     struct formatInfo *format;
  606.     if (i == baseFormat) {
  607.       labelInfoColor = labelColor1;
  608.     } else {
  609.       labelInfoColor = labelColor0;
  610.     }
  611.     format = &baseFormats[i].format[baseFormats[i].current];
  612.     for (j = 0; j < NUM_ENV_MODES; ++j) {
  613.       struct envModeInfo *envMode;
  614.       envMode = &envModes[j];
  615.       drawSample(x, y, xSize, ySize, format, envMode);
  616.       x += xOffset;
  617.     }
  618.     x = xBase;
  619.     y -= yOffset;
  620.   }
  621.   if (doubleBuffered) {
  622.     glutSwapBuffers();
  623.   } else {
  624.     glFlush();
  625.   }
  626.   checkErrors();
  627. }
  628. static void
  629. usage(char *name)
  630. {
  631.   fprintf(stderr, "n");
  632.   fprintf(stderr, "usage: %s [ options ]n", name);
  633.   fprintf(stderr, "n");
  634.   fprintf(stderr, "    Tests texture environments and internal formatsn");
  635.   fprintf(stderr, "n");
  636.   fprintf(stderr, "  Options:n");
  637.   fprintf(stderr, "    -sb  single bufferedn");
  638.   fprintf(stderr, "    -db  double bufferedn");
  639.   fprintf(stderr, "n");
  640. }
  641. int
  642. main(int argc, char *argv[])
  643. {
  644.   int i;
  645.   glutInit(&argc, argv);
  646.   for (i = 1; i < argc; ++i) {
  647.     if (!strcmp("-sb", argv[i])) {
  648.       doubleBuffered = GL_FALSE;
  649.     } else if (!strcmp("-db", argv[i])) {
  650.       doubleBuffered = GL_TRUE;
  651.     } else {
  652.       usage(argv[0]);
  653.       exit(1);
  654.     }
  655.   }
  656. #if !GL_EXT_texture
  657.   printf("WARNING: client-side OpenGL implementation lacksn");
  658.   printf("         the GL_EXT_texture extension!n");
  659.   printf("         Skipping GL_EXT_texture functionality...n");
  660. #endif
  661.   if (doubleBuffered) {
  662.     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  663.   } else {
  664.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  665.   }
  666.   glutInitWindowSize(winWidth, winHeight);
  667.   glutCreateWindow("Texture Environment Test");
  668.   if (!glutExtensionSupported("GL_EXT_texture")) {
  669.     fprintf(stderr, "missing extension: GL_EXT_texturen");
  670.     exit(1);
  671.   }
  672.   initialize();
  673.   glutDisplayFunc(display);
  674.   glutReshapeFunc(reshape);
  675.   glutKeyboardFunc(keyboard);
  676.   glutSpecialFunc(special);
  677.   glutMainLoop();
  678.   return 0;             /* ANSI C requires main to return int. */
  679. }