Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: text-read from XPM works, but there still is an error in displaying them

File size: 7.7 KB
RevLine 
[4597]1/*!
[5039]2 * @file text_engine.h
[4836]3  *  Definition of textEngine, the Font and the Text
[3766]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.
[3767]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.
[3655]14*/
15
[3766]16#ifndef _TEXT_ENGINE_H
17#define _TEXT_ENGINE_H
[3655]18
[3766]19
20#include "glincl.h"
[4662]21
[5275]22#ifdef HAVE_SDL_TTF_H
[5336]23#include <SDL_ttf.h>
[4662]24#else
[5336]25#include <SDL/SDL_ttf.h>
[4662]26#endif
[3766]27
[3655]28#include "base_object.h"
[4850]29#include "element_2d.h"
[3655]30
[4850]31#include "vector.h"
32
[3766]33// FORWARD DECLARATION
34class PNode;
[3768]35class Font;
[3655]36
[4856]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
[5122]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)
[3655]43
[3766]44/* some default values */
[5122]45#define FONT_DEFAULT_SIZE            50                         //!< default size of the Text
46#define FONT_NUM_COLORS              256                        //!< number of colors.
[3766]47
[5336]48#define FONT_HIGHEST_KNOWN_CHAR      256                        //!< The highest character known to the textEngine.
[3766]49
[5122]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};
[3766]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{
[4458]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
[3766]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)
[4458]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
[4597]95
[3766]96  // OpenGL-specific
[4536]97  //  TexCoord texCoord;      //!< A Texture Coordinate for this glyph.
98  GLuint   displayList;       //!< DiplayList to render this Glyph.
[3766]99};
100
[3768]101////////////
102/// TEXT ///
103////////////
[3767]104//! Represents one textElement.
[4850]105class Text : public Element2D
[3767]106{
[5306]107  friend class TextEngine;
[3767]108 public:
[5306]109   Text(const char* fontFile, unsigned int fontSize = FONT_DEFAULT_SIZE, TEXT_RENDER_TYPE type = TEXT_RENDER_DYNAMIC);
[4746]110  ~Text();
[3768]111
[5306]112  void init();
113
[5179]114  void setFont(const char* fontFile, unsigned int fontSize);
[5122]115  void setType(TEXT_RENDER_TYPE type);
116  void setText(const char* text, bool isExtern = false);
[5181]117  /** @returns the String this Text displays */
118  inline const char* getText() const { return (externText == NULL)?this->text:this->externText; };
[4836]119  /** @param blending the blending intensity to set (between 0.0 and 1.0) */
[4856]120  inline void setBlending(float blending) { this->blending = blending; };
[3768]121
[5121]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); };
[3843]124
[3769]125  void createTexture();
126
[4850]127  virtual void draw() const;
[4597]128
[4746]129  void debug() const;
[3769]130
[5336]131  // helpers.
132  static GLuint loadTexture(SDL_Surface* surface, TexCoord* texCoord);
133  static int powerOfTwo(int input);
134
[3773]135 private:
[5306]136   Text(Font* font = NULL, TEXT_RENDER_TYPE type = TEXT_RENDER_DYNAMIC);
137   void setFont(Font* font);
[3768]138
[5306]139
[4458]140 private:
141  Font*             font;           //!< Font of this text
[3768]142
[5122]143  TEXT_RENDER_TYPE  type;           //!< The type of this Font.
[4458]144  char*             text;           //!< The text to display
[5122]145  const char*       externText;     //!< the text to Display from an external Source.
[5121]146  Vector            color;          //!< The color of the font.
[4458]147  float             blending;       //!< The blending intensity.
148
[3767]149  // placement in openGL
[4458]150  GLuint            texture;        //!< A GL-texture to hold the text
[4836]151  TexCoord          texCoord;       //!< Texture-coordinates @todo fix this to have a struct
[5123]152  float             height;
153  float             width;
[3767]154};
155
[3768]156////////////
157/// FONT ///
158////////////
[3767]159//! A class to handle a Font of a certain ttf-File, Size and Color.
[4597]160class Font : public BaseObject
[3766]161{
[3769]162  friend class Text;
[4458]163
[3655]164 public:
[4458]165  Font(const char* fontFile,
[5121]166       unsigned int fontSize = FONT_DEFAULT_SIZE);
[5336]167  Font(char** xpmArray);
[4458]168
[3766]169  virtual ~Font();
[3655]170
[3766]171  // font
[5124]172  bool loadFont(const char* fontFile);
[5336]173  bool loadFontFromXPMArray(char** xpmArray);
174
[3766]175  void setSize(unsigned int fontSize);
[4458]176  void setStyle(const char* renderStyle);
[3766]177
[4836]178  /** @returns a Pointer to the Array of Glyphs */
[5337]179  inline Glyph** getGlyphArray() const { return this->glyphArray; };
[4836]180  /** @returns the texture to the fast-texture */
[5337]181  inline GLuint getFastTextureID() const { return this->fastTextureID; };
[5336]182  /** @returns the default Font */
183  inline static Font* getDefaultFont() { return Font::defaultFont; };
[4597]184
[5336]185  static void initDefaultFont();
186  static void removeDefaultFont();
187
[3655]188 private:
[4746]189  int getMaxHeight();
190  int getMaxAscent();
191  int getMaxDescent();
[3766]192  Glyph* getGlyphMetrics(Uint16 character);
193
194  GLuint createFastTexture();
195
196  void initGlyphs(Uint16 from, Uint16 count);
[4746]197  int findOptimalFastTextureSize();
[3766]198
[4746]199  void debug();
[3766]200
[4458]201 private:
[5336]202  static Font*  defaultFont;         //!< a default font, that is used, if other fonts were unable to be loaded.
[4458]203  // information about the Font
204  TTF_Font*     font;                //!< The font we use for this.
205  unsigned int  fontSize;            //!< The size of the font in pixels. each Font has one size.
206  int           renderStyle;         //!< The Renderstyle
[4597]207
[4458]208  Glyph**       glyphArray;          //!< An Array of all the Glyphs stored in the Array of Glyphs.
209  GLuint        fastTextureID;       //!< The fast textureID.
210
211  tList<Text>*  textList;            //!< A list of texts this Font is mapped to.
[3655]212};
213
[3766]214///////////////////
215/// TEXT-ENGINE ///
216///////////////////
217//! A singleton Class that operates as a Handler for generating and rendering Text in 2D
[4597]218class TextEngine : public BaseObject
[3773]219{
[3766]220 public:
[4746]221  virtual ~TextEngine();
[4836]222  /** @returns a Pointer to the only object of this Class */
[4746]223  inline static TextEngine* getInstance() { if (!singletonRef) singletonRef = new TextEngine();  return singletonRef; };
[3766]224
[3769]225  Text* createText(const char* fontFile,
[4597]226                   unsigned int fontSize = FONT_DEFAULT_SIZE,
[5122]227                   int textType = TEXT_RENDER_DYNAMIC);
[4597]228
[4746]229  void debug() const;
[3774]230
[3769]231 private:
[4746]232  TextEngine();
[3769]233  static TextEngine* singletonRef;
234
[3766]235  // general
[4746]236  static void enableFonts();
237  static void disableFonts();
238  static bool checkVersion();
[3766]239};
240
241#endif /* _TEXT_ENGINE_H */
Note: See TracBrowser for help on using the repository browser.