📄 text.cpp
字号:
#else glNewList(txf->texobj, GL_COMPILE);#endif#if 1 /* XXX Indigo2 IMPACT in IRIX 5.3 and 6.2 does not support the GL_INTENSITY internal texture format. Sigh. Win32 non-GLX users should disable this code. */ if (useLuminanceAlpha == 0) { char *vendor, *renderer, *version; renderer = (char *) glGetString(GL_RENDERER); vendor = (char *) glGetString(GL_VENDOR); if (!strcmp(vendor, "SGI") && !strncmp(renderer, "IMPACT", 6)) { version = (char *) glGetString(GL_VERSION); if (!strcmp(version, "1.0 Irix 6.2") || !strcmp(version, "1.0 Irix 5.3")) { unsigned char *latex; int width = txf->tex_width; int height = txf->tex_height; int i; useLuminanceAlpha = 1; latex = (unsigned char *) calloc(width * height * 2, 1); /* XXX unprotected alloc. */ for (i = 0; i < height * width; i++) { latex[i * 2] = txf->teximage[i]; latex[i * 2 + 1] = txf->teximage[i]; } free(txf->teximage); txf->teximage = latex; } } }#endif if (useLuminanceAlpha) { if (setupMipmaps) { gluBuild2DMipmaps(GL_TEXTURE_2D, GL_LUMINANCE_ALPHA, txf->tex_width, txf->tex_height, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, txf->teximage); } else { glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, txf->tex_width, txf->tex_height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, txf->teximage); } } else {#if defined(GL_VERSION_1_1) || defined(GL_EXT_texture) /* Use GL_INTENSITY4 as internal texture format since we want to use as little texture memory as possible. */ if (setupMipmaps) { gluBuild2DMipmaps(GL_TEXTURE_2D, GL_INTENSITY4, txf->tex_width, txf->tex_height, GL_LUMINANCE, GL_UNSIGNED_BYTE, txf->teximage); } else { glTexImage2D(GL_TEXTURE_2D, 0, GL_INTENSITY4, txf->tex_width, txf->tex_height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, txf->teximage); }#else abort(); /* Should not get here without EXT_texture or OpenGL 1.1. */#endif }#if defined(USE_DISPLAY_LISTS) glEndList(); glCallList(txf->texobj);#endif return txf->texobj;}void TexturedText::txfBindFontTexture() {#if !defined(USE_DISPLAY_LISTS) glBindTexture(GL_TEXTURE_2D, txf->texobj);#else glCallList(txf->texobj);#endif}void TexturedText::txfUnloadFont() { if (txf->teximage) { free(txf->teximage); } free(txf->tgi); free(txf->tgvi); free(txf->lut); free(txf);}void TexturedText::txfGetStringMetrics(char *string, int len, int *width, int *max_ascent, int *max_descent) { TexGlyphVertexInfo *tgvi; int w, i; w = 0; for (i = 0; i < len; i++) { if (string[i] == 27) { switch (string[i + 1]) { case 'M': i += 4; break; case 'T': i += 7; break; case 'L': i += 7; break; case 'F': i += 13; break; } } else { tgvi = getTCVI(string[i]); w += (int)tgvi->advance; } } *width = w; *max_ascent = txf->max_ascent; *max_descent = txf->max_descent;}void TexturedText::txfRenderGlyph(int c) { TexGlyphVertexInfo *tgvi; glRotatef(180.0, 1, 0, 0); tgvi = getTCVI(c); glBegin(GL_QUADS); glTexCoord2fv(tgvi->t0); glVertex2sv(tgvi->v0); glTexCoord2fv(tgvi->t1); glVertex2sv(tgvi->v1); glTexCoord2fv(tgvi->t2); glVertex2sv(tgvi->v2); glTexCoord2fv(tgvi->t3); glVertex2sv(tgvi->v3); glEnd(); glRotatef(-180.0, 1, 0, 0); glTranslatef(tgvi->advance, 0.0, 0.0);}void TexturedText::txfRenderString(char *string, int len) { int i; for (i = 0; i < len; i++) { txfRenderGlyph(string[i]); }}void TexturedText::txfRenderFancyString(char *string, int len) { TexGlyphVertexInfo *tgvi; GLubyte c[4][3]; int mode = MONO; int i; for (i = 0; i < len; i++) { if (string[i] == 27) { switch (string[i + 1]) { case 'M': mode = MONO; glColor3ubv((GLubyte *) & string[i + 2]); i += 4; break; case 'T': mode = TOP_BOTTOM; memcpy(c, &string[i + 2], 6); i += 7; break; case 'L': mode = LEFT_RIGHT; memcpy(c, &string[i + 2], 6); i += 7; break; case 'F': mode = FOUR; memcpy(c, &string[i + 2], 12); i += 13; break; } } else { switch (mode) { case MONO: txfRenderGlyph(string[i]); break; case TOP_BOTTOM: tgvi = getTCVI(string[i]); glBegin(GL_QUADS); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t0); glVertex2sv(tgvi->v0); glTexCoord2fv(tgvi->t1); glVertex2sv(tgvi->v1); glColor3ubv(c[1]); glTexCoord2fv(tgvi->t2); glVertex2sv(tgvi->v2); glTexCoord2fv(tgvi->t3); glVertex2sv(tgvi->v3); glEnd(); glTranslatef(tgvi->advance, 0.0, 0.0); break; case LEFT_RIGHT: tgvi = getTCVI(string[i]); glBegin(GL_QUADS); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t0); glVertex2sv(tgvi->v0); glColor3ubv(c[1]); glTexCoord2fv(tgvi->t1); glVertex2sv(tgvi->v1); glColor3ubv(c[1]); glTexCoord2fv(tgvi->t2); glVertex2sv(tgvi->v2); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t3); glVertex2sv(tgvi->v3); glEnd(); glTranslatef(tgvi->advance, 0.0, 0.0); break; case FOUR: tgvi = getTCVI(string[i]); glBegin(GL_QUADS); glColor3ubv(c[0]); glTexCoord2fv(tgvi->t0); glVertex2sv(tgvi->v0); glColor3ubv(c[1]); glTexCoord2fv(tgvi->t1); glVertex2sv(tgvi->v1); glColor3ubv(c[2]); glTexCoord2fv(tgvi->t2); glVertex2sv(tgvi->v2); glColor3ubv(c[3]); glTexCoord2fv(tgvi->t3); glVertex2sv(tgvi->v3); glEnd(); glTranslatef(tgvi->advance, 0.0, 0.0); break; } } }}int TexturedText::txfInFont(int c) { //TexGlyphVertexInfo *tgvi; /* NOTE: No uppercase/lowercase substituion. */ if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { if (txf->lut[c - txf->min_glyph]) { return 1; } } return 0;}TexGlyphVertexInfo *TexturedText::getTCVI(int c) { TexGlyphVertexInfo *tgvi; if (!((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range))) { c = 32; // space } /* Automatically substitute uppercase letters with lowercase if not uppercase available (and vice versa). */ if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { tgvi = txf->lut[c - txf->min_glyph]; if (tgvi) { return tgvi; } if (islower(c)) { c = toupper(c); if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { return txf->lut[c - txf->min_glyph]; } } if (isupper(c)) { c = tolower(c); if ((c >= txf->min_glyph) && (c < txf->min_glyph + txf->range)) { return txf->lut[c - txf->min_glyph]; } } // last ditch effort c = 32; // space tgvi = txf->lut[c - txf->min_glyph]; if (tgvi) { return tgvi; } } fprintf(stderr, "texfont: tried to access unavailable font character \"%c\" (%d)\n", isprint(c) ? c : ' ', c); abort(); /* NOTREACHED */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -