home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 5 / MA_Cover_5.iso / ppc / mesa / src-glut / glut_get.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-31  |  5.4 KB  |  201 lines

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