//------------------------------------------------------------------------------ // outputText() -- Text output routines //------------------------------------------------------------------------------ void BitmapFont::outputText(const double x, const double y, const char* txt, const int n, const bool vf, const bool) { // Make sure we have characters to print if (n <= 0) return; // Make sure we have a loaded font if (isNotLoaded()) { loadFont(); if (isNotLoaded()) throw new ExpInvalidFont(); } // Prepare the output text char cbuf[MSG_BUF_LEN]; int nn = xferChars(cbuf,MSG_BUF_LEN,txt,n); if (nn <= 0) return; // Set the base glListBase(getBase()); // output the text if (vf) { // Vertical text for (int i = 0; i < nn; i++) { glRasterPos2d( x, (y - float(i)*getLineSpacing()) ); glCallLists(1, GL_UNSIGNED_BYTE, &cbuf[i]); } } else { // Normal text glRasterPos2d(x,y); glCallLists(nn, GL_UNSIGNED_BYTE, cbuf); } }
//------------------------------------------------------------------------------ // Outline Font functions // FtglOutlineFont::outputText() -- FTGLOutlineFont output routines //------------------------------------------------------------------------------ void FtglOutlineFont::outputText(const double x, const double y, const char* txt, const int n, const bool vf, const bool) { // Make sure we have characters to print if (n <= 0) return; // Make sure we have a loaded font if (isNotLoaded()) { loadFont(); if (isNotLoaded()) throw new ExpInvalidFont(); } // Prepare the output text char cbuf[MSG_BUF_LEN]; int nn = xferChars(cbuf,MSG_BUF_LEN,txt,n); if (nn <= 0) return; // Output the text FTGLOutlineFont* ftgl1 = static_cast<FTGLOutlineFont*>(FTGL()); if (ftgl1 != nullptr) { glPushMatrix(); glTranslated(x, y, 0.0); glScalef(static_cast<GLfloat>(getFontWidth()), static_cast<GLfloat>(getFontHeight()), 1.0f); if (vf) { // Vertical text GLdouble dy = getLineSpacing(); if (getFontHeight() != 0.0) dy = getLineSpacing() / getFontHeight(); char cc[2]; cc[1] = '\0'; for (int i = 0; i < nn; i++) { cc[0] = cbuf[i]; ftgl1->Render(cc); glTranslated(0.0, -dy, 0.0); } } else { // Normal text ftgl1->Render(cbuf); } glPopMatrix(); } else { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "FtglOutlineFont::outputText() - no outline font available" << std::endl; } } }
void FtglPixmapFont::outputText(const char* txt, const int n, const bool vf, const bool) { // Make sure we have characters to print if (n <= 0) return; // Make sure we have a loaded font if (isNotLoaded()) { loadFont(); if (isNotLoaded()) throw new ExpInvalidFont(); } // Prepare the output text char cbuf[MSG_BUF_LEN]; int nn = xferChars(cbuf,MSG_BUF_LEN,txt,n); if (nn <= 0) return; // output the text FTGLPixmapFont* ftgl1 = static_cast<FTGLPixmapFont*>(FTGL()); if (ftgl1 != nullptr) { if (vf) { // Vertical text char cc[2]; cc[1] = '\0'; GLdouble rpos[4]; glGetDoublev(GL_CURRENT_RASTER_POSITION, rpos); for (int i = 0; i < nn; i++) { cc[0] = cbuf[i]; glRasterPos2d( rpos[0], (rpos[1] - static_cast<float>(i)*getLineSpacing()) ); ftgl1->Render(cc); } } else { // Normal text ftgl1->Render(cbuf); } } else { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "FtglPixmapFont::outputText() - no pixmap font available" << std::endl; } } }
//------------------------------------------------------------------------------ // Pixmap Font functions // FtglPixmapFont::outputText() -- FTGLPixmapFont output routines //------------------------------------------------------------------------------ void FtglPixmapFont::outputText(const double x, const double y, const char* txt, const int n, const bool vf, const bool) { // Make sure we have characters to print if (n <= 0) return; // Make sure we have a loaded font if (isNotLoaded()) { loadFont(); if (isNotLoaded()) throw new ExpInvalidFont(); } // Prepare the output text char cbuf[MSG_BUF_LEN]; int nn = xferChars(cbuf,MSG_BUF_LEN,txt,n); if (nn <= 0) return; // output the text FTGLPixmapFont* ftgl1 = (FTGLPixmapFont*)FTGL(); if (ftgl1 != 0) { if (vf) { // Vertical text char cc[2]; cc[1] = '\0'; for (int i = 0; i < nn; i++) { cc[0] = cbuf[i]; glRasterPos2d( x, (y - float(i)*getLineSpacing()) ); ftgl1->Render(cc); } } else { // Normal text glRasterPos2d(x,y); ftgl1->Render(cbuf); } } else { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "FTGLPixmapFont::outputText() - no Pixmap font available" << std::endl; } } }
//------------------------------------------------------------------------------ // Halo Font functions // FtglHaloFont::outputText() -- FtglHaloFont output routines //------------------------------------------------------------------------------ void FtglHaloFont::outputText(const double x, const double y, const char* txt, const int n, const bool vf, const bool rf) { GLfloat ocolor[4]; glGetFloatv(GL_CURRENT_COLOR, ocolor); // Make sure we have characters to print if (n <= 0) return; // Make sure we have a loaded font if (isNotLoaded()) { loadFont(); if (isNotLoaded()) throw new ExpInvalidFont(); } // Prepare the output text char cbuf[MSG_BUF_LEN]; int nn = xferChars(cbuf,MSG_BUF_LEN,txt,n); if (nn <= 0) return; if (haloColor != nullptr) Graphic::lcColor3(haloColor->red(), haloColor->green(), haloColor->blue()); // default to black if we have no color specified else glColor3f(0,0,0); // now render the outline font over it! if (!rf) { if (outline != nullptr) { glPushMatrix(); glTranslated(x, y, -0.01f); // get our current linewidth GLfloat lw = 0; glGetFloatv(GL_LINE_WIDTH, &lw); glLineWidth(linewidth); glScalef(static_cast<GLfloat>(getFontWidth()), static_cast<GLfloat>(getFontHeight()), 1.0f); if (vf) { // Vertical text GLdouble dy = getLineSpacing(); if (getFontHeight() != 0.0) dy = getLineSpacing() / getFontHeight(); char cc[2]; cc[1] = '\0'; for (int i = 0; i < nn; i++) { cc[0] = cbuf[i]; outline->Render(cc); glTranslated(0.0, -dy, 0.0); } } else { // Normal text outline->Render(cbuf); } glLineWidth(lw); glPopMatrix(); } else { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "FtglHaloFont::outputText() - no outline font available" << std::endl; } } } glColor4fv(ocolor); // output the text FTGLPolygonFont* ftgl1 = static_cast<FTGLPolygonFont*>(FTGL()); if (ftgl1 != nullptr) { glPushMatrix(); glTranslated(x, y, 0.0); glScalef(static_cast<GLfloat>(getFontWidth()), static_cast<GLfloat>(getFontHeight()), 1.0f); if (vf) { // Vertical text GLdouble dy = getLineSpacing(); if (getFontHeight() != 0.0) dy = getLineSpacing() / getFontHeight(); char cc[2]; cc[1] = '\0'; for (int i = 0; i < nn; i++) { cc[0] = cbuf[i]; ftgl1->Render(cc); glTranslated(0.0, -dy, 0.0); } } else { // Normal text ftgl1->Render(cbuf); } glPopMatrix(); } else { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "FtglPolygonFont::outputText() - no Polygon font available" << std::endl; } } }