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

📄 text.cpp

📁 S.C.O.U.R.G.E.是一款类似Rogue的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -