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

📄 glut_dstr.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                  mode->cap[TRANSPARENT] = 0;                }#else                mode->cap[SLOW] = 0;                mode->cap[CONFORMANT] = 1;#endif#if defined(GLX_VERSION_1_1) && defined(GLX_EXT_visual_info)                if (visual_info) {                  int transparent;/* babcock@cs.montana.edu reported that DEC UNIX (OSF1) V4.0   564 for Alpha did not properly define   GLX_TRANSPARENT_TYPE_EXT in <GL/glx.h> despite claiming to   support GLX_EXT_visual_info. */#ifndef GLX_TRANSPARENT_TYPE_EXT#define GLX_TRANSPARENT_TYPE_EXT 0x23#endif                  rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay,		    fbc, GLX_TRANSPARENT_TYPE_EXT, &transparent);                  if (rc != 0) {                    mode->cap[TRANSPARENT] = 0;                  } else {                    mode->cap[TRANSPARENT] = (transparent != GLX_NONE_EXT);                  }                } else {                  mode->cap[TRANSPARENT] = 0;                }#else                mode->cap[TRANSPARENT] = 0;#endif#if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)                if (multisample) {                  rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay,		    fbc, GLX_SAMPLES_SGIS, &mode->cap[SAMPLES]);                  if (rc != 0) {                    mode->cap[SAMPLES] = 0;                  }                } else {                  mode->cap[SAMPLES] = 0;                }#else                mode->cap[SAMPLES] = 0;#endif              } else {                /* Fbconfig is not RGBA; GLUT only uses RGBA                   FBconfigs. */                /* XXX Code could be exteneded to handle color                   index FBconfigs, but seems a color index                   window-renderable FBconfig would also be                   advertised as an X visual. */                mode->valid = 0;              }            } else {              /* Fbconfig does not support window rendering;                 not a valid FBconfig for GLUT windows. */              mode->valid = 0;            }          } else {            /* FBconfig ID is None (zero); not a valid               FBconfig. */            mode->valid = 0;          }        } else {          /* FBconfig ID is None (zero); not a valid FBconfig. */          mode->valid = 0;        }      } else {        /* No SGIX_fbconfig GLX sever implementation support. */        mode->valid = 0;      }#else      /* No SGIX_fbconfig GLX extension API support. */      mode->valid = 0;#endif    }  }  free(vlist);  *nitems_return = n;  return fbmodes;}static XVisualInfo *findMatch(FrameBufferMode * fbmodes, int nfbmodes,  Criterion * criteria, int ncriteria, void **fbc){  FrameBufferMode *found;  int *bestScore, *thisScore;  int i, j, numok, result = 0, worse, better;  found = NULL;  numok = 1;            /* "num" capability is indexed from 1,                           not 0. */  /* XXX alloca canidate. */  bestScore = (int *) malloc(ncriteria * sizeof(int));  if (!bestScore)    __glutFatalError("out of memory.");  for (j = 0; j < ncriteria; j++) {    /* Very negative number. */    bestScore[j] = -32768;  }  /* XXX alloca canidate. */  thisScore = (int *) malloc(ncriteria * sizeof(int));  if (!thisScore)    __glutFatalError("out of memory.");  for (i = 0; i < nfbmodes; i++) {    if (fbmodes[i].valid) {#ifdef TEST#if !defined(_WIN32)      if (verbose)        printf("Visual 0x%x\n", fbmodes[i].vi->visualid);#endif#endif      worse = 0;      better = 0;      for (j = 0; j < ncriteria; j++) {        int cap, cvalue, fbvalue;        cap = criteria[j].capability;        cvalue = criteria[j].value;        if (cap == NUM) {          fbvalue = numok;        } else {          fbvalue = fbmodes[i].cap[cap];        }#ifdef TEST        if (verbose)          printf("  %s %s %d to %d\n",            capstr[cap], compstr[criteria[j].comparison], cvalue, fbvalue);#endif        switch (criteria[j].comparison) {        case EQ:          result = cvalue == fbvalue;          thisScore[j] = 1;          break;        case NEQ:          result = cvalue != fbvalue;          thisScore[j] = 1;          break;        case LT:          result = fbvalue < cvalue;          thisScore[j] = fbvalue - cvalue;          break;        case GT:          result = fbvalue > cvalue;          thisScore[j] = fbvalue - cvalue;          break;        case LTE:          result = fbvalue <= cvalue;          thisScore[j] = fbvalue - cvalue;          break;        case GTE:          result = (fbvalue >= cvalue);          thisScore[j] = fbvalue - cvalue;          break;        case MIN:          result = fbvalue >= cvalue;          thisScore[j] = cvalue - fbvalue;          break;        }#ifdef TEST        if (verbose)          printf("                result=%d   score=%d   bestScore=%d\n", result, thisScore[j], bestScore[j]);#endif        if (result) {          if (better || thisScore[j] > bestScore[j]) {            better = 1;          } else if (thisScore[j] == bestScore[j]) {            /* Keep looking. */          } else {            goto nextFBM;          }        } else {          if (cap == NUM) {            worse = 1;          } else {            goto nextFBM;          }        }      }      if (better && !worse) {        found = &fbmodes[i];        for (j = 0; j < ncriteria; j++) {          bestScore[j] = thisScore[j];        }      }      numok++;    nextFBM:;    }  }  free(bestScore);  free(thisScore);  if (found) {#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_fbconfig)    *fbc = found->fbc;#endif    return found->vi;  } else {    return NULL;  }}static intparseCriteria(char *word, Criterion * criterion, int *mask,  Bool * allowDoubleAsSingle){  char *cstr, *vstr, *response;  int comparator, value = 0;  int rgb, rgba, acc, acca, count, i;  cstr = strpbrk(word, "=><!~");  if (cstr) {    switch (cstr[0]) {    case '=':      comparator = EQ;      vstr = &cstr[1];      break;    case '~':      comparator = MIN;      vstr = &cstr[1];      break;    case '>':      if (cstr[1] == '=') {        comparator = GTE;        vstr = &cstr[2];      } else {        comparator = GT;        vstr = &cstr[1];      }      break;    case '<':      if (cstr[1] == '=') {        comparator = LTE;        vstr = &cstr[2];      } else {        comparator = LT;        vstr = &cstr[1];      }      break;    case '!':      if (cstr[1] == '=') {        comparator = NEQ;        vstr = &cstr[2];      } else {        return -1;      }      break;    default:      return -1;    }    value = (int) strtol(vstr, &response, 0);    if (response == vstr) {      /* Not a valid number. */      return -1;    }    *cstr = '\0';  } else {    comparator = NONE;  }  switch (word[0]) {  case 'a':    if (!strcmp(word, "alpha")) {      criterion[0].capability = ALPHA_SIZE;      if (comparator == NONE) {        criterion[0].comparison = GTE;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << RGBA);      *mask |= (1 << ALPHA_SIZE);      *mask |= (1 << RGBA_MODE);      return 1;    }    acca = !strcmp(word, "acca");    acc = !strcmp(word, "acc");    if (acc || acca) {      criterion[0].capability = ACCUM_RED_SIZE;      criterion[1].capability = ACCUM_GREEN_SIZE;      criterion[2].capability = ACCUM_BLUE_SIZE;      criterion[3].capability = ACCUM_ALPHA_SIZE;      if (acca) {        count = 4;      } else {        count = 3;        criterion[3].comparison = MIN;        criterion[3].value = 0;      }      if (comparator == NONE) {        comparator = GTE;        value = 8;      }      for (i = 0; i < count; i++) {        criterion[i].comparison = comparator;        criterion[i].value = value;      }      *mask |= (1 << ACCUM_RED_SIZE);      return 4;    }    if (!strcmp(word, "auxbufs")) {      criterion[0].capability = AUX_BUFFERS;      if (comparator == NONE) {        criterion[0].comparison = MIN;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << AUX_BUFFERS);      return 1;    }    return -1;  case 'b':    if (!strcmp(word, "blue")) {      criterion[0].capability = BLUE_SIZE;      if (comparator == NONE) {        criterion[0].comparison = GTE;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << RGBA);      *mask |= (1 << RGBA_MODE);      return 1;    }    if (!strcmp(word, "buffer")) {      criterion[0].capability = BUFFER_SIZE;      if (comparator == NONE) {        criterion[0].comparison = GTE;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      return 1;    }    return -1;  case 'c':    if (!strcmp(word, "conformant")) {      criterion[0].capability = CONFORMANT;      if (comparator == NONE) {        criterion[0].comparison = EQ;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << CONFORMANT);      return 1;    }    return -1;  case 'd':    if (!strcmp(word, "depth")) {      criterion[0].capability = DEPTH_SIZE;      if (comparator == NONE) {        criterion[0].comparison = GTE;        criterion[0].value = 12;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << DEPTH_SIZE);      return 1;    }    if (!strcmp(word, "double")) {      criterion[0].capability = DOUBLEBUFFER;      if (comparator == NONE) {        criterion[0].comparison = EQ;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << DOUBLEBUFFER);      return 1;    }    return -1;  case 'g':    if (!strcmp(word, "green")) {      criterion[0].capability = GREEN_SIZE;      if (comparator == NONE) {        criterion[0].comparison = GTE;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << RGBA);      *mask |= (1 << RGBA_MODE);      return 1;    }    return -1;  case 'i':    if (!strcmp(word, "index")) {      criterion[0].capability = RGBA;      criterion[0].comparison = EQ;      criterion[0].value = 0;      *mask |= (1 << RGBA);      *mask |= (1 << CI_MODE);      criterion[1].capability = BUFFER_SIZE;      if (comparator == NONE) {        criterion[1].comparison = GTE;        criterion[1].value = 1;      } else {        criterion[1].comparison = comparator;        criterion[1].value = value;      }      return 2;    }    return -1;  case 'l':    if (!strcmp(word, "luminance")) {      criterion[0].capability = RGBA;      criterion[0].comparison = EQ;      criterion[0].value = 1;      criterion[1].capability = RED_SIZE;      if (comparator == NONE) {        criterion[1].comparison = GTE;        criterion[1].value = 1;      } else {        criterion[1].comparison = comparator;        criterion[1].value = value;      }      criterion[2].capability = GREEN_SIZE;      criterion[2].comparison = EQ;      criterion[2].value = 0;      criterion[3].capability = BLUE_SIZE;      criterion[3].comparison = EQ;      criterion[3].value = 0;      *mask |= (1 << RGBA);      *mask |= (1 << RGBA_MODE);      *mask |= (1 << LUMINANCE_MODE);      return 4;    }    return -1;  case 'n':    if (!strcmp(word, "num")) {      criterion[0].capability = NUM;      if (comparator == NONE) {        return -1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;        return 1;      }    }    return -1;  case 'r':    if (!strcmp(word, "red")) {      criterion[0].capability = RED_SIZE;      if (comparator == NONE) {        criterion[0].comparison = GTE;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << RGBA);      *mask |= (1 << RGBA_MODE);      return 1;    }    rgba = !strcmp(word, "rgba");    rgb = !strcmp(word, "rgb");    if (rgb || rgba) {      criterion[0].capability = RGBA;      criterion[0].comparison = EQ;      criterion[0].value = 1;      criterion[1].capability = RED_SIZE;      criterion[2].capability = GREEN_SIZE;      criterion[3].capability = BLUE_SIZE;      criterion[4].capability = ALPHA_SIZE;      if (rgba) {        count = 5;      } else {        count = 4;        criterion[4].comparison = MIN;        criterion[4].value = 0;      }      if (comparator == NONE) {        comparator = GTE;        value = 1;      }      for (i = 1; i < count; i++) {        criterion[i].comparison = comparator;        criterion[i].value = value;      }      *mask |= (1 << RGBA);      *mask |= (1 << RGBA_MODE);      return 5;    }    return -1;  case 's':    if (!strcmp(word, "stencil")) {      criterion[0].capability = STENCIL_SIZE;      if (comparator == NONE) {        criterion[0].comparison = MIN;        criterion[0].value = 1;      } else {        criterion[0].comparison = comparator;        criterion[0].value = value;      }      *mask |= (1 << STENCIL_SIZE);      return 1;    }    if (!strcmp(word, "single")) {      criterion[0].capability = DOUBLEBUFFER;      if (comparator == NONE) {        criterion[0].comparison = EQ;        criterion[0].value = 0;        *allowDoubleAsSingle = True;        *mask |= (1 << DOUBLEBUFFER);        return 1;      } else {        return -1;      }    }    if (!strcmp(word, "stereo")) {      criterion[0].capability = STEREO;      if (comparator == NONE) {        criterion[0].comparison = EQ;        criterion[0].value = 1;      } else {

⌨️ 快捷键说明

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