From 621a5e51acf0784b803cece4a536caf3eed403b2 Mon Sep 17 00:00:00 2001 From: Jiri Drbalek Date: Wed, 3 Aug 2016 12:53:24 +0000 Subject: [PATCH 1/2] style level comp-op and opacity for Cairo renderer --- include/mapnik/cairo/cairo_context.hpp | 4 ++++ include/mapnik/cairo/cairo_renderer.hpp | 1 + src/cairo/cairo_context.cpp | 18 ++++++++++++++ src/cairo/cairo_renderer.cpp | 31 +++++++++++++++++++++---- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/include/mapnik/cairo/cairo_context.hpp b/include/mapnik/cairo/cairo_context.hpp index 9733efbd6..c15f87cd7 100644 --- a/include/mapnik/cairo/cairo_context.hpp +++ b/include/mapnik/cairo/cairo_context.hpp @@ -308,6 +308,7 @@ public: void stroke(); void fill(); void paint(); + void paint(double opacity); void set_pattern(cairo_pattern const& pattern); void set_gradient(cairo_gradient const& pattern, box2d const& bbox); void add_image(double x, double y, image_rgba8 const& data, double opacity = 1.0); @@ -327,6 +328,9 @@ public: composite_mode_e halo_comp_op = src_over, double scale_factor = 1.0); + void push_group(); + void pop_group(); + template void add_path(T& path, unsigned start_index = 0) { diff --git a/include/mapnik/cairo/cairo_renderer.hpp b/include/mapnik/cairo/cairo_renderer.hpp index a39b4ed9e..0563149a6 100644 --- a/include/mapnik/cairo/cairo_renderer.hpp +++ b/include/mapnik/cairo/cairo_renderer.hpp @@ -177,6 +177,7 @@ protected: cairo_context context_; renderer_common common_; cairo_face_manager face_manager_; + bool style_level_compositing_; void setup(Map const& m); }; diff --git a/src/cairo/cairo_context.cpp b/src/cairo/cairo_context.cpp index c8ba13c8a..cb9216df4 100644 --- a/src/cairo/cairo_context.cpp +++ b/src/cairo/cairo_context.cpp @@ -304,6 +304,12 @@ void cairo_context::paint() check_object_status_and_throw_exception(*this); } +void cairo_context::paint(double opacity) +{ + cairo_paint_with_alpha(cairo_.get(), opacity); + check_object_status_and_throw_exception(*this); +} + void cairo_context::set_pattern(cairo_pattern const& pattern) { cairo_set_source(cairo_.get(), pattern.pattern()); @@ -489,6 +495,18 @@ void cairo_context::add_text(glyph_positions const& pos, } +void cairo_context::push_group() +{ + cairo_push_group(cairo_.get()); + check_object_status_and_throw_exception(*this); +} + +void cairo_context::pop_group() +{ + cairo_pop_group_to_source(cairo_.get()); + check_object_status_and_throw_exception(*this); +} + cairo_face_manager::cairo_face_manager(std::shared_ptr font_library) : font_library_(font_library) { diff --git a/src/cairo/cairo_renderer.cpp b/src/cairo/cairo_renderer.cpp index 83e1208b1..2f845a53a 100644 --- a/src/cairo/cairo_renderer.cpp +++ b/src/cairo/cairo_renderer.cpp @@ -36,6 +36,7 @@ #include #include #include +#include // agg #include "agg/include/agg_trans_affine.h" // for trans_affine, etc @@ -58,7 +59,8 @@ cairo_renderer::cairo_renderer(Map const& m, m_(m), context_(cairo), common_(m, attributes(), offset_x, offset_y, m.width(), m.height(), scale_factor), - face_manager_(common_.shared_font_library_) + face_manager_(common_.shared_font_library_), + style_level_compositing_(false) { setup(m); } @@ -75,7 +77,9 @@ cairo_renderer::cairo_renderer(Map const& m, m_(m), context_(cairo), common_(m, req, vars, offset_x, offset_y, req.width(), req.height(), scale_factor), - face_manager_(common_.shared_font_library_) + face_manager_(common_.shared_font_library_), + style_level_compositing_(false) + { setup(m); } @@ -91,7 +95,9 @@ cairo_renderer::cairo_renderer(Map const& m, m_(m), context_(cairo), common_(m, attributes(), offset_x, offset_y, m.width(), m.height(), scale_factor, detector), - face_manager_(common_.shared_font_library_) + face_manager_(common_.shared_font_library_), + style_level_compositing_(false) + { setup(m); } @@ -191,15 +197,30 @@ void cairo_renderer::end_layer_processing(layer const&) } template -void cairo_renderer::start_style_processing(feature_type_style const&) +void cairo_renderer::start_style_processing(feature_type_style const & st) { MAPNIK_LOG_DEBUG(cairo_renderer) << "cairo_renderer:start style processing"; + + style_level_compositing_ = st.comp_op() || st.get_opacity() < 1; + + if (style_level_compositing_) + { + context_.push_group(); + } } template -void cairo_renderer::end_style_processing(feature_type_style const&) +void cairo_renderer::end_style_processing(feature_type_style const & st) { MAPNIK_LOG_DEBUG(cairo_renderer) << "cairo_renderer:end style processing"; + + if (style_level_compositing_) + { + context_.pop_group(); + composite_mode_e comp_op = st.comp_op() ? *st.comp_op() : src_over; + context_.set_operator(comp_op); + context_.paint(st.get_opacity()); + } } struct cairo_render_marker_visitor From 9925c3d50d4ad39cf19043b665357da0c64ffd31 Mon Sep 17 00:00:00 2001 From: Jiri Drbalek Date: Wed, 3 Aug 2016 20:17:17 +0000 Subject: [PATCH 2/2] update visual test data --- test/data-visual | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/data-visual b/test/data-visual index 5f0e6f866..4a054f2ef 160000 --- a/test/data-visual +++ b/test/data-visual @@ -1 +1 @@ -Subproject commit 5f0e6f86696a2a9a6733e42b1f400ba4ec2f8847 +Subproject commit 4a054f2efe35a65aa5163f080304fb90ae9c6194