http://GameProgrammer.Com

Programming

GP Mailing List
     Thread Index
     Date Index

ATXGPSIG List
     Thread Index
     Date Index

Google
>

Home

Wise2Food



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gameprogrammer] Re: SDL_ttf and OpenGL



Using SDL_ttf in this manner.
Would you mind if I made use of this in my project?


From: Bob Pendleton <bob@pendleton.com>
Reply-To: gameprogrammer@freelists.org
To: Gameprogrammer Mailing List <gameprogrammer@freelists.org>
Subject: [gameprogrammer] Re: SDL_ttf and OpenGL
Date: Fri, 30 Apr 2004 13:52:00 -0500

On Fri, 2004-04-30 at 09:25, Kevin Fields wrote:
 > I would never have thought of doing that.

Doing what?

 > My knowledge of both SDL and OpenGL are still rather limited.

Don't worry about it. You'll get there.

		Bob Pendleton

 >
 >
 > From: Bob Pendleton <bob@pendleton.com>
 > Reply-To: gameprogrammer@freelists.org
 > To: Gameprogrammer Mailing List <gameprogrammer@freelists.org>
 > Subject: [gameprogrammer] Re: SDL_ttf and OpenGL
 > Date: Thu, 29 Apr 2004 09:48:39 -0500
 >
 > On Thu, 2004-04-29 at 07:22, Kevin Fields wrote:
 >  > Hey people,
 >  >
 >  > I'm having an issue with trying to get SDL_ttf to work with OpenGL.
 >  > I've posted on the SDL mailing list, but I'm still not sure how I can 
go
 >  > about getting SDL_ttf to render to the screen.
 >  >
 >  > One method I was told to use was to take the surface generated by
 >  > TTF_RenderText_*() and make a texture out of it, then applying that
 > texture
 >  > to a quad (or triangle strip) and rendering to the screen. When I 
tried
 >  > that, nothing appeared.
 >  >
 >  > Has anyone been able to get fonts working with SDL and OpenGL?
 >
 > I've been so involved in this list (my list) for the last few days that
 > I have not been looking at the SDL list and missed you question. I have
 > indeed gotten SDL_ttf to work with OpenGL. It isn't difficult. Here is
 > some code that I use for the job:
 >
 > //-------------------------------------------------
 >
 > class Font
 > {
 > private:
 >    static const int minGlyph = ' ';
 >    static const int maxGlyph = 126;
 >
 >    static int initCounter;
 >
 >    typedef struct
 >    {
 >      int minx, maxx;
 >      int miny, maxy;
 >      int advance;
 >      SDL_Surface *pic;
 >      GLuint tex;
 >      GLfloat texMinX, texMinY;
 >      GLfloat texMaxX, texMaxY;
 >    } glyph;
 >
 >    int height;
 >    int ascent;
 >    int descent;
 >    int lineSkip;
 >    glyph glyphs[maxGlyph + 1];
 >
 >    unsigned char *address;
 >    int length;
 >    int pointSize;
 >    int style;
 >    float fgRed, fgGreen, fgBlue;
 >    float bgRed, bgGreen, bgBlue;
 >
 >    TTF_Font *ttfFont;
 >
 >    SDL_Color foreground;
 >    SDL_Color background;
 >
 >    void loadChar(char c)
 >    {
 >      GLfloat texcoord[4];
 >      char letter[2] = {0, 0};
 >
 >      if ((minGlyph <= c) &&
 >          (c <= maxGlyph) &&
 >          (NULL == glyphs[c].pic))
 >      {
 >        SDL_Surface *g0 = NULL;
 >        SDL_Surface *g1 = NULL;
 >
 >        letter[0] = c;
 >
 >        TTF_GlyphMetrics(ttfFont,
 >                         (Uint16)c,
 >                         &glyphs[c].minx,
 >                         &glyphs[c].maxx,
 >                         &glyphs[c].miny,
 >                         &glyphs[c].maxy,
 >                         &glyphs[c].advance);
 >
 >        g0 = TTF_RenderText_Shaded(ttfFont,
 >                                   letter,
 >                                   foreground,
 >                                   background);
 >
 >        if (NULL != g0)
 >        {
 >          g1 = SDL_DisplayFormat(g0);
 >          SDL_FreeSurface(g0);
 >        }
 >
 >        if (NULL != g1)
 >        {
 >          glyphs[c].pic = g1;
 >          glyphs[c].tex = loadTextureColorKey(g1, texcoord, 0, 0, 0);
 >          glyphs[c].texMinX = texcoord[0];
 >          glyphs[c].texMinY = texcoord[1];
 >          glyphs[c].texMaxX = texcoord[2];
 >          glyphs[c].texMaxY = texcoord[3];
 >        }
 >      }
 >    }
 >
 > public:
 >
 >    Font(unsigned char *address,
 >         int length,
 >         int pointSize,
 >         int style,
 >         float fgRed, float fgGreen, float fgBlue,
 >         float bgRed, float bgGreen, float bgBlue):
 >      address(address), length(length),
 >      pointSize(pointSize),
 >      style(style),
 >      fgRed(fgRed), fgGreen(fgGreen), fgBlue(fgBlue),
 >      bgRed(bgRed), bgGreen(bgGreen), bgBlue(bgBlue),
 >      ttfFont(NULL)
 >    {
 >      if (0 == initCounter)
 >      {
 >        if (TTF_Init() < 0)
 >        {
 >          errorExit("Can't init SDL_ttf");
 >        }
 >      }
 >      initCounter++;
 >      initFont();
 >    }
 >
 >    ~Font()
 >    {
 >      initCounter--;
 >      if (0 == initCounter)
 >      {
 >        TTF_Quit();
 >      }
 >    }
 >
 >    void initFont()
 >    {
 >      SDL_RWops *src = NULL;
 >      int i;
 >
 >      src = SDL_RWFromMem(address, length);
 >
 >      ttfFont = TTF_OpenFontRW(src, 1, pointSize);
 >      if (NULL == ttfFont)
 >      {
 >        errorExit("Can't open font file");
 >      }
 >
 >      TTF_SetFontStyle(ttfFont, style);
 >
 >      foreground.r = (Uint8)(255 * fgRed);
 >      foreground.g  = (Uint8)(255 * fgGreen);
 >      foreground.b = (Uint8)(255 * fgBlue);
 >
 >      background.r = (Uint8)(255 * bgRed);
 >      background.g = (Uint8)(255 * bgGreen);
 >      background.b = (Uint8)(255 * bgBlue);
 >
 >      height = TTF_FontHeight(ttfFont);
 >      ascent = TTF_FontAscent(ttfFont);
 >      descent = TTF_FontDescent(ttfFont);
 >      lineSkip = TTF_FontLineSkip(ttfFont);
 >
 >      for (i = minGlyph; i <= maxGlyph; i++)
 >      {
 >        glyphs[i].pic = NULL;
 >        glyphs[i].tex = 0;
 >      }
 >    }
 >
 >    int getLineSkip()
 >    {
 >      return lineSkip;
 >    }
 >
 >    int getHeight()
 >    {
 >      return height;
 >    }
 >
 >    void textSize(char *text,
 >                  SDL_Rect *r)
 >    {
 >      int maxx = 0;
 >      int advance = 0;
 >
 >      r->x = 0;
 >      r->y = 0;
 >      r->w = 0;
 >      r->h = height;
 >
 >      while (0 != *text)
 >      {
 >        if ((minGlyph <= *text) && (*text <= maxGlyph))
 >        {
 >          loadChar(*text);
 >
 >          maxx = glyphs[*text].maxx;
 >          advance = glyphs[*text].advance;
 >          r->w += advance;
 >        }
 >
 >        text++;
 >      }
 >
 >      r->w = r->w - advance + maxx;
 >    }
 >
 >    void drawText(char *text, int x, int y)
 >    {
 >      GLfloat left, right;
 >      GLfloat top, bottom;
 >      GLfloat texMinX, texMinY;
 >      GLfloat texMaxX, texMaxY;
 >
 >      glPushAttrib(GL_ALL_ATTRIB_BITS);
 >
 >      glEnable(GL_BLEND);
 >      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 >
 >      glEnable(GL_TEXTURE_2D);
 >      glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 >
 >      while (0 != *text)
 >      {
 >        if ((minGlyph <= *text) && (*text <= maxGlyph))
 >        {
 >          loadChar(*text);
 >
 >          texMinX = glyphs[*text].texMinX;
 >          texMinY = glyphs[*text].texMinY;
 >          texMaxX = glyphs[*text].texMaxX;
 >          texMaxY = glyphs[*text].texMaxY;
 >
 >          left   = x;
 >          right  = x + glyphs[*text].pic->w;
 >          top    = y;
 >          bottom = y + glyphs[*text].pic->h;
 >
 >          glBindTexture(GL_TEXTURE_2D, glyphs[*text].tex);
 >
 >          glBegin(GL_TRIANGLE_STRIP);
 >
 >          glTexCoord2f(texMinX, texMinY); glVertex2f( left,    top);
 >          glTexCoord2f(texMaxX, texMinY); glVertex2f(right,    top);
 >          glTexCoord2f(texMinX, texMaxY); glVertex2f( left, bottom);
 >          glTexCoord2f(texMaxX, texMaxY); glVertex2f(right, bottom);
 >
 >          glEnd();
 >
 >          x += glyphs[*text].advance;
 >        }
 >
 >        text++;
 >      }
 >
 >      glPopAttrib();
 >    }
 > };
 >
 > //-------------------------------------------------
 >
 > int Font::initCounter = 0;
 >
 > 		Bob Pendleton
 >
 >  >
 >  > _________________________________________________________________
 >  > MSN Premium: Up to 11 personalized e-mail addresses and 2 months FREE*
 >  >
 > 
http://join.msn.com/?pgmarket=en-ca&page=byoa/prem&xAPID=1994&DI=1034&SU=http://hotmail.com/enca&HL=Market_MSNIS_Taglines
 >  >
 > --
 > +--------------------------------------+
 > + Bob Pendleton: writer and programmer +
 > + email: Bob@Pendleton.com             +
 > + blog:  www.Stonewolf.net             +
 > + web:   www.GameProgrammer.com        +
 > +--------------------------------------+
 >
 > _________________________________________________________________
 > 
http://join.msn.com/?pgmarket=en-ca&page=byoa/prem&xAPID=1994&DI=1034&SU=http://hotmail.com/enca&HL=Market_MSNIS_Taglines
 >
--
+--------------------------------------+
+ Bob Pendleton: writer and programmer +
+ email: Bob@Pendleton.com             +
+ blog:  www.Stonewolf.net             +
+ web:   www.GameProgrammer.com        +
+--------------------------------------+

_________________________________________________________________
http://join.msn.com/?pgmarket=en-ca&page=byoa/prem&xAPID=1994&DI=1034&SU=http://hotmail.com/enca&HL=Market_MSNIS_Taglines