Correctly handle glyph clusters.
This commit is contained in:
parent
b7ac16d460
commit
3db18cfa50
3 changed files with 30 additions and 15 deletions
|
@ -99,6 +99,8 @@ public:
|
||||||
const_iterator end() const;
|
const_iterator end() const;
|
||||||
unsigned size() const;
|
unsigned size() const;
|
||||||
|
|
||||||
|
double cluster_width(unsigned cluster) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void break_line(text_line_ptr line, double wrap_width, unsigned text_ratio);
|
void break_line(text_line_ptr line, double wrap_width, unsigned text_ratio);
|
||||||
void shape_text(text_line_ptr line);
|
void shape_text(text_line_ptr line);
|
||||||
|
|
|
@ -242,6 +242,13 @@ unsigned text_layout::size() const
|
||||||
return lines_.size();
|
return lines_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double text_layout::cluster_width(unsigned cluster) const
|
||||||
|
{
|
||||||
|
std::map<unsigned, double>::const_iterator width_itr = width_map_.find(cluster);
|
||||||
|
if (width_itr != width_map_.end()) return width_itr->second;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
text_line::text_line(unsigned first_char, unsigned last_char)
|
text_line::text_line(unsigned first_char, unsigned last_char)
|
||||||
|
|
|
@ -338,31 +338,37 @@ bool placement_finder_ng::single_line_placement(vertex_cache &pp, text_upright_e
|
||||||
offset -= (*line_itr)->height();
|
offset -= (*line_itr)->height();
|
||||||
pp.set_offset(offset);
|
pp.set_offset(offset);
|
||||||
|
|
||||||
double last_glyph_angle = 999;
|
double last_cluster_angle = 999;
|
||||||
|
// signed current_cluster = -1;
|
||||||
|
double angle, sina, cosa;
|
||||||
|
|
||||||
text_line::const_iterator glyph_itr = (*line_itr)->begin(), glyph_end = (*line_itr)->end();
|
text_line::const_iterator glyph_itr = (*line_itr)->begin(), glyph_end = (*line_itr)->end();
|
||||||
for (; glyph_itr != glyph_end; glyph_itr++)
|
for (; glyph_itr != glyph_end; glyph_itr++)
|
||||||
{
|
{
|
||||||
double angle = normalize_angle(pp.angle(sign * glyph_itr->width));
|
if (glyph_itr->width > 0)
|
||||||
double sina = sin(angle);
|
{
|
||||||
double cosa = cos(angle);
|
//Only calculate new angle at the start of each cluster!
|
||||||
|
angle = normalize_angle(pp.angle(sign * glyph_itr->width));
|
||||||
|
sina = sin(angle);
|
||||||
|
cosa = cos(angle);
|
||||||
|
if ((info_->properties.max_char_angle_delta > 0) && (last_cluster_angle != 999) &&
|
||||||
|
fabs(normalize_angle(angle-last_cluster_angle)) > info_->properties.max_char_angle_delta)
|
||||||
|
{
|
||||||
|
pp.restore_state(s);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
last_cluster_angle = angle;
|
||||||
|
// current_cluster = glyph_itr->char_index;
|
||||||
|
}
|
||||||
|
if (abs(angle) > M_PI/2) upside_down_glyph_count++;
|
||||||
|
|
||||||
pixel_position pos = pp.current_position();
|
pixel_position pos = pp.current_position();
|
||||||
//Center the text on the line
|
//Center the text on the line
|
||||||
pos.y = -pos.y - char_height/2.0*cosa;
|
pos.y = -pos.y - char_height/2.0*cosa;
|
||||||
pos.x = pos.x + char_height/2.0*sina;
|
pos.x = pos.x + char_height/2.0*sina;
|
||||||
|
|
||||||
if (abs(angle) > M_PI/2) upside_down_glyph_count++;
|
|
||||||
|
|
||||||
if ((info_->properties.max_char_angle_delta > 0) && (last_glyph_angle != 999) &&
|
|
||||||
fabs(normalize_angle(angle-last_glyph_angle)) > info_->properties.max_char_angle_delta)
|
|
||||||
{
|
|
||||||
pp.restore_state(s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
last_glyph_angle = angle;
|
|
||||||
|
|
||||||
glyphs->push_back(*glyph_itr, pos, angle); //TODO: Store cosa, sina instead
|
glyphs->push_back(*glyph_itr, pos, angle); //TODO: Store cosa, sina instead
|
||||||
if (glyph_itr->width)
|
if (glyph_itr->width > 0)
|
||||||
{
|
{
|
||||||
//Only advance if glyph is not part of a multiple glyph sequence
|
//Only advance if glyph is not part of a multiple glyph sequence
|
||||||
pp.move(sign * (glyph_itr->width + glyph_itr->format->character_spacing));
|
pp.move(sign * (glyph_itr->width + glyph_itr->format->character_spacing));
|
||||||
|
|
Loading…
Reference in a new issue