- fix pointed out by Matt Mets
[supertux.git] / lib / video / font.cpp
index f6a3254..a2a5922 100644 (file)
@@ -74,12 +74,12 @@ float
 Font::get_text_width(const std::string& text) const
 {
   /** Let's calculate the size of the biggest paragraph */
-  int l, hl;
+  std::string::size_type l, hl;
   hl = 0; l = -1;
   while(true)
     {
     l = text.find("\n", l+1);
-    if(l == (int)std::string::npos)
+    if(l == std::string::npos)
       break;
     if(hl < l)
       hl = l;
@@ -94,7 +94,7 @@ float
 Font::get_text_height(const std::string& text) const
 {
   /** Let's calculate height of the text */
-  int l, hh;
+  std::string::size_type l, hh;
   hh = h; l = -1;
   while(true)
     {
@@ -114,38 +114,34 @@ Font::get_height() const
 }
 
 void
-Font::draw(const std::string& text, const Vector& pos, Uint32 drawing_effect)
-{
-  if(shadowsize > 0)
-    draw_chars(shadow_chars, text, pos + Vector(shadowsize, shadowsize),
-               drawing_effect);
-
-  draw_chars(chars, text, pos, drawing_effect);
-}
-
-void
-Font::draw_center(const std::string& text, const Vector& pos, Uint32 drawing_effect)
+Font::draw(const std::string& text, const Vector& pos_, int allignment, Uint32 drawing_effect, int alpha)
 {
-  /* Cut lines changes into seperate strings, needed to support centering text
-     with break lines.
+  // calculate X positions based on the allignment type
+  Vector pos = Vector(pos_);
+  if(allignment == CENTER_ALLIGN)
+    pos.x -= get_text_width(text) / 2;
+  else if(allignment == RIGHT_ALLIGN)
+    pos.x -= get_text_width(text);
+
+  /* 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;
   i = y = 0;
+
   while(true)
     {
     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);
+      draw_text(temp, pos + Vector(0,y), drawing_effect, alpha);
       break;
       }
     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);
+    draw_text(temp, pos + Vector(0,y), drawing_effect, alpha);
 
     i = l+1;
     y += h + 2;
@@ -153,8 +149,18 @@ Font::draw_center(const std::string& text, const Vector& pos, Uint32 drawing_eff
 }
 
 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)
+                 Uint32 drawing_effect, int alpha)
 {
   SurfaceImpl* impl = pchars->impl;
 
@@ -179,7 +185,7 @@ Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos,
     int source_x = (index % 16) * w;
     int source_y = (index / 16) * h;
 
-    impl->draw_part(source_x, source_y, p.x, p.y, w, h, 255, drawing_effect);
+    impl->draw_part(source_x, source_y, p.x, p.y, w, h, alpha, drawing_effect);
     p.x += w;
   }
 }
@@ -211,7 +217,7 @@ void SuperTux::display_text_file(const std::string& file, float scroll_speed, Fo
 
   // Split text string lines into a vector
   names.clear();
-  unsigned int i, l;
+  std::string::size_type i, l;
   i = 0;
   while(true)
     {
@@ -303,9 +309,9 @@ void SuperTux::display_text_file(const std::string& file, float scroll_speed, Fo
           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;
       }