From 30e85c4d58b57d9d3fc0a0030da7d552ac43d94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20L=C3=B3pez?= Date: Tue, 20 Jul 2010 00:40:37 +0000 Subject: [PATCH] Added template parameter and data member to svg_renderer for holding the output stream. --- SConstruct | 1 + include/mapnik/svg_renderer.hpp | 19 ++++++++--- src/svg/process_building_symbolizer.cpp | 7 +++- src/svg/process_glyph_symbolizer.cpp | 7 +++- src/svg/process_line_pattern_symbolizer.cpp | 7 +++- src/svg/process_line_symbolizer.cpp | 7 +++- src/svg/process_markers_symbolizer.cpp | 7 +++- src/svg/process_point_symbolizer.cpp | 7 +++- .../process_polygon_pattern_symbolizer.cpp | 7 +++- src/svg/process_polygon_symbolizer.cpp | 7 +++- src/svg/process_raster_symbolizer.cpp | 7 +++- src/svg/process_shield_symbolizer.cpp | 7 +++- src/svg/process_text_symbolizer.cpp | 8 +++-- src/svg/svg_renderer.cpp | 34 +++++++++++++++---- tests/cpp_tests/SConscript | 2 +- tests/cpp_tests/svg_renderer_tests/SConscript | 20 +++++++++++ .../svg_renderer_tests/compilation_test.cpp | 34 +++++++++++++++++++ 17 files changed, 164 insertions(+), 24 deletions(-) create mode 100644 tests/cpp_tests/svg_renderer_tests/SConscript create mode 100644 tests/cpp_tests/svg_renderer_tests/compilation_test.cpp diff --git a/SConstruct b/SConstruct index 950810e4b..103fbb6d0 100644 --- a/SConstruct +++ b/SConstruct @@ -1266,6 +1266,7 @@ if not HELP_REQUESTED: # build C++ tests SConscript('tests/cpp_tests/SConscript') + SConscript('tests/cpp_tests/svg_renderer_tests/SConscript') # install pkg-config script and mapnik-config script SConscript('utils/mapnik-config/SConscript') diff --git a/include/mapnik/svg_renderer.hpp b/include/mapnik/svg_renderer.hpp index 7b0281f92..498490a01 100644 --- a/include/mapnik/svg_renderer.hpp +++ b/include/mapnik/svg_renderer.hpp @@ -28,17 +28,20 @@ // mapnik #include +// stl +#include + namespace mapnik { - // svg_renderer isn't a template class for now, because - // I haven't devised an equivalent of image_32 for svg. - class MAPNIK_DECL svg_renderer : public feature_style_processor, + // parameterized with the type of ostream it will use for output. + 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); + svg_renderer(Map const& m, T & output_stream); ~svg_renderer(); void start_map_processing(Map const& map); @@ -78,6 +81,14 @@ namespace mapnik void process(glyph_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans); + + // constant variable that stores the xml declaration. + static const std::string XML_DECLARATION; + // constant variable that stores the dtd urls. + static const std::string SVG_DTD; + + private: + T & output_stream_; }; } diff --git a/src/svg/process_building_symbolizer.cpp b/src/svg/process_building_symbolizer.cpp index b7ec2a2a5..0003ad268 100644 --- a/src/svg/process_building_symbolizer.cpp +++ b/src/svg/process_building_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(building_symbolizer const& sym, + template + void svg_renderer::process(building_symbolizer const& sym, 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); } diff --git a/src/svg/process_glyph_symbolizer.cpp b/src/svg/process_glyph_symbolizer.cpp index 8cd45aea3..0a3f46abf 100644 --- a/src/svg/process_glyph_symbolizer.cpp +++ b/src/svg/process_glyph_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(glyph_symbolizer const& sym, + template + void svg_renderer::process(glyph_symbolizer const& sym, 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); } diff --git a/src/svg/process_line_pattern_symbolizer.cpp b/src/svg/process_line_pattern_symbolizer.cpp index 350e5d5e9..8f3f623e3 100644 --- a/src/svg/process_line_pattern_symbolizer.cpp +++ b/src/svg/process_line_pattern_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(line_pattern_symbolizer const& sym, + template + void svg_renderer::process(line_pattern_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 f387d771d..aec8d0ac9 100644 --- a/src/svg/process_line_symbolizer.cpp +++ b/src/svg/process_line_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(line_symbolizer const& sym, + template + void svg_renderer::process(line_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 3cf330b8c..05ae567d2 100644 --- a/src/svg/process_markers_symbolizer.cpp +++ b/src/svg/process_markers_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(markers_symbolizer const& sym, + template + void svg_renderer::process(markers_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 8ffed6023..a86f595cb 100644 --- a/src/svg/process_point_symbolizer.cpp +++ b/src/svg/process_point_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(point_symbolizer const& sym, + template + void svg_renderer::process(point_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 6c2f1f6e0..b3078aa10 100644 --- a/src/svg/process_polygon_pattern_symbolizer.cpp +++ b/src/svg/process_polygon_pattern_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(polygon_pattern_symbolizer const& sym, + template + void svg_renderer::process(polygon_pattern_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 f0db26d1d..88b68f405 100644 --- a/src/svg/process_polygon_symbolizer.cpp +++ b/src/svg/process_polygon_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(polygon_symbolizer const& sym, + template + void svg_renderer::process(polygon_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 128c93e3c..8301e713a 100644 --- a/src/svg/process_raster_symbolizer.cpp +++ b/src/svg/process_raster_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(raster_symbolizer const& sym, + template + void svg_renderer::process(raster_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 a8a83ab96..6804d1991 100644 --- a/src/svg/process_shield_symbolizer.cpp +++ b/src/svg/process_shield_symbolizer.cpp @@ -26,10 +26,15 @@ namespace mapnik { - void svg_renderer::process(shield_symbolizer const& sym, + template + void svg_renderer::process(shield_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 29b80cc69..e796c6ced 100644 --- a/src/svg/process_text_symbolizer.cpp +++ b/src/svg/process_text_symbolizer.cpp @@ -26,11 +26,15 @@ namespace mapnik { - - void svg_renderer::process(text_symbolizer const& sym, + template + void svg_renderer::process(text_symbolizer const& sym, Feature const& feature, proj_transform const& prj_trans) { // nothing yet. } + + 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 db2adbb5c..c30a8ee47 100644 --- a/src/svg/svg_renderer.cpp +++ b/src/svg/svg_renderer.cpp @@ -28,20 +28,35 @@ #ifdef MAPNIK_DEBUG #include #endif +#include namespace mapnik { - svg_renderer::svg_renderer(Map const& m) : - feature_style_processor(m) + /* + * XML_DECLARATION and SVG_DTD comprise the XML header of the SVG document. + * They are required for producing standard compliant XML documents. + * They are stored in svg_renderer, but they might move to somewhere else. + */ + template + const std::string svg_renderer::XML_DECLARATION = ""; + template + const std::string svg_renderer::SVG_DTD = ""; + + template + svg_renderer::svg_renderer(Map const& m, T & output_stream) : + feature_style_processor(m), + output_stream_(output_stream) { // nothing yet. } - svg_renderer::~svg_renderer() {} + template + svg_renderer::~svg_renderer() {} // only empty methods for now. - void svg_renderer::start_map_processing(Map const& map) + template + void svg_renderer::start_map_processing(Map const& map) { // nothing yet. @@ -50,7 +65,8 @@ namespace mapnik #endif } - void svg_renderer::end_map_processing(Map const& map) + template + void svg_renderer::end_map_processing(Map const& map) { // nothing yet. @@ -59,7 +75,8 @@ namespace mapnik #endif } - void svg_renderer::start_layer_processing(layer const& lay) + template + void svg_renderer::start_layer_processing(layer const& lay) { // nothing yet. @@ -68,7 +85,8 @@ namespace mapnik #endif } - void svg_renderer::end_layer_processing(layer const& lay) + template + void svg_renderer::end_layer_processing(layer const& lay) { // nothing yet. @@ -76,4 +94,6 @@ namespace mapnik std::clog << "end layer processing: " << lay.name() << std::endl; #endif } + + template class svg_renderer; } diff --git a/tests/cpp_tests/SConscript b/tests/cpp_tests/SConscript index ab38ed4eb..beeb2cc33 100644 --- a/tests/cpp_tests/SConscript +++ b/tests/cpp_tests/SConscript @@ -17,4 +17,4 @@ if env['HAS_BOOST_SYSTEM']: libraries.append(boost_system) for cpp_test in glob.glob('*_test.cpp'): - env.Program(cpp_test.replace('.cpp',''), [cpp_test], CPPPATH=headers, LIBS=libraries) + env.Program(cpp_test.replace('.cpp',''), [cpp_test], CPPPATH=headers, LIBS=libraries) \ No newline at end of file diff --git a/tests/cpp_tests/svg_renderer_tests/SConscript b/tests/cpp_tests/svg_renderer_tests/SConscript new file mode 100644 index 000000000..beeb2cc33 --- /dev/null +++ b/tests/cpp_tests/svg_renderer_tests/SConscript @@ -0,0 +1,20 @@ +import os +import glob + +Import ('env') + +headers = env['CPPPATH'] + +boost_filesystem = 'boost_filesystem%s' % env['BOOST_APPEND'] +boost_system = 'boost_system%s' % env['BOOST_APPEND'] + +libraries = [boost_system, boost_filesystem, 'mapnik2'] + +if env['PLATFORM'] == 'Darwin': + libraries.append(env['ICU_LIB_NAME']) + +if env['HAS_BOOST_SYSTEM']: + libraries.append(boost_system) + +for cpp_test in glob.glob('*_test.cpp'): + env.Program(cpp_test.replace('.cpp',''), [cpp_test], CPPPATH=headers, LIBS=libraries) \ No newline at end of file diff --git a/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp b/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp new file mode 100644 index 000000000..1c044875d --- /dev/null +++ b/tests/cpp_tests/svg_renderer_tests/compilation_test.cpp @@ -0,0 +1,34 @@ +#define BOOST_TEST_MODULE compile_tests + +// boost.test +#include + +// mapnik +#include +#include + +// std +#include + +/** + * This test is meant to see if the empty + * implementation of SVG renderer compiles + * and runs when using the inherited methods. + */ +BOOST_AUTO_TEST_CASE(compile_test_case) +{ + using namespace mapnik; + + Map map(800, 600); + + try + { + std::stringstream output_stream; + svg_renderer renderer(map, output_stream); + renderer.apply(); + } + catch(...) + { + BOOST_FAIL("Empty implementation throws exception."); + } +}