From 8634a04938bb0b0bd668dff2bfbe2ac096711f5c Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Tue, 21 May 2013 19:21:35 -0700 Subject: [PATCH] add support for drawing all geometry verticies with debug symbolizer mode=vertex and expose in python - closes #1848 --- bindings/python/mapnik_python.cpp | 2 ++ include/mapnik/debug_symbolizer.hpp | 17 +++++++++++- src/agg/process_debug_symbolizer.cpp | 33 +++++++++++++++++++++--- src/build.py | 1 + src/load_map.cpp | 4 ++- src/xml_tree.cpp | 1 + tests/data/good_maps/line_symbolizer.xml | 2 +- tests/python_tests/object_test.py | 4 +++ 8 files changed, 58 insertions(+), 6 deletions(-) diff --git a/bindings/python/mapnik_python.cpp b/bindings/python/mapnik_python.cpp index 38ae41305..c5da5938c 100644 --- a/bindings/python/mapnik_python.cpp +++ b/bindings/python/mapnik_python.cpp @@ -62,6 +62,7 @@ void export_polygon_pattern_symbolizer(); void export_raster_symbolizer(); void export_text_placement(); void export_shield_symbolizer(); +void export_debug_symbolizer(); void export_font_engine(); void export_projection(); void export_proj_transform(); @@ -463,6 +464,7 @@ BOOST_PYTHON_MODULE(_mapnik) export_raster_symbolizer(); export_text_placement(); export_shield_symbolizer(); + export_debug_symbolizer(); export_font_engine(); export_projection(); export_proj_transform(); diff --git a/include/mapnik/debug_symbolizer.hpp b/include/mapnik/debug_symbolizer.hpp index e9e5d3c2b..225b97c54 100644 --- a/include/mapnik/debug_symbolizer.hpp +++ b/include/mapnik/debug_symbolizer.hpp @@ -30,10 +30,25 @@ namespace mapnik { +enum debug_symbolizer_mode_enum { + DEBUG_SYM_MODE_COLLISION, + DEBUG_SYM_MODE_VERTEX, + debug_symbolizer_mode_enum_MAX +}; + +DEFINE_ENUM( debug_symbolizer_mode_e, debug_symbolizer_mode_enum ); + struct MAPNIK_DECL debug_symbolizer : public symbolizer_base { - debug_symbolizer() : symbolizer_base() {} + debug_symbolizer(); + debug_symbolizer(debug_symbolizer const& rhs); + debug_symbolizer_mode_e get_mode() const; + void set_mode(debug_symbolizer_mode_e mode); + +private: + debug_symbolizer_mode_e mode_; + }; } diff --git a/src/agg/process_debug_symbolizer.cpp b/src/agg/process_debug_symbolizer.cpp index 2bf8e276d..277f7fea6 100644 --- a/src/agg/process_debug_symbolizer.cpp +++ b/src/agg/process_debug_symbolizer.cpp @@ -52,10 +52,37 @@ void agg_renderer::process(debug_symbolizer const& sym, mapnik::feature_impl & feature, proj_transform const& prj_trans) { - label_collision_detector4::query_iterator itr = detector_->begin(), end = detector_->end(); - for (;itr!=end; itr++) + debug_symbolizer_mode_e mode = sym.get_mode(); + if (mode == DEBUG_SYM_MODE_COLLISION) { - draw_rect(pixmap_, itr->box); + label_collision_detector4::query_iterator itr = detector_->begin(), end = detector_->end(); + for (;itr!=end; itr++) + { + draw_rect(pixmap_, itr->box); + } + } + else if (mode == DEBUG_SYM_MODE_VERTEX) + { + for (unsigned i=0; i("mode", DEBUG_SYM_MODE_COLLISION); + symbol.set_mode(mode); rule.append(symbol); } diff --git a/src/xml_tree.cpp b/src/xml_tree.cpp index b9c15d407..53cea607e 100644 --- a/src/xml_tree.cpp +++ b/src/xml_tree.cpp @@ -405,6 +405,7 @@ compile_get_opt_attr(expression_ptr); compile_get_attr(std::string); compile_get_attr(filter_mode_e); compile_get_attr(point_placement_e); +compile_get_attr(debug_symbolizer_mode_e); compile_get_attr(marker_placement_e); compile_get_attr(marker_multi_policy_e); compile_get_attr(pattern_alignment_e); diff --git a/tests/data/good_maps/line_symbolizer.xml b/tests/data/good_maps/line_symbolizer.xml index d58791861..7a4944aea 100644 --- a/tests/data/good_maps/line_symbolizer.xml +++ b/tests/data/good_maps/line_symbolizer.xml @@ -6,7 +6,7 @@ - + diff --git a/tests/python_tests/object_test.py b/tests/python_tests/object_test.py index 0a83ddc95..c18d07e8a 100644 --- a/tests/python_tests/object_test.py +++ b/tests/python_tests/object_test.py @@ -14,6 +14,10 @@ def setup(): # from another directory we need to chdir() os.chdir(execution_path('.')) +def test_debug_symbolizer(): + s = mapnik.DebugSymbolizer() + eq_(s.mode,mapnik.debug_symbolizer_mode.collision) + def test_raster_symbolizer(): s = mapnik.RasterSymbolizer() eq_(s.comp_op,mapnik.CompositeOp.src_over) # note: mode is deprecated