diff --git a/bindings/python/mapnik_geometry.cpp b/bindings/python/mapnik_geometry.cpp index 0883c2539..c1a1c871e 100644 --- a/bindings/python/mapnik_geometry.cpp +++ b/bindings/python/mapnik_geometry.cpp @@ -49,7 +49,7 @@ geometry_type const& getitem_impl(path_type & p, int key) void from_wkt_impl(path_type& p, std::string const& wkt) { - bool result = mapnik::from_wkt(wkt, p); + bool result = mapnik::from_wkt(wkt , p); if (!result) throw std::runtime_error("Failed to parse WKT"); } diff --git a/bindings/python/mapnik_grid.cpp b/bindings/python/mapnik_grid.cpp index 0a5f3b80a..4906c5460 100644 --- a/bindings/python/mapnik_grid.cpp +++ b/bindings/python/mapnik_grid.cpp @@ -46,7 +46,7 @@ void export_grid() "Grid", "This class represents a feature hitgrid.", init( - ( arg("width"),arg("height"),arg("key")="__id__",arg("resolution")=1 ), + ( boost::python::arg("width"), boost::python::arg("height"),boost::python::arg("key")="__id__", boost::python::arg("resolution")=1 ), "Create a mapnik.Grid object\n" )) .def("painted",&painted) @@ -54,7 +54,7 @@ void export_grid() .def("height",&mapnik::grid::height) .def("view",&mapnik::grid::get_view) .def("encode",encode, - ( arg("encoding")="utf",arg("features")=true,arg("resolution")=4 ), + ( boost::python::arg("encoding")="utf", boost::python::arg("features")=true,boost::python::arg("resolution")=4 ), "Encode the grid as as optimized json\n" ) .add_property("key", diff --git a/bindings/python/mapnik_grid_view.cpp b/bindings/python/mapnik_grid_view.cpp index 88c35d78b..6998f81f3 100644 --- a/bindings/python/mapnik_grid_view.cpp +++ b/bindings/python/mapnik_grid_view.cpp @@ -45,8 +45,8 @@ void export_grid_view() .def("width",&mapnik::grid_view::width) .def("height",&mapnik::grid_view::height) .def("encode",encode, - ( arg("encoding")="utf",arg("add_features")=true,arg("resolution")=4 ), - "Encode the grid as as optimized json\n" + ( boost::python::arg("encoding")="utf",boost::python::arg("add_features")=true,boost::python::arg("resolution")=4 ), + "Encode the grid as as optimized json\n" ) ; } diff --git a/bindings/python/mapnik_inmem_metawriter.cpp b/bindings/python/mapnik_inmem_metawriter.cpp index 70009b079..d0329ee6b 100644 --- a/bindings/python/mapnik_inmem_metawriter.cpp +++ b/bindings/python/mapnik_inmem_metawriter.cpp @@ -35,7 +35,7 @@ using mapnik::metawriter_inmem_ptr; namespace { std::map::const_iterator mapnik_value_map_begin(const std::map &m) { - return m.begin(); + return m.begin(); } std::map::const_iterator diff --git a/bindings/python/mapnik_rule.cpp b/bindings/python/mapnik_rule.cpp index 67912f1c3..3a2ec50ae 100644 --- a/bindings/python/mapnik_rule.cpp +++ b/bindings/python/mapnik_rule.cpp @@ -148,8 +148,8 @@ struct rule_pickle_suite : boost::python::pickle_suite extract_symbolizer serializer( r ); for (int i=0;i(syms[i]); - boost::apply_visitor( serializer, symbol ); + //symbolizer symbol = extract(syms[i]); + //boost::apply_visitor( serializer, symbol ); } } diff --git a/bindings/python/mapnik_svg.hpp b/bindings/python/mapnik_svg.hpp index 3fb8ef3f2..b0834296f 100644 --- a/bindings/python/mapnik_svg.hpp +++ b/bindings/python/mapnik_svg.hpp @@ -43,7 +43,7 @@ template void set_svg_transform(T& symbolizer, std::string const& transform_wkt) { agg::trans_affine tr; - if (!mapnik::svg::parse_transform(transform_wkt, tr)) + if (!mapnik::svg::parse_transform(transform_wkt.c_str(), tr)) { std::stringstream ss; ss << "Could not parse transform from '" << transform_wkt << "', expected string like: 'matrix(1, 0, 0, 1, 0, 0)'"; diff --git a/bindings/python/python_grid_utils.hpp b/bindings/python/python_grid_utils.hpp index ee78f2cab..dd9d8ac15 100644 --- a/bindings/python/python_grid_utils.hpp +++ b/bindings/python/python_grid_utils.hpp @@ -50,12 +50,12 @@ static void grid2utf(T const& grid_type, typename T::key_type::const_iterator key_pos; typename T::feature_key_type::const_iterator feature_pos; // start counting at utf8 codepoint 32, aka space character - uint16_t codepoint = 32; + boost::uint16_t codepoint = 32; unsigned array_size = data.width(); for (unsigned y = 0; y < data.height(); ++y) { - uint16_t idx = 0; + boost::uint16_t idx = 0; boost::scoped_array line(new Py_UNICODE[array_size]); typename T::value_type const* row = data.getRow(y); for (unsigned x = 0; x < data.width(); ++x) @@ -103,13 +103,13 @@ static void grid2utf(T const& grid_type, typename T::key_type::const_iterator key_pos; typename T::feature_key_type::const_iterator feature_pos; // start counting at utf8 codepoint 32, aka space character - uint16_t codepoint = 32; + boost::uint16_t codepoint = 32; // TODO - use double? unsigned array_size = static_cast(grid_type.width()/resolution); for (unsigned y = 0; y < grid_type.height(); y=y+resolution) { - uint16_t idx = 0; + boost::uint16_t idx = 0; boost::scoped_array line(new Py_UNICODE[array_size]); mapnik::grid::value_type const* row = grid_type.getRow(y); for (unsigned x = 0; x < grid_type.width(); x=x+resolution) diff --git a/include/mapnik/feature_type_style.hpp b/include/mapnik/feature_type_style.hpp index d4a428778..829d36c82 100644 --- a/include/mapnik/feature_type_style.hpp +++ b/include/mapnik/feature_type_style.hpp @@ -43,7 +43,7 @@ enum filter_mode_enum { DEFINE_ENUM( filter_mode_e, filter_mode_enum ); typedef std::vector rules; -class feature_type_style +class MAPNIK_DECL feature_type_style { private: rules rules_; diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp index efaadf7a2..eaa464ace 100644 --- a/include/mapnik/font_engine_freetype.hpp +++ b/include/mapnik/font_engine_freetype.hpp @@ -200,7 +200,7 @@ public: void init(double radius) { - FT_Stroker_Set(s_,radius * (1<<6), + FT_Stroker_Set(s_, (FT_Fixed) radius * (1<<6), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); diff --git a/include/mapnik/grid/grid.hpp b/include/mapnik/grid/grid.hpp index 8951d934e..801422bfd 100644 --- a/include/mapnik/grid/grid.hpp +++ b/include/mapnik/grid/grid.hpp @@ -24,6 +24,7 @@ #define MAPNIK_GRID_HPP // mapnik +#include #include #include #include @@ -31,6 +32,9 @@ #include #include +// boost +#include + // stl #include #include @@ -95,17 +99,17 @@ public: ~hit_grid() {} - void painted(bool painted) + inline void painted(bool painted) { painted_ = painted; } - bool painted() const + inline bool painted() const { return painted_; } - void add_feature(mapnik::Feature const& feature) + inline void add_feature(mapnik::Feature const& feature) { // copies feature props @@ -152,12 +156,12 @@ public: } } - void add_property_name(std::string const& name) + inline void add_property_name(std::string const& name) { names_.insert(name); } - std::set property_names() const + inline std::set const& property_names() const { return names_; } @@ -275,7 +279,7 @@ public: inline void blendPixel(value_type feature_id,int x,int y,unsigned int rgba1,int t) { - blendPixel2(x,y,rgba1,t,1.0); // do not change opacity + blendPixel2(feature_id ,x,y,rgba1,t,1.0); // do not change opacity } inline void blendPixel2(value_type feature_id,int x,int y,unsigned int rgba1,int t,double opacity) @@ -331,7 +335,7 @@ public: }; -typedef hit_grid grid; +typedef MAPNIK_DECL hit_grid grid; } #endif //MAPNIK_GRID_HPP diff --git a/include/mapnik/grid/grid_view.hpp b/include/mapnik/grid/grid_view.hpp index b09d274fe..e5cdee823 100644 --- a/include/mapnik/grid/grid_view.hpp +++ b/include/mapnik/grid/grid_view.hpp @@ -30,6 +30,8 @@ #include #include +// boost +#include // stl #include #include @@ -188,7 +190,7 @@ private: feature_type const& features_; }; -typedef hit_grid_view > grid_view; +typedef hit_grid_view > grid_view; } diff --git a/include/mapnik/hextree.hpp b/include/mapnik/hextree.hpp index 3ac09cc04..c9f1265e5 100644 --- a/include/mapnik/hextree.hpp +++ b/include/mapnik/hextree.hpp @@ -434,7 +434,7 @@ private: } tries=0; // ignore leaves and also nodes with small mean error and not excessive number of pixels - if ((cur_node->reduce_cost / cur_node->pixel_count + 1) * std::log(long(cur_node->pixel_count)) > 15 + if ((cur_node->reduce_cost / cur_node->pixel_count + 1) * std::log(double(cur_node->pixel_count)) > 15 && cur_node->children_count > 0) { colors_--; diff --git a/include/mapnik/image_util.hpp b/include/mapnik/image_util.hpp index e841c98fe..2f8aff77d 100644 --- a/include/mapnik/image_util.hpp +++ b/include/mapnik/image_util.hpp @@ -255,6 +255,8 @@ inline MAPNIK_DECL std::string save_to_string(image_32 const& image, return save_to_string(image.data(), type, palette); } +/////////////////////////////////////////////////////////////////////////// + #ifdef _MSC_VER template MAPNIK_DECL void save_to_file(image_data_32 const&, std::string const&, @@ -263,18 +265,31 @@ template MAPNIK_DECL void save_to_file(image_data_32 const&, template MAPNIK_DECL void save_to_file(image_data_32 const&, std::string const&, rgba_palette const&); -template MAPNIK_DECL std::string save_to_string(image_data_32 const&, - std::string const&, - rgba_palette const&); - + +template MAPNIK_DECL void save_to_file(image_data_32 const&, + std::string const&); + + template MAPNIK_DECL void save_to_file > (image_view const&, std::string const&, std::string const&, rgba_palette const&); +template MAPNIK_DECL void save_to_file > (image_view const&, + std::string const&, + std::string const&); + template MAPNIK_DECL void save_to_file > (image_view const&, std::string const&, rgba_palette const&); + +template MAPNIK_DECL void save_to_file > (image_view const&, + std::string const&); + + +template MAPNIK_DECL std::string save_to_string(image_data_32 const&, + std::string const&, + rgba_palette const&); template MAPNIK_DECL std::string save_to_string > (image_view const&, std::string const&, diff --git a/include/mapnik/metawriter_inmem.hpp b/include/mapnik/metawriter_inmem.hpp index 38bfc32b1..278ffea44 100644 --- a/include/mapnik/metawriter_inmem.hpp +++ b/include/mapnik/metawriter_inmem.hpp @@ -25,6 +25,7 @@ #define METAWRITER_INMEM_HPP // mapnik +#include #include // boost @@ -50,7 +51,7 @@ namespace mapnik { * very common in the rendered image will increase memory usage, especially if * many attributes are also kept. */ -class metawriter_inmem +class MAPNIK_DECL metawriter_inmem : public metawriter, private boost::noncopyable { public: /** @@ -59,8 +60,8 @@ public: * then the name attribute of rendered features referencing this metawriter * will be kept in memory. */ - metawriter_inmem(metawriter_properties dflt_properties); - ~metawriter_inmem(); + metawriter_inmem(metawriter_properties dflt_properties); + ~metawriter_inmem(); virtual void add_box(box2d const& box, Feature const& feature, CoordTransform const& t, @@ -87,7 +88,7 @@ public: * are the intersection of the features' properties and the "kept" * properties of the metawriter. */ - struct meta_instance { + struct MAPNIK_DECL meta_instance { box2d box; std::map properties; }; diff --git a/include/mapnik/palette.hpp b/include/mapnik/palette.hpp index e0df13340..18b433b30 100644 --- a/include/mapnik/palette.hpp +++ b/include/mapnik/palette.hpp @@ -26,6 +26,7 @@ // mapnik +#include #include #include @@ -124,7 +125,7 @@ struct rgba typedef boost::unordered_map rgba_hash_table; -class rgba_palette : private boost::noncopyable { +class MAPNIK_DECL rgba_palette : private boost::noncopyable { public: enum palette_type { PALETTE_RGBA = 0, PALETTE_RGB = 1, PALETTE_ACT = 2 }; diff --git a/include/mapnik/parse_path.hpp b/include/mapnik/parse_path.hpp index a1fc8fe60..4434ec2bf 100644 --- a/include/mapnik/parse_path.hpp +++ b/include/mapnik/parse_path.hpp @@ -24,6 +24,7 @@ #define MAPNIK_PARSE_PATH_HPP // mapnik +#include #include #include #include @@ -41,7 +42,7 @@ typedef boost::variant path_component; typedef std::vector path_expression; typedef boost::shared_ptr path_expression_ptr; -path_expression_ptr parse_path(std::string const & str); +MAPNIK_DECL path_expression_ptr parse_path(std::string const & str); template struct path_processor diff --git a/include/mapnik/path_expression_grammar.hpp b/include/mapnik/path_expression_grammar.hpp index 0102aa867..eae2ed7aa 100644 --- a/include/mapnik/path_expression_grammar.hpp +++ b/include/mapnik/path_expression_grammar.hpp @@ -51,7 +51,7 @@ namespace mapnik { - +using namespace boost; namespace qi = boost::spirit::qi; namespace phoenix = boost::phoenix; namespace standard_wide = boost::spirit::standard_wide; @@ -79,7 +79,7 @@ struct path_expression_grammar : qi::grammar> attr [ push_back(_val, construct( _1 )) ] >> ']') + ( '[' >> attr [ push_back(_val, construct( _1 )) ] >> ']') ) ; diff --git a/include/mapnik/raster_colorizer.hpp b/include/mapnik/raster_colorizer.hpp index 8aeb351c2..e0e0796ca 100644 --- a/include/mapnik/raster_colorizer.hpp +++ b/include/mapnik/raster_colorizer.hpp @@ -68,7 +68,7 @@ enum colorizer_mode_enum DEFINE_ENUM( colorizer_mode, colorizer_mode_enum ); //! \brief Structure to represent a stop position. -class colorizer_stop { +class MAPNIK_DECL colorizer_stop { public: //! \brief Constructor @@ -142,7 +142,7 @@ typedef std::vector colorizer_stops; //! \brief Class representing the raster colorizer -class raster_colorizer { +class MAPNIK_DECL raster_colorizer { public: //! \brief Constructor raster_colorizer(colorizer_mode mode = COLORIZER_LINEAR, const color& _color = color(0,0,0,0)); diff --git a/include/mapnik/svg/svg_path_commands.hpp b/include/mapnik/svg/svg_path_commands.hpp index 6d9434d7a..63680bd35 100644 --- a/include/mapnik/svg/svg_path_commands.hpp +++ b/include/mapnik/svg/svg_path_commands.hpp @@ -28,6 +28,11 @@ #include #include +#ifdef _WINDOWS +#define _USE_MATH_DEFINES +#include +#endif + namespace mapnik { namespace svg { using namespace boost::fusion; diff --git a/include/mapnik/svg/svg_path_parser.hpp b/include/mapnik/svg/svg_path_parser.hpp index b21e9394d..d836deffc 100644 --- a/include/mapnik/svg/svg_path_parser.hpp +++ b/include/mapnik/svg/svg_path_parser.hpp @@ -23,6 +23,7 @@ #ifndef SVG_PATH_PARSER_HPP #define SVG_PATH_PARSER_HPP +#include #include namespace mapnik { namespace svg { @@ -34,10 +35,10 @@ template bool parse_points(const char * wkt, PathType & p); template -bool parse_transform(const char * wkt, TransformType & tr); +bool MAPNIK_DECL parse_transform(const char * wkt, TransformType & tr); -template -bool parse_transform(std::string const& wkt, TransformType & tr); +//template +//bool MAPNIK_DECL parse_transform(std::string const& wkt, TransformType & tr); }} diff --git a/include/mapnik/svg/svg_transform_grammar.hpp b/include/mapnik/svg/svg_transform_grammar.hpp index f3c43e7f9..a928b8a92 100644 --- a/include/mapnik/svg/svg_transform_grammar.hpp +++ b/include/mapnik/svg/svg_transform_grammar.hpp @@ -35,6 +35,10 @@ #include #include +#ifdef _WINDOWS +#define _USE_MATH_DEFINES +#include +#endif namespace mapnik { namespace svg { diff --git a/include/mapnik/text_placements.hpp b/include/mapnik/text_placements.hpp index e09f4537f..56b0c04de 100644 --- a/include/mapnik/text_placements.hpp +++ b/include/mapnik/text_placements.hpp @@ -23,6 +23,7 @@ #define TEXT_PLACEMENTS_HPP //mapnik +#include #include //stl @@ -154,14 +155,14 @@ typedef boost::shared_ptr text_placements_ptr; class text_placements_info_dummy; -class text_placements_dummy: public text_placements +class MAPNIK_DECL text_placements_dummy: public text_placements { public: text_placement_info_ptr get_placement_info() const; friend class text_placement_info_dummy; }; -class text_placement_info_dummy : public text_placement_info +class MAPNIK_DECL text_placement_info_dummy : public text_placement_info { public: text_placement_info_dummy(text_placements_dummy const* parent) : text_placement_info(parent), diff --git a/include/mapnik/text_symbolizer.hpp b/include/mapnik/text_symbolizer.hpp index f3556cb2a..e322f4516 100644 --- a/include/mapnik/text_symbolizer.hpp +++ b/include/mapnik/text_symbolizer.hpp @@ -47,12 +47,10 @@ struct MAPNIK_DECL text_symbolizer : public symbolizer_base { text_symbolizer(expression_ptr name, std::string const& face_name, unsigned size, color const& fill, - text_placements_ptr placements = text_placements_ptr( - boost::make_shared()) + text_placements_ptr placements = text_placements_ptr(new text_placements_dummy) ); text_symbolizer(expression_ptr name, unsigned size, color const& fill, - text_placements_ptr placements = text_placements_ptr( - boost::make_shared()) + text_placements_ptr placements = text_placements_ptr(new text_placements_dummy) ); text_symbolizer(text_symbolizer const& rhs); text_symbolizer& operator=(text_symbolizer const& rhs); diff --git a/include/mapnik/value.hpp b/include/mapnik/value.hpp index 95943a165..dfb62ff01 100644 --- a/include/mapnik/value.hpp +++ b/include/mapnik/value.hpp @@ -25,9 +25,12 @@ #define VALUE_HPP // mapnik +#include #include #include + // boost + #include #include #include @@ -49,9 +52,9 @@ inline void to_utf8(UnicodeString const& input, std::string & target) { if (input.length() == 0) return; - const int32_t BUF_SIZE = 256; + const int BUF_SIZE = 256; char buf [BUF_SIZE]; - int32_t len; + int len; UErrorCode err = U_ZERO_ERROR; u_strToUTF8(buf, BUF_SIZE, &len, input.getBuffer(), input.length(), &err); @@ -106,10 +109,8 @@ struct equals bool operator() (value_null, value_null) const { - // this changed from false to true - see http://trac.mapnik.org/ticket/794 - return true; + return false; } - }; struct not_equals @@ -145,21 +146,18 @@ struct not_equals bool operator() (value_null, value_null) const { - // TODO - needs review http://trac.mapnik.org/ticket/794 return false; } template bool operator() (value_null, const T &) const { - // TODO - needs review http://trac.mapnik.org/ticket/794 return false; } template bool operator() (const T &, value_null) const { - // TODO - needs review http://trac.mapnik.org/ticket/794 return false; } }; @@ -533,7 +531,7 @@ struct to_bool : public boost::static_visitor template bool operator() (T val) const { - return bool(val); + return val > 0 ? true : false; } }; diff --git a/include/mapnik/wkt/wkt_factory.hpp b/include/mapnik/wkt/wkt_factory.hpp index f4c9c2380..cfdb2ba00 100644 --- a/include/mapnik/wkt/wkt_factory.hpp +++ b/include/mapnik/wkt/wkt_factory.hpp @@ -23,13 +23,16 @@ #ifndef MAPNIK_WKT_FACTORY_HPP #define MAPNIK_WKT_FACTORY_HPP -#include +// mapnik +#include #include #include +// stl +#include namespace mapnik { -bool from_wkt(std::string const& wkt, boost::ptr_vector & paths); +MAPNIK_DECL bool from_wkt(std::string const& wkt, boost::ptr_vector & paths); } diff --git a/src/grid/grid_renderer.cpp b/src/grid/grid_renderer.cpp index 6b91cc3ad..cf6c645d9 100644 --- a/src/grid/grid_renderer.cpp +++ b/src/grid/grid_renderer.cpp @@ -173,5 +173,7 @@ void grid_renderer::render_marker(Feature const& feature, unsigned int step, pixmap_.add_feature(feature); } +template class hit_grid; template class grid_renderer; + } diff --git a/src/load_map.cpp b/src/load_map.cpp index d89110563..f31767583 100644 --- a/src/load_map.cpp +++ b/src/load_map.cpp @@ -896,7 +896,7 @@ void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym ) if (transform_wkt) { agg::trans_affine tr; - if (!mapnik::svg::parse_transform(*transform_wkt,tr)) + if (!mapnik::svg::parse_transform((*transform_wkt).c_str(),tr)) { std::stringstream ss; ss << "Could not parse transform from '" << transform_wkt @@ -1025,7 +1025,7 @@ void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym ) if (transform_wkt) { agg::trans_affine tr; - if (!mapnik::svg::parse_transform(*transform_wkt,tr)) + if (!mapnik::svg::parse_transform((*transform_wkt).c_str(),tr)) { std::stringstream ss; ss << "Could not parse transform from '" << transform_wkt @@ -1671,7 +1671,7 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym ) if (transform_wkt) { agg::trans_affine tr; - if (!mapnik::svg::parse_transform(*transform_wkt,tr)) + if (!mapnik::svg::parse_transform((*transform_wkt).c_str(),tr)) { std::stringstream ss; ss << "Could not parse transform from '" << transform_wkt << "', expected string like: 'matrix(1, 0, 0, 1, 0, 0)'"; diff --git a/src/proj_transform.cpp b/src/proj_transform.cpp index 9921fde02..462453deb 100644 --- a/src/proj_transform.cpp +++ b/src/proj_transform.cpp @@ -23,6 +23,7 @@ //$Id$ // mapnik +#include #include #include #include diff --git a/src/raster_colorizer.cpp b/src/raster_colorizer.cpp index 69bb66ab9..603273b1f 100644 --- a/src/raster_colorizer.cpp +++ b/src/raster_colorizer.cpp @@ -118,12 +118,15 @@ void raster_colorizer::colorize(raster_ptr const& raster,const std::map0) + const std::map::const_iterator fi = Props.find("NODATA"); + if (fi != Props.end()) + //if (Props.count("NODATA")>0) { hasNoData = true; - noDataValue = Props.at("NODATA").to_double(); + //noDataValue = Props.at("NODATA").to_double(); + noDataValue = fi->second.to_double(); } - + for (int i=0; i bool parse_transform(std::string const& wkt, TransformType & p) { @@ -53,8 +54,9 @@ bool parse_transform(std::string const& wkt, TransformType & p) iterator_type last = wkt.end(); return qi::phrase_parse(first, last, g, skip_type()); } +*/ -template bool parse_transform(const char*, agg::trans_affine&); -template bool parse_transform(std::string const& , agg::trans_affine&); +template MAPNIK_DECL bool parse_transform(const char*, agg::trans_affine&); +//template bool parse_transform(std::string const& , agg::trans_affine&); }} diff --git a/src/text_placements.cpp b/src/text_placements.cpp index f7f22d5f5..a8eb3574e 100644 --- a/src/text_placements.cpp +++ b/src/text_placements.cpp @@ -168,8 +168,8 @@ void text_placements_simple::set_positions(std::string positions) std::string::iterator first = positions.begin(), last = positions.end(); qi::phrase_parse(first, last, - (direction_name[push_back(ref(direction_), _1)] % ',') >> *(',' >> qi::int_[push_back(ref(text_sizes_), _1)]), - space + (direction_name[push_back(phoenix::ref(direction_), _1)] % ',') >> *(',' >> qi::int_[push_back(phoenix::ref(text_sizes_), _1)]), + space ); if (first != last) { std::cerr << "WARNING: Could not parse text_placement_simple placement string ('" << positions << "').\n";