⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win32_glx.c

📁 mesa-6.5-minigui源码
💻 C
字号:
/* Copyright (c) Nate Robins, 1997. *//* This program is freely distributable without licensing fees   and is provided without guarantee or warrantee expressed or   implied. This program is -not- in the public domain. */#include <stdio.h>#include "glutint.h"#include "win32_glx.h"/* global current HDC */extern HDC XHDC;GLXContextglXCreateContext(Display * display, XVisualInfo * visinfo,  GLXContext share, Bool direct){  /* KLUDGE: GLX really expects a display pointer to be passed     in as the first parameter, but Win32 needs an HDC instead,     so BE SURE that the global XHDC is set before calling this     routine. */  HGLRC context;  context = CreateContext(XHDC);#if 0  /* XXX GLUT doesn't support it now, so don't worry about display list     and texture object sharing. */  if (share) {    wglShareLists(share, context);  }#endif  /* Since direct rendering is implicit, the direct flag is     ignored. */  return context;}intglXGetConfig(Display * display, XVisualInfo * visual, int attrib, int *value){  if (!visual)    return GLX_BAD_VISUAL;  switch (attrib) {  case GLX_USE_GL:    if (visual->dwFlags & (PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW)) {      /* XXX Brad's Matrix Millenium II has problems creating         color index windows in 24-bit mode (lead to GDI crash)         and 32-bit mode (lead to black window).  The cColorBits         filed of the PIXELFORMATDESCRIPTOR returned claims to         have 24 and 32 bits respectively of color indices. 2^24         and 2^32 are ridiculously huge writable colormaps.         Assume that if we get back a color index         PIXELFORMATDESCRIPTOR with 24 or more bits, the         PIXELFORMATDESCRIPTOR doesn't really work and skip it.         -mjk */      if (visual->iPixelType == PFD_TYPE_COLORINDEX        && visual->cColorBits >= 24) {        *value = 0;      } else {	*value = 1;      }    } else {      *value = 0;    }    break;  case GLX_BUFFER_SIZE:    /* KLUDGE: if we're RGBA, return the number of bits/pixel,       otherwise, return 8 (we guessed at 256 colors in CI       mode). */    if (visual->iPixelType == PFD_TYPE_RGBA)      *value = visual->cColorBits;    else      *value = 8;    break;  case GLX_LEVEL:    /* The bReserved flag of the pfd contains the       overlay/underlay info. */    *value = visual->bReserved;    break;  case GLX_RGBA:    *value = visual->iPixelType == PFD_TYPE_RGBA;    break;  case GLX_DOUBLEBUFFER:    *value = visual->dwFlags & PFD_DOUBLEBUFFER;    break;  case GLX_STEREO:    *value = visual->dwFlags & PFD_STEREO;    break;  case GLX_AUX_BUFFERS:    *value = visual->cAuxBuffers;    break;  case GLX_RED_SIZE:    *value = visual->cRedBits;    break;  case GLX_GREEN_SIZE:    *value = visual->cGreenBits;    break;  case GLX_BLUE_SIZE:    *value = visual->cBlueBits;    break;  case GLX_ALPHA_SIZE:    *value = visual->cAlphaBits;    break;  case GLX_DEPTH_SIZE:    *value = visual->cDepthBits;    break;  case GLX_STENCIL_SIZE:    *value = visual->cStencilBits;    break;  case GLX_ACCUM_RED_SIZE:    *value = visual->cAccumRedBits;    break;  case GLX_ACCUM_GREEN_SIZE:    *value = visual->cAccumGreenBits;    break;  case GLX_ACCUM_BLUE_SIZE:    *value = visual->cAccumBlueBits;    break;  case GLX_ACCUM_ALPHA_SIZE:    *value = visual->cAccumAlphaBits;    break;  default:    return GLX_BAD_ATTRIB;  }  return 0;}XVisualInfo *glXChooseVisual(Display * display, int screen, int *attribList){  /* KLUDGE: since we need the HDC, MAKE SURE to set XHDC     before calling this routine. */  int *p = attribList;  int pf;  PIXELFORMATDESCRIPTOR pfd;  PIXELFORMATDESCRIPTOR *match = NULL;  int stereo = 0;  /* Avoid seg-faults. */  if (!p)    return NULL;  memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));  pfd.nSize = (sizeof(PIXELFORMATDESCRIPTOR));  pfd.nVersion = 1;  /* Defaults. */  pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;  pfd.iPixelType = PFD_TYPE_COLORINDEX;  pfd.cColorBits = 32;  pfd.cDepthBits = 0;  while (*p) {    switch (*p) {    case GLX_USE_GL:      pfd.dwFlags |= PFD_SUPPORT_OPENGL;      break;    case GLX_BUFFER_SIZE:      pfd.cColorBits = *(++p);      break;    case GLX_LEVEL:      /* the bReserved flag of the pfd contains the         overlay/underlay info. */      pfd.bReserved = *(++p);      break;    case GLX_RGBA:      pfd.iPixelType = PFD_TYPE_RGBA;      break;    case GLX_DOUBLEBUFFER:      pfd.dwFlags |= PFD_DOUBLEBUFFER;      break;    case GLX_STEREO:      stereo = 1;      pfd.dwFlags |= PFD_STEREO;      break;    case GLX_AUX_BUFFERS:      pfd.cAuxBuffers = *(++p);      break;    case GLX_RED_SIZE:      pfd.cRedBits = 8; /* Try to get the maximum. */      ++p;      break;    case GLX_GREEN_SIZE:      pfd.cGreenBits = 8;      ++p;      break;    case GLX_BLUE_SIZE:      pfd.cBlueBits = 8;      ++p;      break;    case GLX_ALPHA_SIZE:      pfd.cAlphaBits = 8;      ++p;      break;    case GLX_DEPTH_SIZE:      pfd.cDepthBits = 32;      ++p;      break;    case GLX_STENCIL_SIZE:      pfd.cStencilBits = *(++p);      break;    case GLX_ACCUM_RED_SIZE:    case GLX_ACCUM_GREEN_SIZE:    case GLX_ACCUM_BLUE_SIZE:    case GLX_ACCUM_ALPHA_SIZE:      /* I believe that WGL only used the cAccumRedBits,	 cAccumBlueBits, cAccumGreenBits, and cAccumAlphaBits fields	 when returning info about the accumulation buffer precision.	 Only cAccumBits is used for requesting an accumulation	 buffer. */      pfd.cAccumBits = 1;      ++p;      break;    }    ++p;  }  /* Let Win32 choose one for us. */  pf = ChoosePixelFormat(XHDC, &pfd);  if (pf > 0) {    match = (PIXELFORMATDESCRIPTOR *) malloc(sizeof(PIXELFORMATDESCRIPTOR));    DescribePixelFormat(XHDC, pf, sizeof(PIXELFORMATDESCRIPTOR), match);    /* ChoosePixelFormat is dumb in that it will return a pixel       format that doesn't have stereo even if it was requested       so we need to make sure that if stereo was selected, we       got it. */    if (stereo) {      if (!(match->dwFlags & PFD_STEREO)) {        free(match);	return NULL;      }    }    /* XXX Brad's Matrix Millenium II has problems creating       color index windows in 24-bit mode (lead to GDI crash)       and 32-bit mode (lead to black window).  The cColorBits       filed of the PIXELFORMATDESCRIPTOR returned claims to       have 24 and 32 bits respectively of color indices. 2^24       and 2^32 are ridiculously huge writable colormaps.       Assume that if we get back a color index       PIXELFORMATDESCRIPTOR with 24 or more bits, the       PIXELFORMATDESCRIPTOR doesn't really work and skip it.       -mjk */    if (match->iPixelType == PFD_TYPE_COLORINDEX      && match->cColorBits >= 24) {      free(match);      return NULL;    }  }  return match;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -