Added an alpha argument for drawing fonts.
[supertux.git] / lib / video / font.cpp
index a0f7d73..f132ec6 100644 (file)
@@ -71,30 +71,90 @@ Font::~Font()
 }
 
 float
-Font::get_height() const
+Font::get_text_width(const std::string& text) const
 {
-  return h;
+  /** Let's calculate the size of the biggest paragraph */
+  int l, hl;
+  hl = 0; l = -1;
+  while(true)
+    {
+    l = text.find("\n", l+1);
+    if(l == (int)std::string::npos)
+      break;
+    if(hl < l)
+      hl = l;
+    }
+  if(hl == 0)
+    hl = text.size();
+
+  return hl * w;
 }
 
 float
-Font::get_text_width(const std::string& text) const
+Font::get_text_height(const std::string& text) const
 {
-  return text.size() * w;
+  /** Let's calculate height of the text */
+  int l, hh;
+  hh = h; l = -1;
+  while(true)
+    {
+    l = text.find("\n", l+1);
+    if(l == (int)std::string::npos)
+      break;
+    hh += h + 2;
+    }
+
+  return hh;
+}
+
+float
+Font::get_height() const
+{
+  return h;
 }
 
 void
-Font::draw(const std::string& text, const Vector& pos, Uint32 drawing_effect)
+Font::draw(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);
+               drawing_effect, alpha);
 
-  draw_chars(chars, text, pos, drawing_effect);
+  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.
+     Feel free to replace this hack with a more elegant solution
+  */
+  char temp[1024];
+  unsigned int i, l, 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, 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, alpha);
+
+    i = l+1;
+    y += h + 2;
+    }
 }
 
 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;
 
@@ -119,7 +179,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;
   }
 }