Handle text position differently.
Should fix part of the ShieldSymbolizer problems. Refs #1078.
This commit is contained in:
parent
2843ff3da8
commit
6efdb3969e
2 changed files with 22 additions and 15 deletions
|
@ -89,6 +89,7 @@ private:
|
||||||
void init_string_size();
|
void init_string_size();
|
||||||
void init_alignment();
|
void init_alignment();
|
||||||
void adjust_position(text_path *current_placement, double label_x, double label_y);
|
void adjust_position(text_path *current_placement, double label_x, double label_y);
|
||||||
|
void add_line(double width, double height, bool first_line);
|
||||||
|
|
||||||
///General Internals
|
///General Internals
|
||||||
DetectorT & detector_;
|
DetectorT & detector_;
|
||||||
|
|
|
@ -248,7 +248,7 @@ void placement_finder<DetectorT>::find_line_breaks()
|
||||||
line_width += word_width + last_wrap_char_width;
|
line_width += word_width + last_wrap_char_width;
|
||||||
line_height = std::max(line_height, word_height);
|
line_height = std::max(line_height, word_height);
|
||||||
last_wrap_char_width = last_char_spacing + ci.width + ci.format->character_spacing;
|
last_wrap_char_width = last_char_spacing + ci.width + ci.format->character_spacing;
|
||||||
last_char_spacing = 0.0;
|
last_char_spacing = 0.0; //Current one is included in last_wrap_char_width
|
||||||
word_width = 0.0;
|
word_width = 0.0;
|
||||||
word_height = 0.0;
|
word_height = 0.0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -256,6 +256,7 @@ void placement_finder<DetectorT>::find_line_breaks()
|
||||||
word_width += last_char_spacing + ci.width;
|
word_width += last_char_spacing + ci.width;
|
||||||
last_char_spacing = ci.format->character_spacing;
|
last_char_spacing = ci.format->character_spacing;
|
||||||
word_height = std::max(word_height, ci.line_height + ci.format->line_spacing);
|
word_height = std::max(word_height, ci.line_height + ci.format->line_spacing);
|
||||||
|
//TODO: I think this calculation could be wrong if height changes for the first word in the second line
|
||||||
if (first_line) first_line_space_ = std::max(first_line_space_, ci.line_height-ci.avg_height);
|
if (first_line) first_line_space_ = std::max(first_line_space_, ci.line_height-ci.avg_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,10 +265,8 @@ void placement_finder<DetectorT>::find_line_breaks()
|
||||||
(line_width > 0 && ((line_width > wrap_at && !ci.format->wrap_before) ||
|
(line_width > 0 && ((line_width > wrap_at && !ci.format->wrap_before) ||
|
||||||
((line_width + last_wrap_char_width + word_width) > wrap_at && ci.format->wrap_before)) ))
|
((line_width + last_wrap_char_width + word_width) > wrap_at && ci.format->wrap_before)) ))
|
||||||
{
|
{
|
||||||
string_width_ = std::max(string_width_, line_width); //Total width is the longest line
|
add_line(line_width, line_height, first_line);
|
||||||
string_height_ += line_height;
|
|
||||||
line_breaks_.push_back(last_wrap_char_pos);
|
line_breaks_.push_back(last_wrap_char_pos);
|
||||||
line_sizes_.push_back(std::make_pair(line_width, line_height));
|
|
||||||
line_width = 0.0;
|
line_width = 0.0;
|
||||||
line_height = 0.0;
|
line_height = 0.0;
|
||||||
last_wrap_char_width = 0; //Wrap char supressed
|
last_wrap_char_width = 0; //Wrap char supressed
|
||||||
|
@ -276,9 +275,7 @@ void placement_finder<DetectorT>::find_line_breaks()
|
||||||
}
|
}
|
||||||
line_width += last_wrap_char_width + word_width;
|
line_width += last_wrap_char_width + word_width;
|
||||||
line_height = std::max(line_height, word_height);
|
line_height = std::max(line_height, word_height);
|
||||||
string_width_ = std::max(string_width_, line_width);
|
add_line(line_width, line_height, first_line);
|
||||||
string_height_ += line_height;
|
|
||||||
line_sizes_.push_back(std::make_pair(line_width, line_height));
|
|
||||||
} else {
|
} else {
|
||||||
//No linebreaks
|
//No linebreaks
|
||||||
line_sizes_.push_back(std::make_pair(string_width_, string_height_));
|
line_sizes_.push_back(std::make_pair(string_width_, string_height_));
|
||||||
|
@ -286,6 +283,14 @@ void placement_finder<DetectorT>::find_line_breaks()
|
||||||
line_breaks_.push_back(info_.num_characters());
|
line_breaks_.push_back(info_.num_characters());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename DetectorT>
|
||||||
|
void placement_finder<DetectorT>::add_line(double width, double height, bool first_line)
|
||||||
|
{
|
||||||
|
if (first_line) height -= first_line_space_;
|
||||||
|
string_width_ = std::max(string_width_, width); //Total width is the longest line
|
||||||
|
string_height_ += height;
|
||||||
|
line_sizes_.push_back(std::make_pair(width, height));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <typename DetectorT>
|
template <typename DetectorT>
|
||||||
|
@ -324,10 +329,6 @@ void placement_finder<DetectorT>::adjust_position(text_path *current_placement,
|
||||||
} else if (valign_ == V_BOTTOM)
|
} else if (valign_ == V_BOTTOM)
|
||||||
{
|
{
|
||||||
current_placement->center.y += 0.5 * string_height_; // move center down by the 1/2 the total height
|
current_placement->center.y += 0.5 * string_height_; // move center down by the 1/2 the total height
|
||||||
current_placement->center.y -= first_line_space_;
|
|
||||||
} else if (valign_ == V_MIDDLE)
|
|
||||||
{
|
|
||||||
current_placement->center.y -= first_line_space_/2.0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set horizontal position to middle of text
|
// set horizontal position to middle of text
|
||||||
|
@ -368,17 +369,22 @@ void placement_finder<DetectorT>::find_point_placement(double label_x, double la
|
||||||
double line_width = line_sizes_[0].first;
|
double line_width = line_sizes_[0].first;
|
||||||
double line_height = line_sizes_[0].second;
|
double line_height = line_sizes_[0].second;
|
||||||
|
|
||||||
//TODO: Understand and document this
|
/* IMPORTANT NOTE:
|
||||||
|
x and y are relative to the center of the text
|
||||||
|
coordinate system:
|
||||||
|
x: grows from left to right
|
||||||
|
y: grows from bottom to top (opposite of normal computer graphics)
|
||||||
|
*/
|
||||||
|
|
||||||
// set for upper left corner of text envelope for the first line, bottom left of first character
|
// set for upper left corner of text envelope for the first line, bottom left of first character
|
||||||
y = (string_height_ / 2.0) - line_height;
|
y = (string_height_ + first_line_space_) / 2.0 - line_height;
|
||||||
|
|
||||||
// adjust for desired justification
|
// adjust for desired justification
|
||||||
//TODO: Understand and document this
|
|
||||||
if (p.jalign == J_LEFT)
|
if (p.jalign == J_LEFT)
|
||||||
x = -(string_width_ / 2.0);
|
x = -(string_width_ / 2.0);
|
||||||
else if (p.jalign == J_RIGHT)
|
else if (p.jalign == J_RIGHT)
|
||||||
x = (string_width_ / 2.0) - line_width;
|
x = (string_width_ / 2.0) - line_width;
|
||||||
else
|
else /* J_MIDDLE */
|
||||||
x = -(line_width / 2.0);
|
x = -(line_width / 2.0);
|
||||||
|
|
||||||
// save each character rendering position and build envelope as go thru loop
|
// save each character rendering position and build envelope as go thru loop
|
||||||
|
|
Loading…
Reference in a new issue