From fad9af5263f10246cbc9091de6f2e8cb22f6a30e Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Thu, 25 Jul 2013 01:00:38 -0400 Subject: [PATCH] add support for applying custom comp_op and opacity when blending map background image into background color at render time - refs mapnik/mapnik-support#8 --- bindings/python/mapnik_map.cpp | 16 ++ include/mapnik/map.hpp | 28 +++- include/mapnik/symbolizer.hpp | 2 +- src/agg/agg_renderer.cpp | 6 +- src/deepcopy.cpp | 2 + src/load_map.cpp | 20 +++ src/map.cpp | 28 ++++ src/save_map.cpp | 13 ++ tests/python_tests/object_test.py | 3 + tests/visual_tests/data/pattern.png | Bin 0 -> 21447 bytes ...ompositing-512-512-1.0-grid-reference.json | 137 ++++++++++++++++++ ...-compositing-512-512-1.0-agg-reference.png | Bin 0 -> 81860 bytes ...ompositing-512-512-1.0-cairo-reference.png | Bin 0 -> 87213 bytes ...-compositing-512-512-2.0-agg-reference.png | Bin 0 -> 104855 bytes ...ompositing-512-512-2.0-cairo-reference.png | Bin 0 -> 112624 bytes .../map-background-image-compositing.xml | 54 +++++++ tests/visual_tests/test.py | 3 +- 17 files changed, 305 insertions(+), 7 deletions(-) create mode 100644 tests/visual_tests/data/pattern.png create mode 100644 tests/visual_tests/grids/map-background-image-compositing-512-512-1.0-grid-reference.json create mode 100644 tests/visual_tests/images/map-background-image-compositing-512-512-1.0-agg-reference.png create mode 100644 tests/visual_tests/images/map-background-image-compositing-512-512-1.0-cairo-reference.png create mode 100644 tests/visual_tests/images/map-background-image-compositing-512-512-2.0-agg-reference.png create mode 100644 tests/visual_tests/images/map-background-image-compositing-512-512-2.0-cairo-reference.png create mode 100644 tests/visual_tests/styles/map-background-image-compositing.xml diff --git a/bindings/python/mapnik_map.cpp b/bindings/python/mapnik_map.cpp index 37c4a50d8..cc580d17c 100644 --- a/bindings/python/mapnik_map.cpp +++ b/bindings/python/mapnik_map.cpp @@ -412,6 +412,22 @@ void export_map() ">>> m.background_image = '/path/to/image.png'\n" ) + .add_property("background_image_comp_op",&Map::background_image_comp_op, + &Map::set_background_image_comp_op, + "The background image compositing operation.\n" + "\n" + "Usage:\n" + ">>> m.background_image_comp_op = mapnik.CompositeOp.src_over\n" + ) + + .add_property("background_image_opacity",&Map::background_image_opacity, + &Map::set_background_image_opacity, + "The background image opacity.\n" + "\n" + "Usage:\n" + ">>> m.background_image_opacity = 1.0\n" + ) + .add_property("base", make_function(&Map::base_path,return_value_policy()), &Map::set_base_path, diff --git a/include/mapnik/map.hpp b/include/mapnik/map.hpp index fcf121832..850313cc4 100644 --- a/include/mapnik/map.hpp +++ b/include/mapnik/map.hpp @@ -25,15 +25,17 @@ // mapnik #include +#include #include #include #include // for featureset_ptr #include #include #include +#include // boost -#include +#include namespace mapnik { @@ -76,6 +78,8 @@ private: int buffer_size_; boost::optional background_; boost::optional background_image_; + composite_mode_e background_image_comp_op_; + float background_image_opacity_; std::map styles_; std::map fontsets_; std::vector layers_; @@ -286,10 +290,30 @@ public: */ boost::optional const& background_image() const; + /*! \brief Set the compositing operation uses to blend the background image into the background color. + * @param comp_op compositing operation. + */ + void set_background_image_comp_op(composite_mode_e comp_op); + + /*! \brief Get the map background image compositing operation + * @return Background image compositing operation as composite_mode_e + * object + */ + composite_mode_e background_image_comp_op() const; + + /*! \brief Set the map background image opacity. + * @param opacity Background image opacity. + */ + void set_background_image_opacity(float opacity); + + /*! \brief Get the map background image opacity + * @return opacity value as float + */ + float background_image_opacity() const; + /*! \brief Set buffer size * @param buffer_size Buffer size in pixels. */ - void set_buffer_size(int buffer_size); /*! \brief Get the map buffer size diff --git a/include/mapnik/symbolizer.hpp b/include/mapnik/symbolizer.hpp index ce9f9dbc8..3e9f58fd3 100644 --- a/include/mapnik/symbolizer.hpp +++ b/include/mapnik/symbolizer.hpp @@ -30,7 +30,7 @@ #include // boost -#include +#include // stl #include diff --git a/src/agg/agg_renderer.cpp b/src/agg/agg_renderer.cpp index 9f2b2e272..8bfd79c4a 100644 --- a/src/agg/agg_renderer.cpp +++ b/src/agg/agg_renderer.cpp @@ -162,13 +162,13 @@ void agg_renderer::setup(Map const &m) if ( w > 0 && h > 0) { // repeat background-image both vertically and horizontally - unsigned x_steps = unsigned(std::ceil(width_/double(w))); - unsigned y_steps = unsigned(std::ceil(height_/double(h))); + unsigned x_steps = static_cast(std::ceil(width_/double(w))); + unsigned y_steps = static_cast(std::ceil(height_/double(h))); for (unsigned x=0;x > max_extent = map_in.maximum_extent(); if (max_extent) diff --git a/src/load_map.cpp b/src/load_map.cpp index c7643e1ef..4546641ad 100644 --- a/src/load_map.cpp +++ b/src/load_map.cpp @@ -199,6 +199,26 @@ void map_parser::parse_map(Map & map, xml_node const& pt, std::string const& bas map.set_background_image(ensure_relative_to_xml(image_filename)); } + optional comp_op_name = map_node.get_opt_attr("background-image-comp-op"); + if (comp_op_name) + { + optional comp_op = comp_op_from_string(*comp_op_name); + if (comp_op) + { + map.set_background_image_comp_op(*comp_op); + } + else + { + throw config_error("failed to parse background-image-comp-op: '" + *comp_op_name + "'"); + } + } + + optional opacity = map_node.get_opt_attr("background-image-opacity"); + if (opacity) + { + map.set_background_image_opacity(*opacity); + } + std::string srs = map_node.get_attr("srs", map.srs()); try { diff --git a/src/map.cpp b/src/map.cpp index 618300159..3b6b4fcfa 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -67,6 +67,8 @@ Map::Map() height_(400), srs_(MAPNIK_LONGLAT_PROJ), buffer_size_(0), + background_image_comp_op_(src_over), + background_image_opacity_(1.0), aspectFixMode_(GROW_BBOX), base_path_("") {} @@ -75,6 +77,8 @@ Map::Map(int width,int height, std::string const& srs) height_(height), srs_(srs), buffer_size_(0), + background_image_comp_op_(src_over), + background_image_opacity_(1.0), aspectFixMode_(GROW_BBOX), base_path_("") {} @@ -85,6 +89,8 @@ Map::Map(Map const& rhs) buffer_size_(rhs.buffer_size_), background_(rhs.background_), background_image_(rhs.background_image_), + background_image_comp_op_(rhs.background_image_comp_op_), + background_image_opacity_(rhs.background_image_opacity_), styles_(rhs.styles_), fontsets_(rhs.fontsets_), layers_(rhs.layers_), @@ -105,6 +111,8 @@ Map& Map::operator=(Map const& rhs) buffer_size_ = rhs.buffer_size_; background_=rhs.background_; background_image_=rhs.background_image_; + background_image_comp_op_=rhs.background_image_comp_op_; + background_image_opacity_=rhs.background_image_opacity_; styles_=rhs.styles_; fontsets_ = rhs.fontsets_; layers_=rhs.layers_; @@ -320,6 +328,26 @@ void Map::set_background_image(std::string const& image_filename) background_image_ = image_filename; } +composite_mode_e Map::background_image_comp_op() const +{ + return background_image_comp_op_; +} + +void Map::set_background_image_comp_op(composite_mode_e comp_op) +{ + background_image_comp_op_ = comp_op; +} + +float Map::background_image_opacity() const +{ + return background_image_opacity_; +} + +void Map::set_background_image_opacity(float opacity) +{ + background_image_opacity_ = opacity; +} + void Map::set_maximum_extent(box2d const& box) { maximum_extent_.reset(box); diff --git a/src/save_map.cpp b/src/save_map.cpp index be74aa681..cc7a28679 100644 --- a/src/save_map.cpp +++ b/src/save_map.cpp @@ -826,6 +826,19 @@ void serialize_map(ptree & pt, Map const & map, bool explicit_defaults) set_attr( map_node, "background-image", *image_filename ); } + composite_mode_e comp_op = map.background_image_comp_op(); + if (comp_op != src_over || explicit_defaults) + { + set_attr(map_node, "background-image-comp-op", *comp_op_to_string(comp_op)); + } + + double opacity = map.background_image_opacity(); + if (opacity != 1.0 || explicit_defaults) + { + set_attr(map_node, "background-image-opacity", opacity); + } + + int buffer_size = map.buffer_size(); if ( buffer_size || explicit_defaults) { diff --git a/tests/python_tests/object_test.py b/tests/python_tests/object_test.py index 20ff5673c..1e327188a 100644 --- a/tests/python_tests/object_test.py +++ b/tests/python_tests/object_test.py @@ -335,6 +335,9 @@ def test_map_init(): eq_(m.srs, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs') eq_(m.base, '') eq_(m.maximum_extent, None) + eq_(m.background_image, None) + eq_(m.background_image_comp_op, mapnik.CompositeOp.src_over) + eq_(m.background_image_opacity, 1.0) m = mapnik.Map(256, 256, '+proj=latlong') eq_(m.srs, '+proj=latlong') diff --git a/tests/visual_tests/data/pattern.png b/tests/visual_tests/data/pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d977a0ea8c34fb52a9911ce841ed73f74e397b GIT binary patch literal 21447 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 + + + + + frame + + csv + +x,y +0,0 +5,0 +0,5 +5,5 + + + + + \ No newline at end of file diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py index bdce97563..8dea1f640 100755 --- a/tests/visual_tests/test.py +++ b/tests/visual_tests/test.py @@ -168,7 +168,8 @@ files = { 'style-level-compositing-tiled-1,0':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['1,0']}, 'style-level-compositing-tiled-0,1':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['0,1']}, 'style-level-compositing-tiled-1,1':{'sizes':[(512,512)],'bbox':merc_z1_bboxes['1,1']}, - 'marker-path-expression':{} + 'marker-path-expression':{}, + 'map-background-image-compositing':{'sizes':[(512,512)]} } class Reporting: