void set_image_filters(feature_type_style & style, std::string const& filters) { std::vector<mapnik::filter::filter_type> new_filters; bool result = parse_image_filters(filters, new_filters); if (!result) { throw mapnik::value_error("failed to parse image-filters: '" + filters + "'"); } #ifdef _WINDOWS style.image_filters() = new_filters; // FIXME : https://svn.boost.org/trac/boost/ticket/2839 #else style.image_filters() = std::move(new_filters); #endif }
void agg_renderer<T>::end_style_processing(feature_type_style const& st) { if (style_level_compositing_) { bool blend_from = false; if (st.image_filters().size() > 0) { blend_from = true; mapnik::filter::filter_visitor<image_32> visitor(*current_buffer_); BOOST_FOREACH(mapnik::filter::filter_type const& filter_tag, st.image_filters()) { boost::apply_visitor(visitor, filter_tag); } } if (st.comp_op()) { composite(pixmap_.data(),current_buffer_->data(), *st.comp_op(), st.get_opacity(), 0, 0, false); //compositeTexture(styleTexture_, mainTexture_, static_cast<composite_mode_e>(*st.comp_op())); } else if (blend_from || st.get_opacity() < 1) { composite(pixmap_.data(),current_buffer_->data(), src_over, st.get_opacity(), 0, 0, false); } // apply any 'direct' image filters mapnik::filter::filter_visitor<image_32> visitor(pixmap_); BOOST_FOREACH(mapnik::filter::filter_type const& filter_tag, st.direct_image_filters()) { boost::apply_visitor(visitor, filter_tag); } }
std::string get_image_filters(feature_type_style & style) { std::string filters_str; std::back_insert_iterator<std::string> sink(filters_str); generate_image_filters(sink, style.image_filters()); return filters_str; }
void agg_renderer<T>::start_style_processing(feature_type_style const& st) { MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: Start processing style"; if (st.comp_op() || st.image_filters().size() > 0 || st.get_opacity() < 1) { style_level_compositing_ = true; } else { style_level_compositing_ = false; } if (style_level_compositing_) { if (!internal_buffer_) { internal_buffer_ = boost::make_shared<buffer_type>(pixmap_.width(),pixmap_.height()); } else { internal_buffer_->set_background(color(0,0,0,0)); // fill with transparent colour } current_buffer_ = internal_buffer_.get(); } else { current_buffer_ = &pixmap_; } }
void agg_renderer<T0,T1>::end_style_processing(feature_type_style const& st) { if (style_level_compositing_) { bool blend_from = false; if (st.image_filters().size() > 0) { blend_from = true; mapnik::filter::filter_visitor<image_32> visitor(*current_buffer_); for (mapnik::filter::filter_type const& filter_tag : st.image_filters()) { boost::apply_visitor(visitor, filter_tag); } } if (st.comp_op()) { composite(pixmap_.data(), current_buffer_->data(), *st.comp_op(), st.get_opacity(), -common_.t_.offset(), -common_.t_.offset(), false); } else if (blend_from || st.get_opacity() < 1.0) { composite(pixmap_.data(), current_buffer_->data(), src_over, st.get_opacity(), -common_.t_.offset(), -common_.t_.offset(), false); } } // apply any 'direct' image filters mapnik::filter::filter_visitor<image_32> visitor(pixmap_); for (mapnik::filter::filter_type const& filter_tag : st.direct_image_filters()) { boost::apply_visitor(visitor, filter_tag); } MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: End processing style"; }
void agg_renderer<T0,T1>::start_style_processing(feature_type_style const& st) { MAPNIK_LOG_DEBUG(agg_renderer) << "agg_renderer: Start processing style"; if (st.comp_op() || st.image_filters().size() > 0 || st.get_opacity() < 1) { style_level_compositing_ = true; } else { style_level_compositing_ = false; } if (style_level_compositing_) { if (st.image_filters_inflate()) { int radius = 0; mapnik::filter::filter_radius_visitor visitor(radius); for (mapnik::filter::filter_type const& filter_tag : st.image_filters()) { boost::apply_visitor(visitor, filter_tag); } if (radius > common_.t_.offset()) { common_.t_.set_offset(radius); } int offset = common_.t_.offset(); unsigned target_width = common_.width_ + (offset * 2); unsigned target_height = common_.height_ + (offset * 2); ras_ptr->clip_box(-int(offset*2),-int(offset*2),target_width,target_height); if (!internal_buffer_ || (internal_buffer_->width() < target_width || internal_buffer_->height() < target_height)) { internal_buffer_ = std::make_shared<buffer_type>(target_width,target_height); } else { internal_buffer_->set_background(color(0,0,0,0)); // fill with transparent colour } } else { if (!internal_buffer_) { internal_buffer_ = std::make_shared<buffer_type>(common_.width_,common_.height_); } else { internal_buffer_->set_background(color(0,0,0,0)); // fill with transparent colour } common_.t_.set_offset(0); ras_ptr->clip_box(0,0,common_.width_,common_.height_); } current_buffer_ = internal_buffer_.get(); } else { common_.t_.set_offset(0); ras_ptr->clip_box(0,0,common_.width_,common_.height_); current_buffer_ = &pixmap_; } }