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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
  2. /* This program is freely distributable without licensing fees
  3.    and is provided without guarantee or warrantee expressed or
  4.    implied. This program is -not- in the public domain. */
  5. #include <assert.h>
  6. #include <stdlib.h>  /* SunOS 4 needs NULL defined for GETTIMEOFDAY macro. */
  7. #include "glutint.h"
  8. /* CENTRY */
  9. int APIENTRY 
  10. glutGet(GLenum param)
  11. {
  12.   Window win, root;
  13.   int x, y, value;
  14.   unsigned int width, height, border, depth;
  15.   switch (param) {
  16.   case GLUT_INIT_WINDOW_X:
  17.     return __glutInitX;
  18.   case GLUT_INIT_WINDOW_Y:
  19.     return __glutInitY;
  20.   case GLUT_INIT_WINDOW_WIDTH:
  21.     return __glutInitWidth;
  22.   case GLUT_INIT_WINDOW_HEIGHT:
  23.     return __glutInitHeight;
  24.   case GLUT_INIT_DISPLAY_MODE:
  25.     return __glutDisplayMode;
  26.   case GLUT_WINDOW_X:
  27.     XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
  28.       __glutRoot, 0, 0, &x, &y, &win);
  29.     return x;
  30.   case GLUT_WINDOW_Y:
  31.     XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
  32.       __glutRoot, 0, 0, &x, &y, &win);
  33.     return y;
  34.   case GLUT_WINDOW_WIDTH:
  35.     if (!__glutCurrentWindow->reshape) {
  36.       XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
  37.         &root, &x, &y,
  38.         &width, &height, &border, &depth);
  39.       return width;
  40.     }
  41.     return __glutCurrentWindow->width;
  42.   case GLUT_WINDOW_HEIGHT:
  43.     if (!__glutCurrentWindow->reshape) {
  44.       XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
  45.         &root, &x, &y,
  46.         &width, &height, &border, &depth);
  47.       return height;
  48.     }
  49.     return __glutCurrentWindow->height;
  50. #define GET_CONFIG(attrib) { 
  51.   if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { 
  52.     glXGetConfig(__glutDisplay, __glutCurrentWindow->vis, 
  53.       attrib, &value); 
  54.   } else { 
  55.     glXGetConfig(__glutDisplay, __glutCurrentWindow->overlay->vis, 
  56.       attrib, &value); 
  57.   } 
  58. }
  59.   case GLUT_WINDOW_BUFFER_SIZE:
  60.     GET_CONFIG(GLX_BUFFER_SIZE);
  61.     return value;
  62.   case GLUT_WINDOW_STENCIL_SIZE:
  63.     GET_CONFIG(GLX_STENCIL_SIZE);
  64.     return value;
  65.   case GLUT_WINDOW_DEPTH_SIZE:
  66.     GET_CONFIG(GLX_DEPTH_SIZE);
  67.     return value;
  68.   case GLUT_WINDOW_RED_SIZE:
  69.     GET_CONFIG(GLX_RED_SIZE);
  70.     return value;
  71.   case GLUT_WINDOW_GREEN_SIZE:
  72.     GET_CONFIG(GLX_GREEN_SIZE);
  73.     return value;
  74.   case GLUT_WINDOW_BLUE_SIZE:
  75.     GET_CONFIG(GLX_BLUE_SIZE);
  76.     return value;
  77.   case GLUT_WINDOW_ALPHA_SIZE:
  78.     GET_CONFIG(GLX_ALPHA_SIZE);
  79.     return value;
  80.   case GLUT_WINDOW_ACCUM_RED_SIZE:
  81.     GET_CONFIG(GLX_ACCUM_RED_SIZE);
  82.     return value;
  83.   case GLUT_WINDOW_ACCUM_GREEN_SIZE:
  84.     GET_CONFIG(GLX_ACCUM_GREEN_SIZE);
  85.     return value;
  86.   case GLUT_WINDOW_ACCUM_BLUE_SIZE:
  87.     GET_CONFIG(GLX_ACCUM_BLUE_SIZE);
  88.     return value;
  89.   case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
  90.     GET_CONFIG(GLX_ACCUM_ALPHA_SIZE);
  91.     return value;
  92.   case GLUT_WINDOW_DOUBLEBUFFER:
  93.     GET_CONFIG(GLX_DOUBLEBUFFER);
  94.     return value;
  95.   case GLUT_WINDOW_RGBA:
  96.     GET_CONFIG(GLX_RGBA);
  97.     return value;
  98.   case GLUT_WINDOW_COLORMAP_SIZE:
  99.     GET_CONFIG(GLX_RGBA);
  100.     if (value) {
  101.       return 0;
  102.     } else {
  103. #if defined(_WIN32)
  104.       /* KLUDGE: we always assume 256 colors in CI mode on
  105.          Win32 */
  106.       return 256;
  107. #else
  108.       if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { 
  109.         return __glutCurrentWindow->vis->visual->map_entries;
  110.       } else {
  111.         return __glutCurrentWindow->overlay->vis->visual->map_entries;
  112.       }
  113. #endif /* _WIN32 */
  114.     }
  115.   case GLUT_WINDOW_PARENT:
  116.     return __glutCurrentWindow->parent ?
  117.       __glutCurrentWindow->parent->num + 1 : 0;
  118.   case GLUT_WINDOW_NUM_CHILDREN:
  119.     {
  120.       int num = 0;
  121.       GLUTwindow *children = __glutCurrentWindow->children;
  122.       while (children) {
  123.         num++;
  124.         children = children->siblings;
  125.       }
  126.       return num;
  127.     }
  128.   case GLUT_WINDOW_NUM_SAMPLES:
  129. #if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)
  130.     if (__glutIsSupportedByGLX("GLX_SGIS_multisample")) {
  131.       GET_CONFIG(GLX_SAMPLES_SGIS);
  132.       return value;
  133.     } else {
  134.       return 0;
  135.     }
  136. #else
  137.     /* Independent of GLX server support, multisampling not
  138.        supported by GLX client-side. */
  139.     return 0;
  140. #endif
  141.   case GLUT_WINDOW_STEREO:
  142.     GET_CONFIG(GLX_STEREO);
  143.     return value;
  144.   case GLUT_WINDOW_CURSOR:
  145.     return __glutCurrentWindow->cursor;
  146.   case GLUT_SCREEN_WIDTH:
  147.     return DisplayWidth(__glutDisplay, __glutScreen);
  148.   case GLUT_SCREEN_HEIGHT:
  149.     return DisplayHeight(__glutDisplay, __glutScreen);
  150.   case GLUT_SCREEN_WIDTH_MM:
  151.     return DisplayWidthMM(__glutDisplay, __glutScreen);
  152.   case GLUT_SCREEN_HEIGHT_MM:
  153.     return DisplayHeightMM(__glutDisplay, __glutScreen);
  154.   case GLUT_MENU_NUM_ITEMS:
  155.     return __glutCurrentMenu->num;
  156.   case GLUT_DISPLAY_MODE_POSSIBLE:
  157.     {
  158.       XVisualInfo *vi;
  159.       Bool dummy, visAlloced;
  160.       void *fbc;
  161. #if defined(_WIN32)      
  162.       /* Our fake glXChooseVisual (which is called by
  163.          __glutDetermineVisual) needs an HDC to work with, so grab one
  164.          from the "root" window. */
  165.       XHDC = GetDC(GetDesktopWindow());
  166. #endif
  167.       vi = __glutDetermineWindowVisual(&dummy, &visAlloced, &fbc);
  168. #if defined(_WIN32)      
  169.       ReleaseDC(GetDesktopWindow(), XHDC);
  170. #endif
  171.       if (vi) {
  172.         if (visAlloced)
  173.           XFree(vi);
  174.         return 1;
  175.       }
  176.       return 0;
  177.     }
  178.   case GLUT_ELAPSED_TIME:
  179.     {
  180.       struct timeval elapsed, beginning, now;
  181.       __glutInitTime(&beginning);
  182.       GETTIMEOFDAY(&now);
  183.       TIMEDELTA(elapsed, now, beginning);
  184.       /* Return elapsed milliseconds. */
  185. #if defined(__vms) && ( __VMS_VER < 70000000 )
  186.       return (int) (elapsed.val / TICKS_PER_MILLISECOND);
  187. #else
  188.       return (int) ((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000));
  189. #endif
  190.     }
  191.   case GLUT_WINDOW_FORMAT_ID:
  192. #if defined(_WIN32)
  193.     return GetPixelFormat(__glutCurrentWindow->hdc);
  194. #else
  195.     if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  196.       return (int) __glutCurrentWindow->vis->visualid;
  197.     } else {
  198.       return (int) __glutCurrentWindow->overlay->vis->visualid;
  199.     }
  200. #endif
  201.   default:
  202.     __glutWarning("invalid glutGet parameter: %d", param);
  203.     return -1;
  204.   }
  205. }
  206. /* ENDCENTRY */