Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: init-function of Font

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_TTF_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;
36
37#define  TEXT_ALIGN_LEFT             E2D_ALIGN_LEFT
38#define  TEXT_ALIGN_RIGHT            E2D_ALIGN_RIGHT
39#define  TEXT_ALIGN_CENTER           E2D_ALIGN_CENTER
40#define  TEXT_ALIGN_SCREEN_CENTER    E2D_ALIGN_SCREEN_CENTER
41#define  TEXT_DEFAULT_COLOR          Vector(1.0, 1.0, 1.0)      //!< the default Color (white)
42#define  TEXT_DEFAULT_BLENDING       1.0f                       //!< the default blending of the text, (no blending at all)
43
44/* some default values */
45#define FONT_DEFAULT_SIZE            50                         //!< default size of the Text
46#define FONT_NUM_COLORS              256                        //!< number of colors.
47
48#define FONT_HIGHEST_KNOWN_CHAR      128                        //!< The highest character known to the textEngine.
49
50#define TEXT_DEFAULT_ALIGNMENT       TEXT_ALIGN_CENTER          //!< default alignment
51
52typedef enum TEXT_RENDER_TYPE
53{
54  TEXT_RENDER_STATIC      = 1,
55  TEXT_RENDER_DYNAMIC     = 2
56};
57/**
58 * STATIC means: a font, that is only one GL-face.
59 ** it is very fast, and can be used for all text
60 ** that does not have to be changed anymore, or if
61 ** the the text should look very nice
62 * DYNAMIC means: a very fast font, that will is build
63 ** from multiple quads.
64 ** Use this type, if you want to create fast changing
65 ** text like a counter.
66 */
67
68
69//! A Struct to handel Texture Coordinates for quads
70struct TexCoord
71{
72  float    minU;              //!< The minimum U-Coordinate
73  float    maxU;              //!< The maximum U-Coordinate
74  float    minV;              //!< The minimum V-Coordinate
75  float    maxV;              //!< The maximum V-Coordinate
76};
77
78//! A struct for handling glyphs
79/**
80   a Glyph is one letter of a certain font
81*/
82struct Glyph
83{
84  // Glyph-specific (size and so on)
85  Uint16   character;         //!< The character
86  int      minX;              //!< The minimum distance from the origin in X
87  int      maxX;              //!< The maximum distance from the origin in X
88  int      minY;              //!< The minimum distance from the origin in Y
89  int      maxY;              //!< The maximum distance from the origin in Y
90  int      width;             //!< The width of the Glyph
91  int      height;            //!< The height of the Glyph
92  int      bearingX;          //!< How much is right of the Origin
93  int      bearingY;          //!< How much is above the Origin
94  int      advance;           //!< How big a Glyph would be in monospace-mode
95
96  // OpenGL-specific
97  //  TexCoord texCoord;      //!< A Texture Coordinate for this glyph.
98  GLuint   displayList;       //!< DiplayList to render this Glyph.
99};
100
101////////////
102/// TEXT ///
103////////////
104//! Represents one textElement.
105class Text : public Element2D
106{
107  friend class TextEngine;
108 public:
109   Text(const char* fontFile, unsigned int fontSize = FONT_DEFAULT_SIZE, TEXT_RENDER_TYPE type = TEXT_RENDER_DYNAMIC);
110  ~Text();
111
112  void init();
113
114  void setFont(const char* fontFile, unsigned int fontSize);
115  void setType(TEXT_RENDER_TYPE type);
116  void setText(const char* text, bool isExtern = false);
117  /** @returns the String this Text displays */
118  inline const char* getText() const { return (externText == NULL)?this->text:this->externText; };
119  /** @param blending the blending intensity to set (between 0.0 and 1.0) */
120  inline void setBlending(float blending) { this->blending = blending; };
121
122  /** sets the Color of the Text to render (values in [0-1]) @param r red @param g green @param b blue */
123  void setColor(float r, float g, float b) { this->color = Vector(r,g,b); };
124
125  void createTexture();
126
127  virtual void draw() const;
128
129  void debug() const;
130
131  // helpers.
132  static GLuint loadTexture(SDL_Surface* surface, TexCoord* texCoord);
133  static int powerOfTwo(int input);
134
135 private:
136   Text(Font* font = NULL, TEXT_RENDER_TYPE type = TEXT_RENDER_DYNAMIC);
137   void setFont(Font* font);
138
139
140 private:
141  Font*             font;           //!< Font of this text
142
143  TEXT_RENDER_TYPE  type;           //!< The type of this Font.
144  char*             text;           //!< The text to display
145  const char*       externText;     //!< the text to Display from an external Source.
146  Vector            color;          //!< The color of the font.
147  float             blending;       //!< The blending intensity.
148
149  // placement in openGL
150  GLuint            texture;        //!< A GL-texture to hold the text
151  TexCoord          texCoord;       //!< Texture-coordinates @todo fix this to have a struct
152  float             height;
153  float             width;
154};
155
156////////////
157/// FONT ///
158////////////
159//! A class to handle a Font of a certain ttf-File, Size and Color.
160class Font : public BaseObject
161{
162  friend class Text;
163
164 public:
165  Font(const char* fontFile,
166       unsigned int fontSize = FONT_DEFAULT_SIZE);
167  Font(char** xpmArray);
168  virtual ~Font();
169
170  void init();
171
172  // font
173  bool loadFont(const char* fontFile);
174  bool loadFontFromSDL_Surface(SDL_Surface* surface);
175
176  void setSize(unsigned int fontSize);
177  void setStyle(const char* renderStyle);
178
179  /** @returns a Pointer to the Array of Glyphs */
180  inline Glyph** getGlyphArray() const { return this->glyphArray; };
181  /** @returns the texture to the fast-texture */
182  inline GLuint getFastTextureID() const { return this->fastTextureID; };
183  /** @returns the default Font */
184  inline static Font* getDefaultFont() { return Font::defaultFont; };
185
186  void createAsciiImage(const char* fileName);
187  static void initDefaultFont();
188  static void removeDefaultFont();
189
190 private:
191  int getMaxHeight();
192  int getMaxAscent();
193  int getMaxDescent();
194  Glyph* getGlyphMetrics(Uint16 character);
195
196  GLuint createFastTexture();
197
198  void initGlyphs(Uint16 from, Uint16 count);
199  int findOptimalFastTextureSize();
200
201  void debug();
202
203 private:
204  static Font*  defaultFont;         //!< a default font, that is used, if other fonts were unable to be loaded.
205  // information about the Font
206  TTF_Font*     font;                //!< The font we use for this.
207  unsigned int  fontSize;            //!< The size of the font in pixels. each Font has one size.
208  int           renderStyle;         //!< The Renderstyle
209
210  Glyph**       glyphArray;          //!< An Array of all the Glyphs stored in the Array of Glyphs.
211  GLuint        fastTextureID;       //!< The fast textureID.
212
213  tList<Text>*  textList;            //!< A list of texts this Font is mapped to.
214};
215
216///////////////////
217/// TEXT-ENGINE ///
218///////////////////
219//! A singleton Class that operates as a Handler for generating and rendering Text in 2D
220class TextEngine : public BaseObject
221{
222 public:
223  virtual ~TextEngine();
224  /** @returns a Pointer to the only object of this Class */
225  inline static TextEngine* getInstance() { if (!singletonRef) singletonRef = new TextEngine();  return singletonRef; };
226
227  Text* createText(const char* fontFile,
228                   unsigned int fontSize = FONT_DEFAULT_SIZE,
229                   int textType = TEXT_RENDER_DYNAMIC);
230
231  void debug() const;
232
233 private:
234  TextEngine();
235  static TextEngine* singletonRef;
236
237  // general
238  static void enableFonts();
239  static void disableFonts();
240  static bool checkVersion();
241};
242
243#endif /* _TEXT_ENGINE_H */
Note: See TracBrowser for help on using the repository browser.