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

GIS编程

开发平台:

Visual C++

  1. /* winpos.c */
  2. /*
  3.  * Example of how to use the GL_MESA_window_pos extension.
  4.  *
  5.  * This program is in the public domain
  6.  *
  7.  * Brian Paul
  8.  */
  9. /* Conversion to GLUT by Mark J. Kilgard */
  10. /* The GL_MESA_window_pos extension lets you set the OpenGL raster position
  11.    (used for positioning output from glBitmap and glDrawPixels) based on
  12.    window coordinates (assuming an origin at the lower-left window corner).
  13.    Mesa has an extension to do this operation quickly, but the program
  14.    will emulate the raster position update if the extension is not available.
  15.    See the implementation of glWindowPos4fMESAemulate. -mjk */
  16. #include <math.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <GL/glut.h>
  21. #ifndef M_PI
  22. #define M_PI 3.14159265
  23. #endif
  24. #define WIDTH 16
  25. #define HEIGHT 16
  26. int sizeX = WIDTH, sizeY = HEIGHT;
  27. GLubyte data[WIDTH * HEIGHT * 3];
  28. /* glWindowPos4fMESAemulate & glWindowPos2fMESAemulate are lifted from the
  29.    Mesa 2.0 src/winpos.c emulation code. -mjk */
  30. /*
  31.  * OpenGL implementation of glWindowPos*MESA()
  32.  */
  33. void 
  34. glWindowPos4fMESAemulate(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
  35. {
  36.   GLfloat fx, fy;
  37.   /* Push current matrix mode and viewport attributes */
  38.   glPushAttrib(GL_TRANSFORM_BIT | GL_VIEWPORT_BIT);
  39.   /* Setup projection parameters */
  40.   glMatrixMode(GL_PROJECTION);
  41.   glPushMatrix();
  42.   glLoadIdentity();
  43.   glMatrixMode(GL_MODELVIEW);
  44.   glPushMatrix();
  45.   glLoadIdentity();
  46.   glDepthRange(z, z);
  47.   glViewport((int) x - 1, (int) y - 1, 2, 2);
  48.   /* set the raster (window) position */
  49.   fx = x - (int) x;
  50.   fy = y - (int) y;
  51.   glRasterPos4f(fx, fy, 0.0, w);
  52.   /* restore matrices, viewport and matrix mode */
  53.   glPopMatrix();
  54.   glMatrixMode(GL_PROJECTION);
  55.   glPopMatrix();
  56.   glPopAttrib();
  57. }
  58. void
  59. glWindowPos2fMESAemulate(GLfloat x, GLfloat y)
  60. {
  61.   glWindowPos4fMESAemulate(x, y, 0, 1);
  62. }
  63. /* Make cheesy pixel image for glDrawPixels. */
  64. static void
  65. init(void)
  66. {
  67.   int i, j;
  68.   static char *pattern[16] =
  69.   {
  70.     "    ........    ",
  71.     "   ..........   ",
  72.     "  ...xx..xx...  ",
  73.     "  ............  ",
  74.     "   ...oooo...   ",
  75.     "*   ........    ",
  76.     "*oooooooooooooo*",
  77.     "      oooo     *",
  78.     "      oooo      ",
  79.     "      xxxx      ",
  80.     "      xxxx      ",
  81.     "     xx  xx     ",
  82.     "    xx    xx    ",
  83.     "   xx      xx   ",
  84.     "   **      **   ",
  85.     "  ***      ***  ",
  86.   };
  87.   GLubyte red, green, blue;
  88.   /* Generate a pixel image from pattern. */
  89.   for (i = 0; i < HEIGHT; i++) {
  90.     for (j = 0; j < WIDTH; j++) {
  91.       switch (pattern[HEIGHT - i - 1][j]) {
  92.       case '.':
  93.         red = 0xff;
  94.         green = 0xff;
  95.         blue = 0x00;
  96.         break;
  97.       case 'o':
  98.         red = 0xff;
  99.         green = 0x00;
  100.         blue = 0x00;
  101.         break;
  102.       case 'x':
  103.         red = 0x00;
  104.         green = 0xff;
  105.         blue = 0x00;
  106.         break;
  107.       case '*':
  108.         red = 0xff;
  109.         green = 0x00;
  110.         blue = 0xff;
  111.         break;
  112.       case ' ':
  113.         red = 0x00;
  114.         green = 0x00;
  115.         blue = 0x00;
  116.         break;
  117.       }
  118.       data[(i * WIDTH + j) * 3 + 0] = red;
  119.       data[(i * WIDTH + j) * 3 + 1] = green;
  120.       data[(i * WIDTH + j) * 3 + 2] = blue;
  121.     }
  122.   }
  123. }
  124. #ifdef GL_MESA_window_pos
  125. int emulate;
  126. #endif
  127. static void
  128. draw(void)
  129. {
  130.   GLfloat angle;
  131.   glClear(GL_COLOR_BUFFER_BIT);
  132.   for (angle = -45.0; angle <= 135.0; angle += 10.0) {
  133.     GLfloat x = 50.0 + 200.0 * cos(angle * M_PI / 180.0);
  134.     GLfloat y = 50.0 + 200.0 * sin(angle * M_PI / 180.0);
  135. #ifdef GL_MESA_window_pos
  136.     /* Don't need to worry about the modelview or projection
  137.        matrices!!! */
  138.     if (!emulate)
  139.       glWindowPos2fMESA(x, y);
  140.     else
  141. #endif
  142.       glWindowPos2fMESAemulate(x, y);
  143.     glDrawPixels(sizeX, sizeY, GL_RGB,
  144.       GL_UNSIGNED_BYTE, data);
  145.   }
  146.   glFlush();
  147. }
  148. /* ARGSUSED1 */
  149. static void
  150. key(unsigned char k, int x, int y)
  151. {
  152.   switch (k) {
  153.   case 27:
  154.     exit(0);
  155.   }
  156. }
  157. int
  158. main(int argc, char *argv[])
  159. {
  160.   glutInitWindowSize(500, 500);
  161.   glutInit(&argc, argv);
  162.   glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  163.   glutCreateWindow("winpos");
  164.   if (glutExtensionSupported("GL_MESA_window_pos")) {
  165.     printf("OpenGL implementation supports Mesa's GL_MESA_window_pos extension.");
  166. #ifdef GL_MESA_window_pos
  167.     emulate = 0;
  168. #else
  169.     printf("(Not compiled to support the extension.)n");
  170.     printf("Emulating...n");
  171. #endif
  172.   } else {
  173.     printf("Sorry, GL_MESA_window_pos extension not available.n");
  174.     printf("Emulating...n");
  175. #ifdef GL_MESA_window_pos
  176.     emulate = 1;
  177. #else
  178.     printf("(Not compiled to support the extension even if available.)n");
  179. #endif
  180.   }
  181.   init();
  182.   glutDisplayFunc(draw);
  183.   glutKeyboardFunc(key);
  184.   glutMainLoop();
  185.   return 0;             /* ANSI C requires main to return int. */
  186. }