Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/graphics/text_engine.h @ 4887

Last change on this file since 4887 was 4856, checked in by bensch, 19 years ago

orxonox/trunk: text renders as good as before, but now as Element2D

File size: 7.7 KB
Line 
1/*!
2    \file text_engine.h
3  *  Definition of textEngine, the Font and the Text
4
5    Text is the text outputed.
6    Font is a class that loads a certain ttf-file with a specific height into memory
7    TextEngine is used to manage the all the different Fonts that might be included
8
9    for more information see the specific classes.
10
11    !! IMPORTANT !! When using ttf fonts clear the license issues prior to
12   adding them to orxonox. This is really important, because we do not want
13   to offend anyone.
14*/
15
16#ifndef _TEXT_ENGINE_H
17#define _TEXT_ENGINE_H
18
19
20#include "glincl.h"
21
22#ifdef HAVE_SDL_IMAGE_H
23#include "SDL_ttf.h"
24#else
25#include "SDL/SDL_ttf.h"
26#endif
27
28#include "base_object.h"
29#include "element_2d.h"
30
31#include "vector.h"
32
33// FORWARD DECLARATION
34class PNode;
35class Font;
36template<class T> class tList;
37
38#define  TEXT_ALIGN_LEFT             E2D_ALIGN_LEFT
39#define  TEXT_ALIGN_RIGHT            E2D_ALIGN_RIGHT
40#define  TEXT_ALIGN_CENTER           E2D_ALIGN_CENTER
41#define  TEXT_ALIGN_SCREEN_CENTER    E2D_ALIGN_SCREEN_CENTER
42
43/* some default values */
44#define FONT_DEFAULT_SIZE       50                   //!< default size of the Text
45#define FONT_DEFAULT_TEXT       "orxonox 1234567890" //!< default text to display
46#define FONT_DEFAULT_COLOR_R    255                  //!< default red part (color) of the text
47#define FONT_DEFAULT_COLOR_G    255                  //!< default red green (color) of the text
48#define FONT_DEFAULT_COLOR_B    255                  //!< default red blue (color) of the text
49#define FONT_NUM_COLORS         256                  //!< number of colors.
50
51#define FONT_HIGHEST_KNOWN_CHAR 128                  //!< The highest character known to the textEngine.
52
53#define TEXT_DEFAULT_ALIGNMENT  TEXT_ALIGN_CENTER    //!< default alignment
54#define TEXT_STATIC             0                    //!< Static Text
55#define TEXT_DYNAMIC            1                    //!< Dynamic Text
56/**
57 * STATIC means: a font, that is only one GL-face.
58 ** it is very fast, and can be used for all text
59 ** that does not have to be changed anymore, or if
60 ** the the text should look very nice
61 * DYNAMIC means: a very fast font, that will is build
62 ** from multiple quads.
63 ** Use this type, if you want to create fast changing
64 ** text like a counter.
65 */
66
67
68//! A Struct to handel Texture Coordinates for quads
69struct TexCoord
70{
71  float    minU;              //!< The minimum U-Coordinate
72  float    maxU;              //!< The maximum U-Coordinate
73  float    minV;              //!< The minimum V-Coordinate
74  float    maxV;              //!< The maximum V-Coordinate
75};
76
77//! A struct for handling glyphs
78/**
79   a Glyph is one letter of a certain font
80*/
81struct Glyph
82{
83  // Glyph-specific (size and so on)
84  Uint16   character;         //!< The character
85  int      minX;              //!< The minimum distance from the origin in X
86  int      maxX;              //!< The maximum distance from the origin in X
87  int      minY;              //!< The minimum distance from the origin in Y
88  int      maxY;              //!< The maximum distance from the origin in Y
89  int      width;             //!< The width of the Glyph
90  int      height;            //!< The height of the Glyph
91  int      bearingX;          //!< How much is right of the Origin
92  int      bearingY;          //!< How much is above the Origin
93  int      advance;           //!< How big a Glyph would be in monospace-mode
94
95  // OpenGL-specific
96  //  TexCoord texCoord;      //!< A Texture Coordinate for this glyph.
97  GLuint   displayList;       //!< DiplayList to render this Glyph.
98};
99
100////////////
101/// TEXT ///
102////////////
103//! Represents one textElement.
104class Text : public Element2D
105{
106  friend class TextEngine;
107 public:
108  ~Text();
109
110  void setType(int type);
111  void setText(const char* text);
112  /** @param blending the blending intensity to set (between 0.0 and 1.0) */
113  inline void setBlending(float blending) { this->blending = blending; };
114
115  // Static Text
116  void setColor(Uint8 r, Uint8 g, Uint8 b);
117
118  void createTexture();
119
120  virtual void draw() const;
121
122  void debug() const;
123
124 private:
125  Text(Font* font, int type = TEXT_DYNAMIC);
126
127  static GLuint loadTexture(SDL_Surface* surface, TexCoord* texCoord);
128  static int powerOfTwo(int input);
129
130 private:
131  Font*             font;           //!< Font of this text
132
133  int               type;           //!< The type of this Font.
134  char*             text;           //!< The text to display
135  SDL_Color         color;          //!< The color of the font.
136  float             blending;       //!< The blending intensity.
137
138  // placement in openGL
139  GLuint            texture;        //!< A GL-texture to hold the text
140  TexCoord          texCoord;       //!< Texture-coordinates @todo fix this to have a struct
141  SDL_Rect          posSize;        //!< An SDL-Rectangle representing the position and size of the Text on the screen.
142};
143
144////////////
145/// FONT ///
146////////////
147//! A class to handle a Font of a certain ttf-File, Size and Color.
148class Font : public BaseObject
149{
150  friend class Text;
151
152 public:
153  Font(const char* fontFile,
154       unsigned int fontSize = FONT_DEFAULT_SIZE,
155       Uint8 r = FONT_DEFAULT_COLOR_R,
156       Uint8 g = FONT_DEFAULT_COLOR_G,
157       Uint8 b = FONT_DEFAULT_COLOR_B);
158
159  virtual ~Font();
160
161  // font
162  bool setFont(const char* fontFile);
163  void setSize(unsigned int fontSize);
164  void setFastColor(Uint8 r, Uint8 g, Uint8 b);
165  void setStyle(const char* renderStyle);
166
167  /** @returns a Pointer to the Array of Glyphs */
168  inline Glyph** getGlyphArray() const {return glyphArray;}
169  /** @returns the texture to the fast-texture */
170  inline GLuint getFastTextureID() const {return fastTextureID;}
171
172 private:
173  int getMaxHeight();
174  int getMaxAscent();
175  int getMaxDescent();
176  Glyph* getGlyphMetrics(Uint16 character);
177
178  GLuint createFastTexture();
179
180  void initGlyphs(Uint16 from, Uint16 count);
181  int findOptimalFastTextureSize();
182
183  void debug();
184
185 private:
186  // general purpose
187  GLdouble      projMat[16];         //!< The Projection Matrix
188
189  // information about the Font
190  TTF_Font*     font;                //!< The font we use for this.
191  char*         fontFile;            //!< The fontfile from whitch the font was loaded.
192  unsigned int  fontSize;            //!< The size of the font in pixels. each Font has one size.
193  int           renderStyle;         //!< The Renderstyle
194
195  Glyph**       glyphArray;          //!< An Array of all the Glyphs stored in the Array of Glyphs.
196  GLuint        fastTextureID;       //!< The fast textureID.
197  SDL_Color     fastColor;           //!< A Color for the fast Texture.
198
199  tList<Text>*  textList;            //!< A list of texts this Font is mapped to.
200};
201
202///////////////////
203/// TEXT-ENGINE ///
204///////////////////
205//! A singleton Class that operates as a Handler for generating and rendering Text in 2D
206class TextEngine : public BaseObject
207{
208 public:
209  virtual ~TextEngine();
210  /** @returns a Pointer to the only object of this Class */
211  inline static TextEngine* getInstance() { if (!singletonRef) singletonRef = new TextEngine();  return singletonRef; };
212
213  Text* createText(const char* fontFile,
214                   unsigned int fontSize = FONT_DEFAULT_SIZE,
215                   int textType = TEXT_DYNAMIC,
216                   Uint8 r = FONT_DEFAULT_COLOR_R,
217                   Uint8 g = FONT_DEFAULT_COLOR_G,
218                   Uint8 b = FONT_DEFAULT_COLOR_B);
219
220  void deleteText(Text* text);
221  void flush();
222
223  void debug() const;
224
225 private:
226  TextEngine();
227  static TextEngine* singletonRef;
228
229  // general
230  static void enableFonts();
231  static void disableFonts();
232  static bool checkVersion();
233
234 private:
235  //  tList<Font>* fontList;
236  tList<Text>*       textList;      //!< a list of all texts registered to the textEngine @todo this is overhead, do we need this??
237
238};
239
240#endif /* _TEXT_ENGINE_H */
Note: See TracBrowser for help on using the repository browser.