// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
// 02111-1307, USA.
+#include <config.h>
+
#include <cstdlib>
#include <cstring>
-#include "../app/globals.h"
-#include "../video/screen.h"
-#include "../video/font.h"
-#include "../video/drawing_context.h"
-#include "../utils/lispreader.h"
+#include "app/globals.h"
+#include "screen.h"
+#include "font.h"
+#include "drawing_context.h"
+#include "utils/lispreader.h"
using namespace SuperTux;
Font::get_text_width(const std::string& text) const
{
/** Let's calculate the size of the biggest paragraph */
- int l, hl;
- hl = 0; l = -1;
+ std::string::size_type l, hl, ol;
+ hl = 0; l = 0;
while(true)
{
+ ol = l;
l = text.find("\n", l+1);
- if(l == (int)std::string::npos)
+ if(l == std::string::npos)
break;
- if(hl < l)
- hl = l;
+ if(hl < l-ol)
+ hl = l-ol;
}
if(hl == 0)
hl = text.size();
Font::get_text_height(const std::string& text) const
{
/** Let's calculate height of the text */
- int l, hh;
- hh = h; l = -1;
+ std::string::size_type l, hh;
+ hh = h; l = 0;
while(true)
{
l = text.find("\n", l+1);
- if(l == (int)std::string::npos)
+ if(l == std::string::npos)
break;
hh += h + 2;
}
}
void
-Font::draw(const std::string& text, const Vector& pos, Uint32 drawing_effect, int alpha)
+Font::draw(const std::string& text, const Vector& pos_, int allignment, Uint32 drawing_effect, int alpha)
{
- if(shadowsize > 0)
- draw_chars(shadow_chars, text, pos + Vector(shadowsize, shadowsize),
- drawing_effect, alpha);
-
- draw_chars(chars, text, pos, drawing_effect, alpha);
-}
-
-void
-Font::draw_center(const std::string& text, const Vector& pos, Uint32 drawing_effect, int alpha)
-{
- /* Cut lines changes into seperate strings, needed to support centering text
- with break lines.
+ /* Cut lines changes into seperate strings, needed to support center/right text
+ allignments with break lines.
Feel free to replace this hack with a more elegant solution
*/
char temp[1024];
- unsigned int i, l, y;
+ std::string::size_type l, i, y;
+ bool done = false;
i = y = 0;
- while(true)
+
+ while(!done)
{
l = text.find("\n", i);
if(l == std::string::npos)
{
- temp[text.copy(temp, text.size() - i, i)] = '\0';
- draw(temp, Vector(screen->w/2 - get_text_width(temp)/2 + pos.x, pos.y + y),
- drawing_effect, alpha);
- break;
+ l = text.size();
+ done = true;
}
+
temp[text.copy(temp, l - i, i)] = '\0';
- draw(temp, Vector(screen->w/2 - get_text_width(temp)/2 + pos.x, pos.y + y),
- drawing_effect, alpha);
+
+ // calculate X positions based on the allignment type
+ Vector pos = Vector(pos_);
+ if(allignment == CENTER_ALLIGN)
+ pos.x -= get_text_width(temp) / 2;
+ else if(allignment == RIGHT_ALLIGN)
+ pos.x -= get_text_width(temp);
+
+ draw_text(temp, pos + Vector(0,y), drawing_effect, alpha);
i = l+1;
y += h + 2;
}
void
+Font::draw_text(const std::string& text, const Vector& pos, Uint32 drawing_effect, int alpha)
+{
+ if(shadowsize > 0)
+ draw_chars(shadow_chars, text, pos + Vector(shadowsize, shadowsize),
+ drawing_effect, alpha);
+
+ draw_chars(chars, text, pos, drawing_effect, alpha);
+}
+
+void
Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos,
Uint32 drawing_effect, int alpha)
{
// Split text string lines into a vector
names.clear();
- unsigned int i, l;
+ std::string::size_type i, l;
i = 0;
while(true)
{
default: font = reference_font; break;
}
- context.draw_text_center(font,
+ context.draw_text(font,
names[i].substr(1, names[i].size()-1),
- Vector(0, screen->h + y - scroll), LAYER_FOREGROUND1);
+ Vector(screen->w/2, screen->h + y - scroll), CENTER_ALLIGN, LAYER_FOREGROUND1);
y += font->get_height() + ITEMS_SPACE;
}