diff --git a/include/mapnik/svg_renderer.hpp b/include/mapnik/svg_renderer.hpp index 70ce4db1a..1805927fb 100644 --- a/include/mapnik/svg_renderer.hpp +++ b/include/mapnik/svg_renderer.hpp @@ -33,15 +33,16 @@ namespace mapnik { - // parameterized with the type of ostream it will use for output. + // parameterized with the type of output iterator it will use for output. + // output iterators add more flexibility than streams, because iterators + // can target many other output destinations besides streams. template class MAPNIK_DECL svg_renderer : public feature_style_processor >, private boost::noncopyable { public: - // the only parameter I'm sure of is the map. - svg_renderer(Map const& m, T& output_stream); + svg_renderer(Map const& m, T& output_iterator); ~svg_renderer(); void start_map_processing(Map const& map); @@ -83,15 +84,15 @@ namespace mapnik proj_transform const& prj_trans); // should this function be inline? - inline T& get_output_stream() + inline T& get_output_iterator() { - return output_stream_; + return output_iterator_; } // should this function be inline? - inline const T& get_output_stream() const + inline const T& get_output_iterator() const { - return output_stream_; + return output_iterator_; } // XML declaration. @@ -104,7 +105,7 @@ namespace mapnik static const std::string SVG_NAMESPACE_URL; private: - T& output_stream_; + T& output_iterator_; const int width_; const int height_; }; diff --git a/src/svg/process_building_symbolizer.cpp b/src/svg/process_building_symbolizer.cpp index 7a8b1cb9f..d1b32655d 100644 --- a/src/svg/process_building_symbolizer.cpp +++ b/src/svg/process_building_symbolizer.cpp @@ -28,17 +28,13 @@ namespace mapnik { template void svg_renderer::process(building_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans) + Feature const& feature, + proj_transform const& prj_trans) { // nothing yet. } - template void svg_renderer::process(building_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(building_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(building_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_glyph_symbolizer.cpp b/src/svg/process_glyph_symbolizer.cpp index 105d78bb2..0065e73fe 100644 --- a/src/svg/process_glyph_symbolizer.cpp +++ b/src/svg/process_glyph_symbolizer.cpp @@ -28,17 +28,13 @@ namespace mapnik { template void svg_renderer::process(glyph_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans) + Feature const& feature, + proj_transform const& prj_trans) { // nothing yet. } - template void svg_renderer::process(glyph_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(glyph_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(glyph_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_line_pattern_symbolizer.cpp b/src/svg/process_line_pattern_symbolizer.cpp index 3711509e7..238abda84 100644 --- a/src/svg/process_line_pattern_symbolizer.cpp +++ b/src/svg/process_line_pattern_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(line_pattern_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(line_pattern_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(line_pattern_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_line_symbolizer.cpp b/src/svg/process_line_symbolizer.cpp index 67bbcee4a..8d075f5d8 100644 --- a/src/svg/process_line_symbolizer.cpp +++ b/src/svg/process_line_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(line_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(line_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(line_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_markers_symbolizer.cpp b/src/svg/process_markers_symbolizer.cpp index 299f517ce..0b5b554d1 100644 --- a/src/svg/process_markers_symbolizer.cpp +++ b/src/svg/process_markers_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(markers_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(markers_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(markers_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_point_symbolizer.cpp b/src/svg/process_point_symbolizer.cpp index 0e65721eb..7553ca4ca 100644 --- a/src/svg/process_point_symbolizer.cpp +++ b/src/svg/process_point_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(point_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(point_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(point_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_polygon_pattern_symbolizer.cpp b/src/svg/process_polygon_pattern_symbolizer.cpp index 2d9134dae..ba63be165 100644 --- a/src/svg/process_polygon_pattern_symbolizer.cpp +++ b/src/svg/process_polygon_pattern_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(polygon_pattern_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(polygon_pattern_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(polygon_pattern_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_polygon_symbolizer.cpp b/src/svg/process_polygon_symbolizer.cpp index 243bbe9f9..cd558c893 100644 --- a/src/svg/process_polygon_symbolizer.cpp +++ b/src/svg/process_polygon_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(polygon_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(polygon_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(polygon_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_raster_symbolizer.cpp b/src/svg/process_raster_symbolizer.cpp index 701bf9b96..5c7fb73ff 100644 --- a/src/svg/process_raster_symbolizer.cpp +++ b/src/svg/process_raster_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(raster_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(raster_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(raster_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_shield_symbolizer.cpp b/src/svg/process_shield_symbolizer.cpp index 04db836e5..aae409cf1 100644 --- a/src/svg/process_shield_symbolizer.cpp +++ b/src/svg/process_shield_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(shield_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(shield_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(shield_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/process_text_symbolizer.cpp b/src/svg/process_text_symbolizer.cpp index a8ea27f2e..19b078916 100644 --- a/src/svg/process_text_symbolizer.cpp +++ b/src/svg/process_text_symbolizer.cpp @@ -34,11 +34,7 @@ namespace mapnik // nothing yet. } - template void svg_renderer::process(text_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); - - template void svg_renderer::process(text_symbolizer const& sym, - Feature const& feature, - proj_transform const& prj_trans); + template void svg_renderer >::process(text_symbolizer const& sym, + Feature const& feature, + proj_transform const& prj_trans); } diff --git a/src/svg/svg_renderer.cpp b/src/svg/svg_renderer.cpp index ad23cb378..ac13b8d00 100644 --- a/src/svg/svg_renderer.cpp +++ b/src/svg/svg_renderer.cpp @@ -28,8 +28,7 @@ #ifdef MAPNIK_DEBUG #include #endif -#include -#include +#include // boost #include @@ -64,9 +63,9 @@ namespace mapnik const std::string svg_renderer::SVG_NAMESPACE_URL = "http://www.w3.org/2000/svg"; template - svg_renderer::svg_renderer(Map const& m, T & output_stream) : + svg_renderer::svg_renderer(Map const& m, T & output_iterator) : feature_style_processor(m), - output_stream_(output_stream), + output_iterator_(output_iterator), width_(m.width()), height_(m.height()) { @@ -91,11 +90,9 @@ namespace mapnik using repository::confix; using fusion::tuple; - std::ostream_iterator output_stream_iterator(output_stream_); - // generate XML header. generate( - output_stream_iterator, + output_iterator_, string << eol << string << eol, XML_DECLARATION, SVG_DTD); @@ -104,7 +101,7 @@ namespace mapnik // which is taken from the map's dimensions. generate( - output_stream_iterator, + output_iterator_, confix("<", ">")[ "svg width=" << confix('"', '"')[int_ << string] << " height=" << confix('"', '"')[int_ << string] @@ -118,13 +115,14 @@ namespace mapnik { // generate background color as a rectangle that spans the whole image. generate( - output_stream_iterator, + output_iterator_, confix("<", "/>")[ "rect x=" << confix('"', '"')[int_] << " y=" << confix('"', '"')[int_] << " width=" << confix('"', '"')[int_ << string] << " height=" << confix('"', '"')[int_ << string] - << " style=" << confix('"', '"')["fill: " << string]], + << " style=" << confix('"', '"')["fill: " << string]] + << eol, 0, 0, tuple(width_, "px"), tuple(height_, "px"), bgcolor->to_hex_string()); } } @@ -132,11 +130,13 @@ namespace mapnik template void svg_renderer::end_map_processing(Map const& map) { - using karma::format; + using karma::generate; using karma::lit; // generate SVG root element closing tag. - output_stream_ << format(lit("\n")); + generate( + output_iterator_, + lit("")); #ifdef MAPNIK_DEBUG std::clog << "end map processing" << std::endl; @@ -163,6 +163,5 @@ namespace mapnik #endif } - template class svg_renderer; - template class svg_renderer; + template class svg_renderer >; } diff --git a/tests/cpp_tests/svg_renderer_tests/combined_test.cpp b/tests/cpp_tests/svg_renderer_tests/combined_test.cpp index 2967905dc..3296ea156 100644 --- a/tests/cpp_tests/svg_renderer_tests/combined_test.cpp +++ b/tests/cpp_tests/svg_renderer_tests/combined_test.cpp @@ -11,6 +11,7 @@ // std #include #include +#include /** * This test case tests all the generators inside svg_renderer, @@ -26,13 +27,14 @@ BOOST_AUTO_TEST_CASE(combined_test_case) { using namespace mapnik; - typedef svg_renderer svg_ren; + typedef svg_renderer > svg_ren; Map map(800, 600); map.set_background(color_factory::from_string("white")); std::ostringstream output_stream; - svg_ren renderer(map, output_stream); + std::ostream_iterator output_stream_iterator(output_stream); + svg_ren renderer(map, output_stream_iterator); renderer.apply(); std::string expected_output = @@ -48,7 +50,7 @@ BOOST_AUTO_TEST_CASE(combined_test_case) +"\n" +""; - std::string actual_output = renderer.get_output_stream().str(); + std::string actual_output = output_stream.str(); BOOST_CHECK_EQUAL(actual_output, expected_output); } diff --git a/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp b/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp index fa1393ecd..6ca837f18 100644 --- a/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp +++ b/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp @@ -9,6 +9,7 @@ // std #include +#include /** * This test is meant to see if the empty @@ -24,7 +25,8 @@ BOOST_AUTO_TEST_CASE(compile_test_case) try { std::ostringstream output_stream; - svg_renderer renderer(map, output_stream); + std::ostream_iterator output_stream_iterator(output_stream); + svg_renderer > renderer(map, output_stream_iterator); renderer.apply(); } catch(...) diff --git a/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp b/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp index bd0eeb149..e5c55ca83 100644 --- a/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp +++ b/tests/cpp_tests/svg_renderer_tests/file_output_test.cpp @@ -19,6 +19,7 @@ // stl #include +#include namespace filesystem = boost::filesystem; @@ -39,7 +40,7 @@ namespace filesystem = boost::filesystem; BOOST_AUTO_TEST_CASE(file_output_test_case) { using namespace mapnik; - typedef svg_renderer svg_ren; + typedef svg_renderer > svg_ren; Map map(800, 600); map.set_background(color_factory::from_string("blue")); @@ -49,7 +50,9 @@ BOOST_AUTO_TEST_CASE(file_output_test_case) if(output_stream) { - svg_ren renderer(map, output_stream); + std::ostream_iterator output_stream_iterator(output_stream); + + svg_ren renderer(map, output_stream_iterator); renderer.apply(); output_stream.close();