📄 glut_dstr.c
字号:
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 + -