Store pointer to char_info in text_path instead of pointer to char_properties.
This commit is contained in:
parent
b5e1ebfac8
commit
4638b28c36
4 changed files with 31 additions and 34 deletions
|
@ -118,32 +118,32 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef char_info const * char_info_ptr;
|
||||||
|
|
||||||
|
|
||||||
/** List of all characters and their positions and formats for a placement. */
|
/** List of all characters and their positions and formats for a placement. */
|
||||||
class text_path : boost::noncopyable
|
class text_path : boost::noncopyable
|
||||||
{
|
{
|
||||||
struct character_node
|
struct character_node
|
||||||
{
|
{
|
||||||
int c;
|
char_info_ptr c;
|
||||||
pixel_position pos;
|
pixel_position pos;
|
||||||
double angle;
|
double angle;
|
||||||
char_properties *format;
|
|
||||||
|
|
||||||
character_node(int c_, double x_, double y_, double angle_, char_properties *format_)
|
character_node(char_info_ptr c_, double x_, double y_, double angle_)
|
||||||
: c(c_), pos(x_, y_), angle(angle_), format(format_)
|
: c(c_), pos(x_, y_), angle(angle_)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~character_node() {}
|
~character_node() {}
|
||||||
|
|
||||||
void vertex(int *c_, double *x_, double *y_, double *angle_, char_properties **format_)
|
void vertex(char_info_ptr *c_, double *x_, double *y_, double *angle_)
|
||||||
{
|
{
|
||||||
*c_ = c;
|
*c_ = c;
|
||||||
*x_ = pos.x;
|
*x_ = pos.x;
|
||||||
*y_ = pos.y;
|
*y_ = pos.y;
|
||||||
*angle_ = angle;
|
*angle_ = angle;
|
||||||
*format_ = format;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -163,15 +163,15 @@ public:
|
||||||
~text_path() {}
|
~text_path() {}
|
||||||
|
|
||||||
/** Adds a new char to the list. */
|
/** Adds a new char to the list. */
|
||||||
void add_node(int c, double x, double y, double angle, char_properties *format)
|
void add_node(char_info_ptr c, double x, double y, double angle)
|
||||||
{
|
{
|
||||||
nodes_.push_back(character_node(c, x, y, angle, format));
|
nodes_.push_back(character_node(c, x, y, angle));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return node. Always returns a new node. Has no way to report that there are no more nodes. */
|
/** Return node. Always returns a new node. Has no way to report that there are no more nodes. */
|
||||||
void vertex(int *c, double *x, double *y, double *angle, char_properties **format)
|
void vertex(char_info_ptr *c, double *x, double *y, double *angle)
|
||||||
{
|
{
|
||||||
nodes_[itr_++].vertex(c, x, y, angle, format);
|
nodes_[itr_++].vertex(c, x, y, angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Start again at first node. */
|
/** Start again at first node. */
|
||||||
|
|
|
@ -581,17 +581,16 @@ public:
|
||||||
|
|
||||||
for (int iii = 0; iii < path.num_nodes(); iii++)
|
for (int iii = 0; iii < path.num_nodes(); iii++)
|
||||||
{
|
{
|
||||||
int c;
|
char_info_ptr c;
|
||||||
double x, y, angle;
|
double x, y, angle;
|
||||||
char_properties *format;
|
|
||||||
|
|
||||||
path.vertex(&c, &x, &y, &angle, &format);
|
path.vertex(&c, &x, &y, &angle);
|
||||||
|
|
||||||
face_set_ptr faces = font_manager.get_face_set(format->face_name, format->fontset);
|
face_set_ptr faces = font_manager.get_face_set(c->format->face_name, c->format->fontset);
|
||||||
float text_size = format->text_size;
|
float text_size = c->format->text_size;
|
||||||
faces->set_character_sizes(text_size);
|
faces->set_character_sizes(text_size);
|
||||||
|
|
||||||
glyph_ptr glyph = faces->get_glyph(c);
|
glyph_ptr glyph = faces->get_glyph(c->c);
|
||||||
|
|
||||||
if (glyph)
|
if (glyph)
|
||||||
{
|
{
|
||||||
|
@ -609,11 +608,11 @@ public:
|
||||||
set_font_face(manager, glyph->get_face());
|
set_font_face(manager, glyph->get_face());
|
||||||
|
|
||||||
glyph_path(glyph->get_index(), sx + x, sy - y);
|
glyph_path(glyph->get_index(), sx + x, sy - y);
|
||||||
set_line_width(format->halo_radius);
|
set_line_width(c->format->halo_radius);
|
||||||
set_line_join(ROUND_JOIN);
|
set_line_join(ROUND_JOIN);
|
||||||
set_color(format->halo_fill);
|
set_color(c->format->halo_fill);
|
||||||
stroke();
|
stroke();
|
||||||
set_color(format->fill);
|
set_color(c->format->fill);
|
||||||
show_glyph(glyph->get_index(), sx + x, sy - y);
|
show_glyph(glyph->get_index(), sx + x, sy - y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -313,11 +313,10 @@ box2d<double> text_renderer<T>::prepare_glyphs(text_path *path)
|
||||||
|
|
||||||
for (int i = 0; i < path->num_nodes(); i++)
|
for (int i = 0; i < path->num_nodes(); i++)
|
||||||
{
|
{
|
||||||
int c;
|
char_info_ptr c;
|
||||||
double x, y, angle;
|
double x, y, angle;
|
||||||
char_properties *properties;
|
|
||||||
|
|
||||||
path->vertex(&c, &x, &y, &angle, &properties);
|
path->vertex(&c, &x, &y, &angle);
|
||||||
|
|
||||||
#ifdef MAPNIK_DEBUG
|
#ifdef MAPNIK_DEBUG
|
||||||
// TODO Enable when we have support for setting verbosity
|
// TODO Enable when we have support for setting verbosity
|
||||||
|
@ -331,10 +330,10 @@ box2d<double> text_renderer<T>::prepare_glyphs(text_path *path)
|
||||||
pen.x = int(x * 64);
|
pen.x = int(x * 64);
|
||||||
pen.y = int(y * 64);
|
pen.y = int(y * 64);
|
||||||
|
|
||||||
face_set_ptr faces = font_manager_.get_face_set(properties->face_name, properties->fontset);
|
face_set_ptr faces = font_manager_.get_face_set(c->format->face_name, c->format->fontset);
|
||||||
faces->set_character_sizes(properties->text_size);
|
faces->set_character_sizes(c->format->text_size);
|
||||||
|
|
||||||
glyph_ptr glyph = faces->get_glyph(unsigned(c));
|
glyph_ptr glyph = faces->get_glyph(unsigned(c->c));
|
||||||
FT_Face face = glyph->get_face()->get_face();
|
FT_Face face = glyph->get_face()->get_face();
|
||||||
|
|
||||||
matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
|
matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
|
||||||
|
@ -372,7 +371,7 @@ box2d<double> text_renderer<T>::prepare_glyphs(text_path *path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// take ownership of the glyph
|
// take ownership of the glyph
|
||||||
glyphs_.push_back(new glyph_t(image, properties));
|
glyphs_.push_back(new glyph_t(image, c->format));
|
||||||
}
|
}
|
||||||
|
|
||||||
return box2d<double>(bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax);
|
return box2d<double>(bbox.xMin, bbox.yMin, bbox.xMax, bbox.yMax);
|
||||||
|
|
|
@ -396,7 +396,6 @@ void placement_finder<DetectorT>::find_point_placement(double label_x, double la
|
||||||
|
|
||||||
double cwidth = ci.width + ci.format->character_spacing;
|
double cwidth = ci.width + ci.format->character_spacing;
|
||||||
|
|
||||||
unsigned c = ci.c;
|
|
||||||
if (i == index_to_wrap_at)
|
if (i == index_to_wrap_at)
|
||||||
{
|
{
|
||||||
index_to_wrap_at = line_breaks_[++line_number];
|
index_to_wrap_at = line_breaks_[++line_number];
|
||||||
|
@ -420,7 +419,7 @@ void placement_finder<DetectorT>::find_point_placement(double label_x, double la
|
||||||
double dx = x * cosa - y*sina;
|
double dx = x * cosa - y*sina;
|
||||||
double dy = x * sina + y*cosa;
|
double dy = x * sina + y*cosa;
|
||||||
|
|
||||||
current_placement->add_node(c, dx, dy, rad, ci.format);
|
current_placement->add_node(&ci, dx, dy, rad);
|
||||||
|
|
||||||
// compute the Bounding Box for each character and test for:
|
// compute the Bounding Box for each character and test for:
|
||||||
// overlap, minimum distance or edge avoidance - exit if condition occurs
|
// overlap, minimum distance or edge avoidance - exit if condition occurs
|
||||||
|
@ -732,7 +731,6 @@ std::auto_ptr<text_path> placement_finder<DetectorT>::get_placement_offset(const
|
||||||
// grab the next character according to the orientation
|
// grab the next character according to the orientation
|
||||||
char_info const &ci = orientation > 0 ? info_.at(i) : info_.at(info_.num_characters() - i - 1);
|
char_info const &ci = orientation > 0 ? info_.at(i) : info_.at(info_.num_characters() - i - 1);
|
||||||
double cwidth = ci.width + ci.format->character_spacing;
|
double cwidth = ci.width + ci.format->character_spacing;
|
||||||
unsigned c = ci.c;
|
|
||||||
|
|
||||||
double last_character_angle = angle;
|
double last_character_angle = angle;
|
||||||
|
|
||||||
|
@ -826,9 +824,10 @@ std::auto_ptr<text_path> placement_finder<DetectorT>::get_placement_offset(const
|
||||||
render_y -= cwidth*sina + char_height*cosa;
|
render_y -= cwidth*sina + char_height*cosa;
|
||||||
render_angle += M_PI;
|
render_angle += M_PI;
|
||||||
}
|
}
|
||||||
current_placement->add_node(c,render_x - current_placement->center.x,
|
current_placement->add_node(&ci,
|
||||||
|
render_x - current_placement->center.x,
|
||||||
-render_y + current_placement->center.y,
|
-render_y + current_placement->center.y,
|
||||||
render_angle, ci.format);
|
render_angle);
|
||||||
|
|
||||||
//Normalise to 0 <= angle < 2PI
|
//Normalise to 0 <= angle < 2PI
|
||||||
while (render_angle >= 2*M_PI)
|
while (render_angle >= 2*M_PI)
|
||||||
|
@ -867,13 +866,13 @@ bool placement_finder<DetectorT>::test_placement(const std::auto_ptr<text_path>
|
||||||
bool status = true;
|
bool status = true;
|
||||||
for (unsigned i = 0; i < info_.num_characters(); ++i)
|
for (unsigned i = 0; i < info_.num_characters(); ++i)
|
||||||
{
|
{
|
||||||
|
//TODO: I think this can be simplified by taking the char_info from vertex() but this needs to be carefully tested!
|
||||||
// grab the next character according to the orientation
|
// grab the next character according to the orientation
|
||||||
char_info const& ci = orientation > 0 ? info_.at(i) : info_.at(info_.num_characters() - i - 1);
|
char_info const& ci = orientation > 0 ? info_.at(i) : info_.at(info_.num_characters() - i - 1);
|
||||||
double cwidth = ci.width + ci.format->character_spacing;
|
double cwidth = ci.width + ci.format->character_spacing;
|
||||||
int c;
|
char_info_ptr c;
|
||||||
double x, y, angle;
|
double x, y, angle;
|
||||||
char_properties *properties;
|
current_placement->vertex(&c, &x, &y, &angle);
|
||||||
current_placement->vertex(&c, &x, &y, &angle, &properties);
|
|
||||||
x = current_placement->center.x + x;
|
x = current_placement->center.x + x;
|
||||||
y = current_placement->center.y - y;
|
y = current_placement->center.y - y;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue