From a4cdc7a1c0939677ff02e3cb4a15cc1afdbd427f Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Mon, 23 Apr 2012 15:41:18 +0100 Subject: [PATCH] + make comp_op boost::optional<> + use plain pixf when style_level_compositing=true --- include/mapnik/agg_helpers.hpp | 13 +++------- include/mapnik/agg_renderer.hpp | 7 +----- include/mapnik/feature_type_style.hpp | 6 +++-- include/mapnik/symbolizer.hpp | 8 +++--- src/agg/agg_renderer.cpp | 30 +++++++++++++---------- src/agg/process_line_symbolizer.cpp | 34 ++++++++++++++------------ src/agg/process_polygon_symbolizer.cpp | 30 ++++++++++++++--------- src/feature_type_style.cpp | 3 +-- src/symbolizer.cpp | 2 +- 9 files changed, 70 insertions(+), 63 deletions(-) diff --git a/include/mapnik/agg_helpers.hpp b/include/mapnik/agg_helpers.hpp index 004d07955..f02eea19a 100644 --- a/include/mapnik/agg_helpers.hpp +++ b/include/mapnik/agg_helpers.hpp @@ -95,7 +95,7 @@ void set_join_caps(Stroke const& stroke_, PathType & stroke) template -struct renderer_ : private boost::noncopyable +struct renderer_scanline_solid : private boost::noncopyable { typedef PixelFormat pixfmt_type; typedef typename pixfmt_type::color_type color_type; @@ -104,7 +104,7 @@ struct renderer_ : private boost::noncopyable typedef agg::renderer_scanline_aa_solid renderer; typedef agg::scanline_u8 scanline_type; - renderer_() + renderer_scanline_solid() : renb_(), ren_(renb_) {} @@ -124,19 +124,14 @@ struct renderer_ : private boost::noncopyable void render(Rasterizer & ras) { agg::render_scanlines(ras, sl_, ren_); - sl_. reset_spans(); + sl_.reset_spans(); } - + scanline_type sl_; ren_base renb_; renderer ren_; }; -struct aa_renderer : renderer_ -{ - typedef agg::pixfmt_rgba32 pixel_format_type; -}; - } #endif //MAPNIK_AGG_HELPERS_HPP diff --git a/include/mapnik/agg_renderer.hpp b/include/mapnik/agg_renderer.hpp index b6c33d2c3..259b11f5a 100644 --- a/include/mapnik/agg_renderer.hpp +++ b/include/mapnik/agg_renderer.hpp @@ -48,7 +48,6 @@ namespace mapnik { class marker; struct rasterizer; -struct aa_renderer; template class MAPNIK_DECL agg_renderer : public feature_style_processor >, @@ -122,7 +121,7 @@ private: buffer_type & pixmap_; boost::shared_ptr internal_buffer_; mutable buffer_type * current_buffer_; - + mutable bool style_level_compositing_; unsigned width_; unsigned height_; double scale_factor_; @@ -132,11 +131,7 @@ private: boost::shared_ptr detector_; boost::scoped_ptr ras_ptr; box2d query_extent_; - void setup(Map const &m); - - void set_current_buffer(bool per_layer = false); - }; } diff --git a/include/mapnik/feature_type_style.hpp b/include/mapnik/feature_type_style.hpp index 05b76214d..151588459 100644 --- a/include/mapnik/feature_type_style.hpp +++ b/include/mapnik/feature_type_style.hpp @@ -29,6 +29,8 @@ #include #include +// boost +#include // stl #include @@ -54,7 +56,7 @@ private: // image_filters std::vector filters_; // comp-op - composite_mode_e comp_op_; + boost::optional comp_op_; // The rule_ptrs vectors are only valid for the scale_denom_validity_. double scale_denom_validity_; rule_ptrs if_rules_; @@ -84,7 +86,7 @@ public: std::vector & image_filters(); // compositing void set_comp_op(composite_mode_e comp_op); - composite_mode_e comp_op() const; + boost::optional comp_op() const; ~feature_type_style() {} diff --git a/include/mapnik/symbolizer.hpp b/include/mapnik/symbolizer.hpp index 53c4b9f01..c5b6d4480 100644 --- a/include/mapnik/symbolizer.hpp +++ b/include/mapnik/symbolizer.hpp @@ -31,6 +31,7 @@ // boost #include +#include namespace mapnik { @@ -46,8 +47,7 @@ public: : properties_(), properties_complete_(), writer_name_(), - writer_ptr_(), - comp_op_(clear) + writer_ptr_() { affine_transform_[0] = 1.0; affine_transform_[1] = 0.0; @@ -96,7 +96,7 @@ public: std::string const& get_metawriter_name() const { return writer_name_; } void set_comp_op(composite_mode_e comp_op); - composite_mode_e comp_op() const; + boost::optional comp_op() const; void set_transform(transform_type const& ); transform_type const& get_transform() const; std::string get_transform_string() const; @@ -105,7 +105,7 @@ private: metawriter_properties properties_complete_; std::string writer_name_; metawriter_ptr writer_ptr_; - composite_mode_e comp_op_; + boost::optional comp_op_; transform_type affine_transform_; }; diff --git a/src/agg/agg_renderer.cpp b/src/agg/agg_renderer.cpp index b39baab15..8a71c0720 100644 --- a/src/agg/agg_renderer.cpp +++ b/src/agg/agg_renderer.cpp @@ -89,6 +89,7 @@ agg_renderer::agg_renderer(Map const& m, T & pixmap, double scale_factor, uns pixmap_(pixmap), internal_buffer_(), current_buffer_(&pixmap), + style_level_compositing_(false), width_(pixmap_.width()), height_(pixmap_.height()), scale_factor_(scale_factor), @@ -108,6 +109,7 @@ agg_renderer::agg_renderer(Map const& m, T & pixmap, boost::shared_ptr void agg_renderer::end_map_processing(Map const& ) { agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); - aa_renderer::pixel_format_type pixf(buf); + agg::pixfmt_rgba32 pixf(buf); pixf.demultiply(); #ifdef MAPNIK_DEBUG std::clog << "end map processing\n"; @@ -211,12 +213,15 @@ void agg_renderer::start_style_processing(feature_type_style const& st) #ifdef MAPNIK_DEBUG std::clog << "start style processing\n"; #endif - if (st.comp_op() != clear || st.image_filters().size() > 0) + if (st.comp_op()) style_level_compositing_ = true; + else style_level_compositing_ = false; + + if (style_level_compositing_ || st.image_filters().size() > 0) { if (!internal_buffer_) - internal_buffer_ = boost::make_shared(pixmap_.width(),pixmap_.height()); + internal_buffer_ = boost::make_shared(pixmap_.width(),pixmap_.height()); else - internal_buffer_->set_background(color(0,0,0,0)); // transparent + internal_buffer_->set_background(color(0,0,0,0)); // fill with transparent colour current_buffer_ = internal_buffer_.get(); } else @@ -228,10 +233,10 @@ void agg_renderer::start_style_processing(feature_type_style const& st) template void agg_renderer::end_style_processing(feature_type_style const& st) { - bool blend = false; + bool blend_from = false; if (st.image_filters().size() > 0) { - blend = true; + blend_from = true; mapnik::filter::filter_visitor visitor(*current_buffer_); BOOST_FOREACH(mapnik::filter::filter_type filter_tag, st.image_filters()) { @@ -239,11 +244,11 @@ void agg_renderer::end_style_processing(feature_type_style const& st) } } - if (st.comp_op() != clear) // compositing FIXME: add 'none' to comp-op enum + if (st.comp_op()) { - composite(pixmap_.data(),current_buffer_->data(), st.comp_op(),false,false); + composite(pixmap_.data(),current_buffer_->data(), *st.comp_op(),false,false); } - else if (blend) + else if (blend_from) { agg::rendering_buffer in(current_buffer_->raw_data(), current_buffer_->width(), current_buffer_->height(), current_buffer_->width() * 4); @@ -251,10 +256,9 @@ void agg_renderer::end_style_processing(feature_type_style const& st) agg::rendering_buffer out(pixmap_.raw_data(), pixmap_.width(), pixmap_.height(), pixmap_.width() * 4); - agg::pixfmt_rgba32 pixf_in(in); - agg::pixfmt_rgba32 pixf_out(out); - agg::renderer_base ren(pixf_out); - ren.blend_from(pixf_in,0,0,0,255); + agg::pixfmt_rgba32_plain pixf_in(in); + agg::pixfmt_rgba32_plain pixf_out(out); + pixf_out.blend_from(pixf_in,0,0,0,0,0,255); } #ifdef MAPNIK_DEBUG std::clog << "end style processing\n"; diff --git a/src/agg/process_line_symbolizer.cpp b/src/agg/process_line_symbolizer.cpp index 2ccfda967..b8bf77d0b 100644 --- a/src/agg/process_line_symbolizer.cpp +++ b/src/agg/process_line_symbolizer.cpp @@ -62,8 +62,7 @@ void agg_renderer::process(line_symbolizer const& sym, agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); - //agg::pixfmt_rgba32 pixf(buf); - aa_renderer::pixel_format_type pixf(buf); + box2d ext = query_extent_ * 1.1; if (sym.get_rasterizer() == RASTERIZER_FAST) @@ -103,9 +102,6 @@ void agg_renderer::process(line_symbolizer const& sym, { ras_ptr->reset(); set_gamma_method(stroke_, ras_ptr); - aa_renderer ren; - ren.attach(pixf); - //metawriter_with_properties writer = sym.get_metawriter(); typedef boost::mpl::vector conv_types; vertex_converter,rasterizer,line_symbolizer, proj_transform, CoordTransform,conv_types> @@ -129,16 +125,8 @@ void agg_renderer::process(line_symbolizer const& sym, agg::rendering_buffer buf(current_buffer_->raw_data(),width_,height_, width_ * 4); - if (sym.comp_op() == clear) + if (sym.comp_op()) { - aa_renderer::pixfmt_type pixf(buf); - aa_renderer ren; - ren.attach(pixf); - ren.color(agg::rgba8(r, g, b, int(a * stroke_.get_opacity()))); - ren.render(*ras_ptr); - } - else - { typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; typedef agg::pixel32_type pixel_type; @@ -147,13 +135,29 @@ void agg_renderer::process(line_symbolizer const& sym, typedef agg::renderer_base renderer_base; typedef agg::renderer_scanline_aa_solid renderer_type; pixfmt_comp_type pixf(buf); - pixf.comp_op(static_cast(sym.comp_op())); + pixf.comp_op(static_cast(*sym.comp_op())); renderer_base renb(pixf); renderer_type ren(renb); ren.color(agg::rgba8(r, g, b, int(a * stroke_.get_opacity()))); agg::scanline_u8 sl; agg::render_scanlines(*ras_ptr, sl, ren); } + else if (style_level_compositing_) + { + agg::pixfmt_rgba32_plain pixf(buf); + renderer_scanline_solid ren; + ren.attach(pixf); + ren.color(agg::rgba8(r, g, b, int(a * stroke_.get_opacity()))); + ren.render(*ras_ptr); + } + else + { + agg::pixfmt_rgba32 pixf(buf); + renderer_scanline_solid ren; + ren.attach(pixf); + ren.color(agg::rgba8(r, g, b, int(a * stroke_.get_opacity()))); + ren.render(*ras_ptr); + } } } diff --git a/src/agg/process_polygon_symbolizer.cpp b/src/agg/process_polygon_symbolizer.cpp index 88a7b5de5..05ecbcbb9 100644 --- a/src/agg/process_polygon_symbolizer.cpp +++ b/src/agg/process_polygon_symbolizer.cpp @@ -75,16 +75,8 @@ void agg_renderer::process(polygon_symbolizer const& sym, unsigned b=fill.blue(); unsigned a=fill.alpha(); - if (sym.comp_op() == clear) + if (sym.comp_op()) { - aa_renderer::pixfmt_type pixf(buf); - aa_renderer ren; - ren.attach(pixf); - ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity()))); - ren.render(*ras_ptr); - } - else - { typedef agg::rgba8 color_type; typedef agg::order_rgba order_type; typedef agg::pixel32_type pixel_type; @@ -93,14 +85,30 @@ void agg_renderer::process(polygon_symbolizer const& sym, typedef agg::renderer_base renderer_base; typedef agg::renderer_scanline_aa_solid renderer_type; pixfmt_comp_type pixf(buf); - pixf.comp_op(static_cast(sym.comp_op())); + pixf.comp_op(static_cast(*sym.comp_op())); renderer_base renb(pixf); renderer_type ren(renb); ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity()))); agg::scanline_u8 sl; agg::render_scanlines(*ras_ptr, sl, ren); } - + else if (style_level_compositing_) + { + // use plain pixel format + agg::pixfmt_rgba32_plain pixf(buf); + renderer_scanline_solid ren; + ren.attach(pixf); + ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity()))); + ren.render(*ras_ptr); + } + else + { + agg::pixfmt_rgba32 pixf(buf); + renderer_scanline_solid ren; + ren.attach(pixf); + ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity()))); + ren.render(*ras_ptr); + } } template void agg_renderer::process(polygon_symbolizer const&, diff --git a/src/feature_type_style.cpp b/src/feature_type_style.cpp index c1711335e..540f7cc47 100644 --- a/src/feature_type_style.cpp +++ b/src/feature_type_style.cpp @@ -37,7 +37,6 @@ IMPLEMENT_ENUM( filter_mode_e, filter_mode_strings ) feature_type_style::feature_type_style() : filter_mode_(FILTER_ALL), filters_(), - comp_op_(clear), scale_denom_validity_(-1) {} @@ -109,7 +108,7 @@ void feature_type_style::set_comp_op(composite_mode_e comp_op) comp_op_ = comp_op; } -composite_mode_e feature_type_style::comp_op() const +boost::optional feature_type_style::comp_op() const { return comp_op_; } diff --git a/src/symbolizer.cpp b/src/symbolizer.cpp index bc5eaa8c1..e5e8f712c 100644 --- a/src/symbolizer.cpp +++ b/src/symbolizer.cpp @@ -75,7 +75,7 @@ void symbolizer_base::set_comp_op(composite_mode_e comp_op) comp_op_ = comp_op; } -composite_mode_e symbolizer_base::comp_op() const +boost::optional symbolizer_base::comp_op() const { return comp_op_; }