X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fvideo%2Ffont.cpp;h=f132ec63568aec476b84b94488e3da9f658a8180;hb=ca65a4babe2341f4c9b8952cfd516df8d74575e4;hp=a0f7d73e519e00da08171ce39b5172d44c5c5084;hpb=b2d8d1eac9fd6328d3a8c61cf09d4b2882145042;p=supertux.git diff --git a/lib/video/font.cpp b/lib/video/font.cpp index a0f7d73e5..f132ec635 100644 --- a/lib/video/font.cpp +++ b/lib/video/font.cpp @@ -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; } }