SVG generator outputs path vertices in user coordinates.
This commit is contained in:
parent
3791e95eda
commit
9af87ba8db
2 changed files with 70 additions and 4 deletions
|
@ -29,14 +29,18 @@
|
|||
#include <mapnik/ctrans.hpp>
|
||||
|
||||
// boost
|
||||
#include <boost/fusion/include/adapt_class.hpp>
|
||||
#include <boost/spirit/include/karma.hpp>
|
||||
#include <boost/fusion/include/adapt_class.hpp>
|
||||
#include <boost/spirit/include/phoenix_operator.hpp>
|
||||
#include <boost/spirit/home/phoenix/bind/bind_member_function.hpp>
|
||||
|
||||
BOOST_FUSION_ADAPT_CLASS(
|
||||
mapnik::vertex_vector2<mapnik::vertex2d>::vertex_type,
|
||||
(unsigned, unsigned, obj.get<2>(), /**/)
|
||||
(mapnik::vertex_vector2<mapnik::vertex2d>::value_type, mapnik::vertex_vector2<mapnik::vertex2d>::value_type, obj.get<0>(), /**/)
|
||||
(mapnik::vertex_vector2<mapnik::vertex2d>::value_type, mapnik::vertex_vector2<mapnik::vertex2d>::value_type, obj.get<1>(), /**/)
|
||||
(mapnik::vertex_vector2<mapnik::vertex2d>::value_type, mapnik::vertex_vector2<mapnik::vertex2d>::value_type, obj.get<0>(), /**/)
|
||||
(mapnik::vertex_vector2<mapnik::vertex2d>::value_type, mapnik::vertex_vector2<mapnik::vertex2d>::value_type, obj.get<1>(), /**/)
|
||||
)
|
||||
|
||||
namespace boost { namespace spirit { namespace traits {
|
||||
|
@ -76,20 +80,82 @@ namespace boost { namespace spirit { namespace traits {
|
|||
namespace mapnik { namespace svg {
|
||||
|
||||
using namespace boost::spirit;
|
||||
using namespace boost::phoenix;
|
||||
|
||||
template <typename PathType>
|
||||
struct path_coordinate_transformer
|
||||
{
|
||||
explicit path_coordinate_transformer(PathType const& path_type)
|
||||
: path_type_(path_type),
|
||||
current_x_(0.0),
|
||||
current_y_(0.0)
|
||||
{}
|
||||
|
||||
void set_current_x(double& x)
|
||||
{
|
||||
current_x_ = x;
|
||||
}
|
||||
|
||||
void set_current_y(double& y)
|
||||
{
|
||||
current_y_ = y;
|
||||
path_type_.vertex(¤t_x_, ¤t_y_);
|
||||
}
|
||||
|
||||
void current_x(double& x) const
|
||||
{
|
||||
x = current_x_;
|
||||
}
|
||||
|
||||
void current_y(double& y) const
|
||||
{
|
||||
y = current_y_;
|
||||
}
|
||||
|
||||
PathType const& path_type_;
|
||||
double current_x_;
|
||||
double current_y_;
|
||||
};
|
||||
|
||||
template <typename OutputIterator, typename PathType>
|
||||
struct svg_generator_path_grammar : karma::grammar<OutputIterator, mapnik::geometry2d()>
|
||||
{
|
||||
typedef path_coordinate_transformer<PathType> coordinate_transformer;
|
||||
typedef mapnik::vertex_vector2<mapnik::vertex2d>::vertex_type vertex_type;
|
||||
typedef mapnik::vertex_vector2<mapnik::vertex2d>::value_type vertex_component_type;
|
||||
|
||||
explicit svg_generator_path_grammar(PathType const& path_type)
|
||||
: svg_generator_path_grammar::base_type(svg_path),
|
||||
path_type_(path_type)
|
||||
path_type_(path_type),
|
||||
ct_(path_type)
|
||||
{
|
||||
svg_path = *(karma::int_ << karma::lit(' ') << karma::double_ << karma::lit(' ') << karma::double_ << karma::eol);
|
||||
using karma::int_;
|
||||
using karma::double_;
|
||||
using karma::eol;
|
||||
using karma::omit;
|
||||
using karma::_1;
|
||||
using karma::_a;
|
||||
|
||||
svg_path = *(path_vertex);
|
||||
path_vertex = int_
|
||||
<< omit[path_vertex_component_x] << omit[path_vertex_component_y]
|
||||
<< path_vertex_transformed_x
|
||||
<< ' '
|
||||
<< path_vertex_transformed_y
|
||||
<< eol;
|
||||
path_vertex_component_x = double_[_1 = _a][bind(&coordinate_transformer::set_current_x, &ct_, _a)][_a = _val];
|
||||
path_vertex_component_y = double_[_1 = _a][bind(&coordinate_transformer::set_current_y, &ct_, _a)][_a = _val];
|
||||
path_vertex_transformed_x = double_[_1 = _a][bind(&coordinate_transformer::current_x, &ct_, _a)];
|
||||
path_vertex_transformed_y = double_[_1 = _a][bind(&coordinate_transformer::current_y, &ct_, _a)];
|
||||
}
|
||||
|
||||
karma::rule<OutputIterator, mapnik::geometry2d()> svg_path;
|
||||
karma::rule<OutputIterator, vertex_type()> path_vertex;
|
||||
karma::rule<OutputIterator, vertex_component_type(), karma::locals<double> > path_vertex_component_x, path_vertex_component_y;
|
||||
karma::rule<OutputIterator, vertex_component_type(), karma::locals<double> > path_vertex_transformed_x, path_vertex_transformed_y;
|
||||
|
||||
PathType const& path_type_;
|
||||
coordinate_transformer ct_;
|
||||
};
|
||||
}}
|
||||
|
||||
|
|
|
@ -190,6 +190,7 @@ if env['SVG_RENDERER']: # svg backend
|
|||
source += Split(
|
||||
"""
|
||||
svg/svg_renderer.cpp
|
||||
svg/svg_generator.cpp
|
||||
svg/process_building_symbolizer.cpp
|
||||
svg/process_glyph_symbolizer.cpp
|
||||
svg/process_line_pattern_symbolizer.cpp
|
||||
|
@ -201,7 +202,6 @@ if env['SVG_RENDERER']: # svg backend
|
|||
svg/process_raster_symbolizer.cpp
|
||||
svg/process_shield_symbolizer.cpp
|
||||
svg/process_text_symbolizer.cpp
|
||||
svg/svg_generator.cpp
|
||||
""")
|
||||
|
||||
mapnik = env.SharedLibrary('mapnik2', source, LIBS=libraries, LINKFLAGS=linkflags)
|
||||
|
|
Loading…
Reference in a new issue