#include "lisp/lisp.hpp"
#include "screen.hpp"
#include "font.hpp"
+#include "renderer.hpp"
#include "drawing_context.hpp"
#include "log.hpp"
return s;
}
+std::string
+Font::wrap_to_width(const std::string& s, float width, std::string* overflow)
+{
+ // 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;
// no bluring as we would get with subpixel positions
pos.x = static_cast<int>(pos.x);
- draw_text(temp, pos, drawing_effect, alpha);
+ draw_text(renderer, temp, pos, drawing_effect, alpha);
if (i == text.size())
break;
}
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)
// 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
}
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;
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;
}
}