Beispiel #1
0
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_;
    }
}
Beispiel #2
0
void cairo_renderer<T>::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();
    }
}
Beispiel #3
0
void cairo_renderer<T>::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());
    }
}
Beispiel #4
0
    static boost::python::tuple
    getstate(const feature_type_style& s)
    {
        boost::python::list rule_list;

        rules::const_iterator it = s.get_rules().begin();
        rules::const_iterator end = s.get_rules().end();
        for (; it != end; ++it)
        {
            rule_list.append( *it );    
        }

        return boost::python::make_tuple(rule_list);
    }
Beispiel #5
0
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
}
Beispiel #6
0
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>::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);
        }
    }
Beispiel #8
0
 static void
 setstate (feature_type_style& s, boost::python::tuple state)
 {
     using namespace boost::python;
     if (len(state) != 1)
     {
         PyErr_SetObject(PyExc_ValueError,
                         ("expected 1-item tuple in call to __setstate__; got %s"
                          % state).ptr()
             );
         throw_error_already_set();
     }
     
     boost::python::list rules = extract<boost::python::list>(state[0]);
     for (int i=0; i<len(rules); ++i)
     {
         s.add_rule(extract<rule>(rules[i]));
     }
 }
Beispiel #9
0
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";
}
Beispiel #10
0
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_;
    }
}