Archived

This topic is now archived and is closed to further replies.

camcbri

problem with font being "cut off?" any ideas?

Recommended Posts

hello all! i'm having an issue occur wherein the bottom portion of letters such as y, g, j, p, etc are not drawn. for example, the y looks like a v, the j like an i, the p and g like circles with a line on one side. when i resize the window, the issue is fixed, but continued resizing can make the issue reappear. Also, sometimes the portions may be drawn partially... Heres the font code:
    
#ifdef WIN32
#include <windows.h>
#else

#include <gl/glx.h>
#include <cstdlib>
#endif

#include "font.hxx"
#include <gl/gl.h>
#include <cstdio>
#include <string>

//* ---------------------------------------------------------------------------

//* Constructor

//* ---------------------------------------------------------------------------

Font::Font(std::string face, GLint size)
: _face(face),
  _size(size),
  _red(0.0f),
  _green(0.0f),
  _blue(0.0f),
  _xpos(0),
  _ypos(0),
  _base(0)
{
   if(_face == "")
#ifdef WIN32
      _face = "Courier New";
#else
      _face = "adobe-helvetica-medium";
#endif

   Create();

   return;
}

//* ---------------------------------------------------------------------------

//* THE destructor

//* ---------------------------------------------------------------------------

Font::~Font()
{
   if(_base)
      KillFont();

   _base = 0;

   return;
}

//* ---------------------------------------------------------------------------

//* Create

//* Allocate the memory for the font & create some display lists.

//* ---------------------------------------------------------------------------

int Font::Create()
{
   int retVal = 0;

   _base = glGenLists(96);

#ifdef WIN32
   HDC   hdc  = GetDC(0);
   HFONT font;
   HFONT oldFont;

   font = CreateFont(_size, 
                     0, 0, 0,
                     FW_BOLD,
                     false, false, false,
                     ANSI_CHARSET,
                     OUT_TT_PRECIS,
                     CLIP_DEFAULT_PRECIS,
                     ANTIALIASED_QUALITY,
                     FF_DONTCARE | DEFAULT_PITCH,
                     _face.c_str());

   if(font == 0)
      retVal = -1;

   oldFont = (HFONT)SelectObject(hdc, font);
   wglUseFontBitmaps(hdc, 32, 96, _base);
   SelectObject(hdc, oldFont);
   DeleteObject(font);

#else
   Display* display;
   XFontStruct* fontInfo;
   
   char convert[2] = {0};
   itoa(_size, convert, 10);

   std::string face = "-" + _face +
                      "-r-normal--" +
                      convert + 
                      "-*-*-*-p-*-iso8859-1";

   display = XOpenDisplay(0);
   fontInfo = XLoadQueryFont(display, face.c_str());

   if(fontInfo == 0)
      fontInfo = XLoadQueryFont(display, "fixed");
   
   if(fontInfo == 0)
      retVal = -1;

   glXUseXFont(fontInfo->fid, 32, 96, base);
   XFreeFont(display, fontInfo);
   XCloseDisplay(display);
#endif
   return retVal;
}

//* ---------------------------------------------------------------------------

//* KillFont

//* Deallocate the memory used by the font.

//* ---------------------------------------------------------------------------

void Font::KillFont()
{
   glDeleteLists(_base, 96);
   return;
}

//* ---------------------------------------------------------------------------

//* Print

//* Print out any string to the screen.

//* ---------------------------------------------------------------------------

void Font::Print(const char* fmt, ...)
{
	static char text[256] = {'\0'};
   va_list ap = 0;

   memset(text, '\0', 256);

   if(fmt != 0)
   {
      va_start(ap, fmt);
         vsprintf(text, fmt, ap);
      va_end(ap);

      glPushAttrib(GL_LIST_BIT);
         glColor3f(_red, _green, _blue);
         glListBase(_base - 32);
         glPushMatrix();
            glLoadIdentity();
            //glTranslatef(0.0f, 0.0f, -10.0f);

            glRasterPos2i(_xpos, _ypos);
            glCallLists((GLsizei)strlen(text), 
                        GL_UNSIGNED_BYTE, text);
         glPopMatrix();
      glPopAttrib();
   }


   return;
}

//* ---------------------------------------------------------------------------

//* SetFace

//* ---------------------------------------------------------------------------

void Font::SetFace(const char* face)
{
   _face = face;
   return;
}

//* ---------------------------------------------------------------------------

//* SetSize

//* ---------------------------------------------------------------------------

void Font::SetSize(GLint size)
{
   _size = size;
   return;
}
   
//* ---------------------------------------------------------------------------

//* SetColor

//* ---------------------------------------------------------------------------

void Font::SetColor(GLfloat r, GLfloat g, GLfloat b)
{
   _red   = r;
   _green = g;
   _blue  = b;
   return;
}

//* ---------------------------------------------------------------------------

//* SetPosition

//* ---------------------------------------------------------------------------

void Font::SetPosition(GLint x, GLint y)
{
   _xpos = x;
   _ypos = y;
   return;
}

//* ---------------------------------------------------------------------------

//* Rebuild

//* Delete the old font and allocate a new one with a new size or font face.

//* Color is not changed.

//* ---------------------------------------------------------------------------

void Font::Rebuild()
{
   KillFont();
   Create();
   return;
}
  
and here is the interface drawing (the error occurs in the function StartMenu):
  

#include "interface.hxx"
#include "gamestates.hxx"

Interface::Interface(GLuint w, GLuint h, TextureManager* tm)
: _font(new Font()),
  _bigFont(new Font("creepy", 100)),
  _width(w),
  _height(h),
  _cubeList(0)
{
   _cubeList = glGenLists(1);
   BuildCubeList();
}

Interface::~Interface()
{
   glDeleteTextures(2, _textures);
   glDeleteLists(_cubeList, 1);

	delete _font;
	_font = 0;

	delete _bigFont;
	_bigFont = 0;

}

void Interface::DrawCube(GLuint tex)
{}

void Interface::BuildCubeList()
{
   glNewList(_cubeList, GL_COMPILE);
		glBegin(GL_QUADS);	// top face

         glNormal3f(0.0f, 1.0f, 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);	
			glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
         glNormal3f(0.0f, 0.0f, 1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);	
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
		glNormal3f(1.0f, 0.0f, 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);	
			glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.5f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f);
		glNormal3f(-1.0f, 0.0f, 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);	
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); 
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
		glNormal3f(0.0f, -1.0f, 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); 
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f);	
		glNormal3f(0.0f, 0.0f, -1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);	
		glEnd();
   glEndList();
}

void Interface::SetDimensions(GLuint width, GLuint height)
{
	_width  = width;
	_height = height;
}

void Interface::ReadyForInterface()
{
	glPushMatrix();

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
		glLoadIdentity();

		glOrtho(0, _width, 0, _height, 110, -110);
		glMatrixMode(GL_MODELVIEW);
		glTranslatef(0.0f, 0.0f, 10.0f);
		glLoadIdentity();
}

void Interface::ReadyForDrawing()
{
		glMatrixMode(GL_PROJECTION);
		glPopMatrix();
		   
		glMatrixMode(GL_MODELVIEW);
   glPopMatrix();
}

void Interface::DisplayFrameRate(GLfloat fps)
{
	ReadyForInterface();

	_font->SetPosition(_width-300, _height-50);
	_font->SetColor(1.0f, 1.0f, 0.0f);
	_font->Print("Frame Rate: %i", (GLuint)fps);

   ReadyForDrawing();
}

void Interface::TemporaryShite(GLfloat fps, GLint rockets, GLint hits)
{
	ReadyForInterface();

	_font->SetPosition(25, 30);  
	_font->SetColor(0.0f, 0.0f, 0.0f);
   _font->Print("Rockets Fired: %i", rockets);

	_font->SetPosition(_width-250, 30);
	_font->SetColor(0.0f, 0.0f, 0.0f);
   _font->Print("Targets Hit: %i", hits);
	
	_font->SetPosition(_width-300, _height-50);
	_font->SetColor(1.0f, 1.0f, 0.0f);
	_font->Print("Frame Rate: %i", (GLuint)fps);

   ReadyForDrawing();
}

GLint Interface::StartMenu(GLint& choice)
{
	GLint retVal = STATE_MENU;

	ReadyForInterface();
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	_bigFont->SetColor(1.0f, 0.0f, 0.0f);
	_bigFont->SetPosition(50, _height - 101);
	_bigFont->Print("Multi-Pong!");

   _font->SetPosition(200, _height - 150);
   _font->SetColor(1.0f, 1.0f, 0.0f);
   _font->Print(" by Kevin Greenan & Chris McBride");

	if(choice == 0)
	{
		_font->SetColor(1.0f, 0.0f, 0.0f);

		if(GetAsyncKeyState(VK_RETURN))
			retVal = STATE_RUN;
	}
	else
	{
		_font->SetColor(0.0f, 1.0f, 0.0f);
	}	
	_font->SetPosition(_width / 2, _height / 2);
	_font->Print("Start Game");

	if(choice == 1)
		_font->SetColor(1.0f, 0.0f, 0.0f);
	else
		_font->SetColor(0.0f, 1.0f, 0.0f);

	_font->SetPosition(_width / 2, _height / 2 - 50);
	_font->Print("Exit Game");

	if(choice == 2)
		_font->SetColor(1.0f, 0.0f, 0.0f);
	else
		_font->SetColor(0.0f, 1.0f, 0.0f);

	_font->SetPosition(_width / 2, _height / 2 - 100);
	_font->Print("See Credits");

	ReadyForDrawing();

	glutSwapBuffers();

	return retVal;
}

GLint Interface::SplashScreen()
{
	return STATE_RUN;
}

//GLint Loading()

//{

//}


GLint Interface::Pause()
{
	return STATE_RUN;
}

GLint Interface::Running()
{
	return STATE_RUN;
}
  
and here is the code calling the interface:
  
GLint Game::Go()
{
   //std::cout << "Going..." << std::endl;  


   switch(_state)
   {
   case STATE_INIT:
      Init();
      _state = STATE_MENU;
      break;

   case STATE_MENU:
	   _interface->SetDimensions(_width, _height);
	  _state = _interface->StartMenu(_choice);
      break;

   case STATE_RUN:
      _state = Run();
      break;

   case STATE_CLOSE:      
      _state = Shutdown();
      break;

   case STATE_PAUSE:
      _state = Pause();
      break;
   }

   return _state;
}
    
thanks for any help! [edited by - camcbri on January 19, 2003 2:54:13 AM]

Share this post


Link to post
Share on other sites