X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Ffont.cpp;h=7628f673e0f6ab1e84f7063ce6afca06981f5eac;hb=472d0ad804844d28811c86f03da74b6d6be53f1b;hp=7c6d7cfba951e8f81e394cb1cc453090f0cec1c7;hpb=94f5f77ebdecb14317c610a2a8c686c576e4722a;p=supertux.git diff --git a/src/video/font.cpp b/src/video/font.cpp index 7c6d7cfba..7628f673e 100644 --- a/src/video/font.cpp +++ b/src/video/font.cpp @@ -31,6 +31,7 @@ #include "lisp/lisp.hpp" #include "screen.hpp" #include "font.hpp" +#include "renderer.hpp" #include "drawing_context.hpp" #include "log.hpp" @@ -241,9 +242,36 @@ Font::wrap_to_chars(const std::string& s, int line_length, std::string* overflow return s; } +std::string +Font::wrap_to_width(const std::string& s_, float width, std::string* overflow) +{ + std::string s = s_; + + // if text is already smaller, return full text + if (get_text_width(s) <= width) { + if (overflow) *overflow = ""; + return s; + } + + // if we can find a whitespace character to break at, return text up to this character + for (int i = s.length()-1; i >= 0; i--) { + std::string s2 = s.substr(0,i); + if (s[i] != ' ') continue; + if (get_text_width(s2) <= width) { + if (overflow) *overflow = s.substr(i+1); + return s.substr(0, i); + } + } + + // FIXME: hard-wrap at width, taking care of multibyte characters + if (overflow) *overflow = ""; + return s; +} + void -Font::draw(const std::string& text, const Vector& pos_, FontAlignment alignment, - DrawingEffect drawing_effect, float alpha) const +Font::draw(Renderer *renderer, const std::string& text, const Vector& pos_, + FontAlignment alignment, DrawingEffect drawing_effect, + float alpha) const { float x = pos_.x; float y = pos_.y; @@ -267,7 +295,7 @@ Font::draw(const std::string& text, const Vector& pos_, FontAlignment alignment, // no bluring as we would get with subpixel positions pos.x = static_cast(pos.x); - draw_text(temp, pos, drawing_effect, alpha); + draw_text(renderer, temp, pos, drawing_effect, alpha); if (i == text.size()) break; @@ -279,7 +307,7 @@ Font::draw(const std::string& text, const Vector& pos_, FontAlignment alignment, } void -Font::draw_text(const std::string& text, const Vector& pos, +Font::draw_text(Renderer *renderer, const std::string& text, const Vector& pos, DrawingEffect drawing_effect, float alpha) const { if(shadowsize > 0) @@ -287,11 +315,11 @@ Font::draw_text(const std::string& text, const Vector& pos, // FIXME: shadow_glyph_surface and glyph_surface do currently // share the same glyph array, this is incorrect and should be // fixed, it is however hardly noticable - draw_chars(shadow_glyph_surface, text, pos + Vector(shadowsize, shadowsize), - drawing_effect, alpha); + draw_chars(renderer, shadow_glyph_surface, text, + pos + Vector(shadowsize, shadowsize), drawing_effect, alpha); } - draw_chars(glyph_surface, text, pos, drawing_effect, alpha); + draw_chars(renderer, glyph_surface, text, pos, drawing_effect, alpha); } int @@ -317,8 +345,9 @@ Font::chr2glyph(uint32_t chr) const } void -Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos, - DrawingEffect drawing_effect, float alpha) const +Font::draw_chars(Renderer *renderer, Surface* pchars, const std::string& text, + const Vector& pos, DrawingEffect drawing_effect, + float alpha) const { Vector p = pos; @@ -338,12 +367,20 @@ Font::draw_chars(Surface* pchars, const std::string& text, const Vector& pos, else { const Glyph& glyph = glyphs[font_index]; - pchars->draw_part(glyph.rect.get_left(), - glyph.rect.get_top(), - p.x + glyph.offset.y, - p.y + glyph.offset.y, - glyph.rect.get_width(), glyph.rect.get_height(), - alpha, drawing_effect); + DrawingRequest request; + + request.pos = p + glyph.offset; + request.drawing_effect = drawing_effect; + request.alpha = alpha; + + SurfacePartRequest surfacepartrequest; + surfacepartrequest.size = glyph.rect.p2 - glyph.rect.p1; + surfacepartrequest.source = glyph.rect.p1; + surfacepartrequest.surface = pchars; + + request.request_data = &surfacepartrequest; + renderer->draw_surface_part(request); + p.x += glyphs[font_index].advance; } }