1 #include <msp/gl/immediate.h>
2 #include <msp/gl/matrix.h>
11 Text::Text(const Style *const &s):
15 Text::Text(const Style *const &s, const string &t):
21 unsigned Text::get_width() const
24 for(vector<Line>::const_iterator i=lines.begin(); i!=lines.end(); ++i)
25 width=max(width, i->width);
29 unsigned Text::get_height() const
31 const GL::Font *font=style->get_font();
32 float font_size=font->get_default_size();
33 unsigned line_height=static_cast<unsigned>((font->get_ascent()-font->get_descent())*font_size);
34 unsigned line_spacing=line_height*6/5;
35 return line_height+(lines.size()-1)*line_spacing;
38 void Text::set(const string &t)
44 void Text::erase(unsigned pos, unsigned len)
48 vector<Line>::iterator i;
49 for(i=lines.begin(); (i!=lines.end() && i->start+i->length<pos); ++i) ;
51 if(pos+len>i->start+i->length)
57 for(++i; i!=lines.end(); ++i)
62 void Text::insert(unsigned pos, const string &s)
66 if(s.find('\n')!=string::npos)
70 vector<Line>::iterator i;
71 for(i=lines.begin(); (i!=lines.end() && i->start+i->length<pos); ++i) ;
75 for(++i; i!=lines.end(); ++i)
80 void Text::update_style()
82 float font_size=style->get_font()->get_default_size();
83 for(vector<Line>::iterator i=lines.begin(); i!=lines.end(); ++i)
84 i->width=static_cast<unsigned>(style->get_font()->get_string_width(text.substr(i->start, i->length))*font_size);
87 void Text::render(const Part &part, const Geometry &geom) const
92 const GL::Font *font=style->get_font();
93 float font_size=font->get_default_size();
94 unsigned line_height=static_cast<unsigned>((font->get_ascent()-font->get_descent())*font_size);
95 unsigned line_spacing=font_size*6/5;
96 unsigned height=line_height+(lines.size()-1)*line_spacing;
97 int y_offset=static_cast<int>(-font->get_descent()*font_size);
99 const GL::Color &color=style->get_font_color();
100 GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
101 imm.color(color.r, color.g, color.b);
102 for(unsigned i=0; i<lines.size(); ++i)
104 const Line &line=lines[i];
109 rgeom.y=(lines.size()-1-i)*line_spacing+y_offset;
110 part.get_alignment().apply(rgeom, geom, part.get_margin());
113 GL::translate(rgeom.x, rgeom.y, 0);
114 GL::scale_uniform(font_size);
116 font->draw_string(text.substr(line.start, line.length), imm);
122 Text &Text::operator=(const string &t)
128 void Text::find_lines()
131 float font_size=style->get_font()->get_default_size();
132 string::size_type start=0;
135 string::size_type newline=text.find('\n', start);
139 line.length=(newline==string::npos ? text.size() : newline)-start;
140 line.width=static_cast<unsigned>(style->get_font()->get_string_width(text.substr(line.start, line.length))*font_size);
141 lines.push_back(line);
143 if(newline==string::npos)