convert to expressions: text-ratio, wrap-before, rotate-displacement
This commit is contained in:
parent
24e21cd387
commit
a66c1ddb06
4 changed files with 46 additions and 47 deletions
|
@ -138,6 +138,9 @@ private:
|
||||||
// Precalculated values for maximum performance
|
// Precalculated values for maximum performance
|
||||||
rotation orientation_ = {0,1.0};
|
rotation orientation_ = {0,1.0};
|
||||||
double wrap_width_ = 0.0;
|
double wrap_width_ = 0.0;
|
||||||
|
bool wrap_before_ = false;
|
||||||
|
bool rotate_displacement_ = false;
|
||||||
|
double text_ratio_ = 0.0;
|
||||||
pixel_position displacement_;
|
pixel_position displacement_;
|
||||||
box2d<double> bounds_;
|
box2d<double> bounds_;
|
||||||
|
|
||||||
|
|
|
@ -75,8 +75,8 @@ struct MAPNIK_DECL text_layout_properties
|
||||||
// Load all values from XML ptree.
|
// Load all values from XML ptree.
|
||||||
void from_xml(xml_node const &sym);
|
void from_xml(xml_node const &sym);
|
||||||
// Save all values to XML ptree (but does not create a new parent node!).
|
// Save all values to XML ptree (but does not create a new parent node!).
|
||||||
void to_xml(boost::property_tree::ptree &node, bool explicit_defaults,
|
void to_xml(boost::property_tree::ptree & node, bool explicit_defaults,
|
||||||
text_layout_properties const &dfl=text_layout_properties()) const;
|
text_layout_properties const& dfl=text_layout_properties()) const;
|
||||||
|
|
||||||
// Get a list of all expressions used in any placement.
|
// Get a list of all expressions used in any placement.
|
||||||
// This function is used to collect attributes.
|
// This function is used to collect attributes.
|
||||||
|
@ -89,10 +89,11 @@ struct MAPNIK_DECL text_layout_properties
|
||||||
horizontal_alignment_e halign;
|
horizontal_alignment_e halign;
|
||||||
justify_alignment_e jalign;
|
justify_alignment_e jalign;
|
||||||
vertical_alignment_e valign;
|
vertical_alignment_e valign;
|
||||||
double text_ratio;
|
|
||||||
|
symbolizer_base::value_type text_ratio;
|
||||||
symbolizer_base::value_type wrap_width;
|
symbolizer_base::value_type wrap_width;
|
||||||
bool wrap_before;
|
symbolizer_base::value_type wrap_before;
|
||||||
bool rotate_displacement;
|
symbolizer_base::value_type rotate_displacement;
|
||||||
};
|
};
|
||||||
|
|
||||||
using text_layout_properties_ptr = std::shared_ptr<text_layout_properties>;
|
using text_layout_properties_ptr = std::shared_ptr<text_layout_properties>;
|
||||||
|
|
|
@ -89,13 +89,13 @@ void text_layout::layout()
|
||||||
std::pair<unsigned, unsigned> line_limits = itemizer_.line(i);
|
std::pair<unsigned, unsigned> line_limits = itemizer_.line(i);
|
||||||
text_line line(line_limits.first, line_limits.second);
|
text_line line(line_limits.first, line_limits.second);
|
||||||
//Break line if neccessary
|
//Break line if neccessary
|
||||||
break_line(line, wrap_width_ * scale_factor_, properties_.text_ratio, properties_.wrap_before);
|
break_line(line, wrap_width_ * scale_factor_, text_ratio_, wrap_before_);
|
||||||
}
|
}
|
||||||
init_alignment();
|
init_alignment();
|
||||||
|
|
||||||
/* Find text origin. */
|
/* Find text origin. */
|
||||||
displacement_ = scale_factor_ * properties_.displacement + alignment_offset();
|
displacement_ = scale_factor_ * properties_.displacement + alignment_offset();
|
||||||
if (properties_.rotate_displacement) displacement_ = displacement_.rotate(!orientation_);
|
if (rotate_displacement_) displacement_ = displacement_.rotate(!orientation_);
|
||||||
|
|
||||||
/* Find layout bounds, expanded for rotation */
|
/* Find layout bounds, expanded for rotation */
|
||||||
rotated_box2d(bounds_, orientation_, displacement_, width_, height_);
|
rotated_box2d(bounds_, orientation_, displacement_, width_, height_);
|
||||||
|
@ -238,6 +238,8 @@ void text_layout::evaluate_properties(feature_impl const& feature, attributes co
|
||||||
wrap_width_ = boost::apply_visitor(extract_value<value_double>(feature,attr), properties_.wrap_width);
|
wrap_width_ = boost::apply_visitor(extract_value<value_double>(feature,attr), properties_.wrap_width);
|
||||||
double angle = boost::apply_visitor(extract_value<value_double>(feature,attr), properties_.orientation);
|
double angle = boost::apply_visitor(extract_value<value_double>(feature,attr), properties_.orientation);
|
||||||
orientation_.init(angle * M_PI/ 180.0);
|
orientation_.init(angle * M_PI/ 180.0);
|
||||||
|
wrap_before_ = boost::apply_visitor(extract_value<value_bool>(feature,attr), properties_.wrap_before);
|
||||||
|
rotate_displacement_ = boost::apply_visitor(extract_value<value_bool>(feature,attr), properties_.rotate_displacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
void text_layout::init_alignment()
|
void text_layout::init_alignment()
|
||||||
|
|
|
@ -215,15 +215,10 @@ void set_property_from_xml(symbolizer_base::value_type & val, char const* name,
|
||||||
}
|
}
|
||||||
|
|
||||||
text_layout_properties::text_layout_properties()
|
text_layout_properties::text_layout_properties()
|
||||||
: orientation(0.0),
|
: displacement(0.0,0.0),
|
||||||
displacement(0.0,0.0),
|
|
||||||
halign(H_AUTO),
|
halign(H_AUTO),
|
||||||
jalign(J_AUTO),
|
jalign(J_AUTO),
|
||||||
valign(V_AUTO),
|
valign(V_AUTO) {}
|
||||||
text_ratio(0.0),
|
|
||||||
wrap_width(0.0),
|
|
||||||
wrap_before(false),
|
|
||||||
rotate_displacement(false) {}
|
|
||||||
|
|
||||||
void text_layout_properties::from_xml(xml_node const &sym)
|
void text_layout_properties::from_xml(xml_node const &sym)
|
||||||
{
|
{
|
||||||
|
@ -237,16 +232,11 @@ void text_layout_properties::from_xml(xml_node const &sym)
|
||||||
if (halign_) halign = *halign_;
|
if (halign_) halign = *halign_;
|
||||||
optional<justify_alignment_e> jalign_ = sym.get_opt_attr<justify_alignment_e>("justify-alignment");
|
optional<justify_alignment_e> jalign_ = sym.get_opt_attr<justify_alignment_e>("justify-alignment");
|
||||||
if (jalign_) jalign = *jalign_;
|
if (jalign_) jalign = *jalign_;
|
||||||
optional<double> text_ratio_ = sym.get_opt_attr<double>("text-ratio");
|
|
||||||
if (text_ratio_) text_ratio = *text_ratio_;
|
|
||||||
|
|
||||||
|
set_property_from_xml<double>(text_ratio, "text-ratio", sym);
|
||||||
set_property_from_xml<double>(wrap_width, "wrap-width", sym);
|
set_property_from_xml<double>(wrap_width, "wrap-width", sym);
|
||||||
|
set_property_from_xml<boolean>(wrap_before, "wrap-before", sym);
|
||||||
optional<boolean> wrap_before_ = sym.get_opt_attr<boolean>("wrap-before");
|
set_property_from_xml<boolean>(rotate_displacement, "rotate-displacement", sym);
|
||||||
if (wrap_before_) wrap_before = *wrap_before_;
|
|
||||||
optional<boolean> rotate_displacement_ = sym.get_opt_attr<boolean>("rotate-displacement");
|
|
||||||
if (rotate_displacement_) rotate_displacement = *rotate_displacement_;
|
|
||||||
|
|
||||||
set_property_from_xml<double>(orientation, "orientation", sym);
|
set_property_from_xml<double>(orientation, "orientation", sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,22 +264,22 @@ void text_layout_properties::to_xml(boost::property_tree::ptree & node,
|
||||||
{
|
{
|
||||||
set_attr(node, "justify-alignment", jalign);
|
set_attr(node, "justify-alignment", jalign);
|
||||||
}
|
}
|
||||||
if (text_ratio != dfl.text_ratio || explicit_defaults)
|
//if (text_ratio != dfl.text_ratio || explicit_defaults)
|
||||||
{
|
//{
|
||||||
set_attr(node, "text-ratio", text_ratio);
|
// set_attr(node, "text-ratio", text_ratio);
|
||||||
}
|
//}
|
||||||
//if (wrap_width != dfl.wrap_width || explicit_defaults)
|
//if (wrap_width != dfl.wrap_width || explicit_defaults)
|
||||||
//{
|
//{
|
||||||
// set_attr(node, "wrap-width", wrap_width);
|
// set_attr(node, "wrap-width", wrap_width);
|
||||||
//}
|
//}
|
||||||
if (wrap_before != dfl.wrap_before || explicit_defaults)
|
//if (wrap_before != dfl.wrap_before || explicit_defaults)
|
||||||
{
|
//{
|
||||||
set_attr(node, "wrap-before", wrap_before);
|
// set_attr(node, "wrap-before", wrap_before);
|
||||||
}
|
//}
|
||||||
if (rotate_displacement != dfl.rotate_displacement || explicit_defaults)
|
//if (rotate_displacement != dfl.rotate_displacement || explicit_defaults)
|
||||||
{
|
//{
|
||||||
set_attr(node, "rotate-displacement", rotate_displacement);
|
// set_attr(node, "rotate-displacement", rotate_displacement);
|
||||||
}
|
//}
|
||||||
/// TODO
|
/// TODO
|
||||||
//if (orientation)
|
//if (orientation)
|
||||||
//{
|
//{
|
||||||
|
@ -304,21 +294,24 @@ void text_layout_properties::add_expressions(expression_set& output) const
|
||||||
{
|
{
|
||||||
if (is_expression(orientation)) output.insert(boost::get<expression_ptr>(orientation));
|
if (is_expression(orientation)) output.insert(boost::get<expression_ptr>(orientation));
|
||||||
if (is_expression(wrap_width)) output.insert(boost::get<expression_ptr>(wrap_width));
|
if (is_expression(wrap_width)) output.insert(boost::get<expression_ptr>(wrap_width));
|
||||||
|
if (is_expression(wrap_before)) output.insert(boost::get<expression_ptr>(wrap_before));
|
||||||
|
if (is_expression(rotate_displacement)) output.insert(boost::get<expression_ptr>(rotate_displacement));
|
||||||
|
if (is_expression(text_ratio)) output.insert(boost::get<expression_ptr>(text_ratio));
|
||||||
}
|
}
|
||||||
|
|
||||||
char_properties::char_properties() :
|
char_properties::char_properties()
|
||||||
face_name(),
|
: face_name(),
|
||||||
fontset(),
|
fontset(),
|
||||||
text_size(10.0),
|
text_size(10.0),
|
||||||
character_spacing(0),
|
character_spacing(0),
|
||||||
line_spacing(0),
|
line_spacing(0),
|
||||||
text_opacity(1.0),
|
text_opacity(1.0),
|
||||||
halo_opacity(1.0),
|
halo_opacity(1.0),
|
||||||
wrap_char(' '),
|
wrap_char(' '),
|
||||||
text_transform(NONE),
|
text_transform(NONE),
|
||||||
fill(color(0,0,0)),
|
fill(color(0,0,0)),
|
||||||
halo_fill(color(255,255,255)),
|
halo_fill(color(255,255,255)),
|
||||||
halo_radius(0) {}
|
halo_radius(0) {}
|
||||||
|
|
||||||
void char_properties::from_xml(xml_node const& node, fontset_map const& fontsets)
|
void char_properties::from_xml(xml_node const& node, fontset_map const& fontsets)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue