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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Nate Robins, 1997. */
  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 "glutint.h"
  6. /* global current HDC */
  7. extern HDC XHDC;
  8. GLXContext
  9. glXCreateContext(Display * display, XVisualInfo * visinfo,
  10.   GLXContext share, Bool direct)
  11. {
  12.   /* KLUDGE: GLX really expects a display pointer to be passed
  13.      in as the first parameter, but Win32 needs an HDC instead,
  14.      so BE SURE that the global XHDC is set before calling this
  15.      routine. */
  16.   HGLRC context;
  17.   context = wglCreateContext(XHDC);
  18. #if 0
  19.   /* XXX GLUT doesn't support it now, so don't worry about display list
  20.      and texture object sharing. */
  21.   if (share) {
  22.     wglShareLists(share, context);
  23.   }
  24. #endif
  25.   /* Since direct rendering is implicit, the direct flag is
  26.      ignored. */
  27.   return context;
  28. }
  29. int
  30. glXGetConfig(Display * display, XVisualInfo * visual, int attrib, int *value)
  31. {
  32.   if (!visual)
  33.     return GLX_BAD_VISUAL;
  34.   switch (attrib) {
  35.   case GLX_USE_GL:
  36.     if ((visual->dwFlags & PFD_SUPPORT_OPENGL ) && (visual->dwFlags & PFD_DRAW_TO_WINDOW)) {
  37.       /* XXX Brad's Matrix Millenium II has problems creating
  38.          color index windows in 24-bit mode (lead to GDI crash)
  39.          and 32-bit mode (lead to black window).  The cColorBits
  40.          filed of the PIXELFORMATDESCRIPTOR returned claims to
  41.          have 24 and 32 bits respectively of color indices. 2^24
  42.          and 2^32 are ridiculously huge writable colormaps.
  43.          Assume that if we get back a color index
  44.          PIXELFORMATDESCRIPTOR with 24 or more bits, the
  45.          PIXELFORMATDESCRIPTOR doesn't really work and skip it.
  46.          -mjk */
  47.       if (visual->iPixelType == PFD_TYPE_COLORINDEX
  48.         && visual->cColorBits >= 24) {
  49.         *value = 0;
  50.       } else {
  51. *value = 1;
  52.       }
  53.     } else {
  54.       *value = 0;
  55.     }
  56.     break;
  57.   case GLX_BUFFER_SIZE:
  58.     /* KLUDGE: if we're RGBA, return the number of bits/pixel,
  59.        otherwise, return 8 (we guessed at 256 colors in CI
  60.        mode). */
  61.     if (visual->iPixelType == PFD_TYPE_RGBA)
  62.       *value = visual->cColorBits;
  63.     else
  64.       *value = 8;
  65.     break;
  66.   case GLX_LEVEL:
  67.     /* The bReserved flag of the pfd contains the
  68.        overlay/underlay info. */
  69.     *value = visual->bReserved;
  70.     break;
  71.   case GLX_RGBA:
  72.     *value = visual->iPixelType == PFD_TYPE_RGBA;
  73.     break;
  74.   case GLX_DOUBLEBUFFER:
  75.     *value = visual->dwFlags & PFD_DOUBLEBUFFER;
  76.     break;
  77.   case GLX_STEREO:
  78.     *value = visual->dwFlags & PFD_STEREO;
  79.     break;
  80.   case GLX_AUX_BUFFERS:
  81.     *value = visual->cAuxBuffers;
  82.     break;
  83.   case GLX_RED_SIZE:
  84.     *value = visual->cRedBits;
  85.     break;
  86.   case GLX_GREEN_SIZE:
  87.     *value = visual->cGreenBits;
  88.     break;
  89.   case GLX_BLUE_SIZE:
  90.     *value = visual->cBlueBits;
  91.     break;
  92.   case GLX_ALPHA_SIZE:
  93.     *value = visual->cAlphaBits;
  94.     break;
  95.   case GLX_DEPTH_SIZE:
  96.     *value = visual->cDepthBits;
  97.     break;
  98.   case GLX_STENCIL_SIZE:
  99.     *value = visual->cStencilBits;
  100.     break;
  101.   case GLX_ACCUM_RED_SIZE:
  102.     *value = visual->cAccumRedBits;
  103.     break;
  104.   case GLX_ACCUM_GREEN_SIZE:
  105.     *value = visual->cAccumGreenBits;
  106.     break;
  107.   case GLX_ACCUM_BLUE_SIZE:
  108.     *value = visual->cAccumBlueBits;
  109.     break;
  110.   case GLX_ACCUM_ALPHA_SIZE:
  111.     *value = visual->cAccumAlphaBits;
  112.     break;
  113.   default:
  114.     return GLX_BAD_ATTRIB;
  115.   }
  116.   return 0;
  117. }
  118. XVisualInfo *
  119. glXChooseVisual(Display * display, int screen, int *attribList)
  120. {
  121.   /* KLUDGE: since we need the HDC, MAKE SURE to set XHDC
  122.      before calling this routine. */
  123.   int *p = attribList;
  124.   int pf;
  125.   PIXELFORMATDESCRIPTOR pfd;
  126.   PIXELFORMATDESCRIPTOR *match = NULL;
  127.   int stereo = 0;
  128.   /* Avoid seg-faults. */
  129.   if (!p)
  130.     return NULL;
  131.   memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
  132.   pfd.nSize = (sizeof(PIXELFORMATDESCRIPTOR));
  133.   pfd.nVersion = 1;
  134.   /* Defaults. */
  135.   pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
  136.   pfd.iPixelType = PFD_TYPE_COLORINDEX;
  137.   pfd.cColorBits = 32;
  138.   pfd.cDepthBits = 0;
  139.   while (*p) {
  140.     switch (*p) {
  141.     case GLX_USE_GL:
  142.       pfd.dwFlags |= PFD_SUPPORT_OPENGL;
  143.       break;
  144.     case GLX_BUFFER_SIZE:
  145.       pfd.cColorBits = *(++p);
  146.       break;
  147.     case GLX_LEVEL:
  148.       /* the bReserved flag of the pfd contains the
  149.          overlay/underlay info. */
  150.       pfd.bReserved = *(++p);
  151.       break;
  152.     case GLX_RGBA:
  153.       pfd.iPixelType = PFD_TYPE_RGBA;
  154.       break;
  155.     case GLX_DOUBLEBUFFER:
  156.       pfd.dwFlags |= PFD_DOUBLEBUFFER;
  157.       break;
  158.     case GLX_STEREO:
  159.       stereo = 1;
  160.       pfd.dwFlags |= PFD_STEREO;
  161.       break;
  162.     case GLX_AUX_BUFFERS:
  163.       pfd.cAuxBuffers = *(++p);
  164.       break;
  165.     case GLX_RED_SIZE:
  166.       pfd.cRedBits = 8; /* Try to get the maximum. */
  167.       ++p;
  168.       break;
  169.     case GLX_GREEN_SIZE:
  170.       pfd.cGreenBits = 8;
  171.       ++p;
  172.       break;
  173.     case GLX_BLUE_SIZE:
  174.       pfd.cBlueBits = 8;
  175.       ++p;
  176.       break;
  177.     case GLX_ALPHA_SIZE:
  178.       pfd.cAlphaBits = 8;
  179.       ++p;
  180.       break;
  181.     case GLX_DEPTH_SIZE:
  182.       pfd.cDepthBits = 32;
  183.       ++p;
  184.       break;
  185.     case GLX_STENCIL_SIZE:
  186.       pfd.cStencilBits = *(++p);
  187.       break;
  188.     case GLX_ACCUM_RED_SIZE:
  189.     case GLX_ACCUM_GREEN_SIZE:
  190.     case GLX_ACCUM_BLUE_SIZE:
  191.     case GLX_ACCUM_ALPHA_SIZE:
  192.       /* I believe that WGL only used the cAccumRedBits,
  193.  cAccumBlueBits, cAccumGreenBits, and cAccumAlphaBits fields
  194.  when returning info about the accumulation buffer precision.
  195.  Only cAccumBits is used for requesting an accumulation
  196.  buffer. */
  197.       pfd.cAccumBits = 1;
  198.       ++p;
  199.       break;
  200.     }
  201.     ++p;
  202.   }
  203.   /* Let Win32 choose one for us. */
  204.   pf = ChoosePixelFormat(XHDC, &pfd);
  205.   if (pf > 0) {
  206.     match = (PIXELFORMATDESCRIPTOR *) malloc(sizeof(PIXELFORMATDESCRIPTOR));
  207.     DescribePixelFormat(XHDC, pf, sizeof(PIXELFORMATDESCRIPTOR), match);
  208.     /* ChoosePixelFormat is dumb in that it will return a pixel
  209.        format that doesn't have stereo even if it was requested
  210.        so we need to make sure that if stereo was selected, we
  211.        got it. */
  212.     if (stereo) {
  213.       if (!(match->dwFlags & PFD_STEREO)) {
  214.         free(match);
  215. return NULL;
  216.       }
  217.     }
  218.     /* XXX Brad's Matrix Millenium II has problems creating
  219.        color index windows in 24-bit mode (lead to GDI crash)
  220.        and 32-bit mode (lead to black window).  The cColorBits
  221.        filed of the PIXELFORMATDESCRIPTOR returned claims to
  222.        have 24 and 32 bits respectively of color indices. 2^24
  223.        and 2^32 are ridiculously huge writable colormaps.
  224.        Assume that if we get back a color index
  225.        PIXELFORMATDESCRIPTOR with 24 or more bits, the
  226.        PIXELFORMATDESCRIPTOR doesn't really work and skip it.
  227.        -mjk */
  228.     if (match->iPixelType == PFD_TYPE_COLORINDEX
  229.       && match->cColorBits >= 24) {
  230.       free(match);
  231.       return NULL;
  232.     }
  233.   }
  234.   return match;
  235. }