Correct size calculation.

This commit is contained in:
Hermann Kraus 2012-07-28 20:45:17 +02:00
parent 212760b507
commit 71247085d2
2 changed files with 23 additions and 9 deletions

View file

@ -61,7 +61,7 @@ public:
double height() const; double height() const;
double max_char_height() const { return max_char_height_; } double max_char_height() const { return max_char_height_; }
void set_max_char_height(double max_char_height); void update_max_char_height(double max_char_height);
double line_height() const { return line_height_; } double line_height() const { return line_height_; }
void set_first_line(bool first_line); void set_first_line(bool first_line);

View file

@ -47,10 +47,6 @@ void text_layout::layout(double wrap_width, unsigned text_ratio)
text_line_ptr line = boost::make_shared<text_line>(0, itemizer_.get_text().length()); text_line_ptr line = boost::make_shared<text_line>(0, itemizer_.get_text().length());
shape_text(line, 0, itemizer_.get_text().length()); //Process full text shape_text(line, 0, itemizer_.get_text().length()); //Process full text
break_line(line, wrap_width, text_ratio); //Break line if neccessary break_line(line, wrap_width, text_ratio); //Break line if neccessary
if (lines_.size())
{
lines_[0]->set_first_line(true);
}
} }
@ -126,7 +122,7 @@ void text_layout::shape_text(text_line_ptr line, unsigned start, unsigned end)
face_set->set_character_sizes(itr->format->text_size); face_set->set_character_sizes(itr->format->text_size);
face_ptr face = *(face_set->begin()); //TODO: Implement font sets correctly face_ptr face = *(face_set->begin()); //TODO: Implement font sets correctly
text_shaping shaper(face->get_face()); //TODO: Make this more efficient by caching this object in font_face text_shaping shaper(face->get_face()); //TODO: Make this more efficient by caching this object in font_face
line->set_text_height(itr->format->text_size /*TODO*/); line->update_max_char_height(itr->format->text_size /*TODO*/);
shaper.process_text(text, itr->start, itr->end, itr->rtl == UBIDI_RTL, itr->script); shaper.process_text(text, itr->start, itr->end, itr->rtl == UBIDI_RTL, itr->script);
hb_buffer_t *buffer = shaper.get_buffer(); hb_buffer_t *buffer = shaper.get_buffer();
@ -156,6 +152,17 @@ void text_layout::shape_text(text_line_ptr line, unsigned start, unsigned end)
} }
} }
void text_layout::add_line(text_line_ptr line)
{
if (lines_.empty())
{
line->set_first_line(true);
}
lines_.push_back(line);
width_ = std::max(width_, line->width());
height_ += line->height();
}
void text_layout::clear() void text_layout::clear()
{ {
itemizer_.clear(); itemizer_.clear();
@ -187,6 +194,8 @@ unsigned text_layout::size() const
return lines_.size(); return lines_.size();
} }
/*********************************************************************************************/
text_line::text_line(unsigned first_char, unsigned last_char) text_line::text_line(unsigned first_char, unsigned last_char)
: glyphs_(), line_height_(0.), max_char_height_(0.), : glyphs_(), line_height_(0.), max_char_height_(0.),
width_(0.), first_char_(first_char), last_char_(last_char), width_(0.), first_char_(first_char), last_char_(last_char),
@ -196,9 +205,14 @@ text_line::text_line(unsigned first_char, unsigned last_char)
void text_line::add_glyph(const glyph_info &glyph) void text_line::add_glyph(const glyph_info &glyph)
{ {
glyphs_.push_back(glyph);
line_height_ = std::max(line_height_, glyph.line_height + glyph.format->line_spacing); line_height_ = std::max(line_height_, glyph.line_height + glyph.format->line_spacing);
width_ += glyph.width + glyph.format->character_spacing; if (glyphs_.empty())
{
width_ = glyph.width;
} else {
width_ += glyph.width + glyphs_.back().format->character_spacing;
}
glyphs_.push_back(glyph);
} }
@ -223,7 +237,7 @@ double text_line::height() const
return line_height_; return line_height_;
} }
void text_line::set_max_char_height(double max_char_height) void text_line::update_max_char_height(double max_char_height)
{ {
max_char_height_ = std::max(max_char_height_, max_char_height); max_char_height_ = std::max(max_char_height_, max_char_height);
} }