Support markers in group symbolizer.
This commit is contained in:
parent
bfb8d80e37
commit
16b1b5a77c
6 changed files with 286 additions and 11 deletions
|
@ -26,6 +26,7 @@
|
|||
// mapnik
|
||||
#include <mapnik/pixel_position.hpp>
|
||||
#include <mapnik/marker_cache.hpp>
|
||||
#include <mapnik/marker_helpers.hpp>
|
||||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/feature_factory.hpp>
|
||||
#include <mapnik/renderer_common.hpp>
|
||||
|
@ -39,6 +40,9 @@
|
|||
#include <mapnik/util/variant.hpp>
|
||||
#include <mapnik/label_collision_detector.hpp>
|
||||
#include <mapnik/noncopyable.hpp>
|
||||
#include <mapnik/svg/svg_path_adapter.hpp>
|
||||
#include <mapnik/svg/svg_path_attributes.hpp>
|
||||
#include <mapnik/graphics.hpp>
|
||||
|
||||
// agg
|
||||
#include <agg_trans_affine.h>
|
||||
|
@ -49,9 +53,11 @@ class proj_transform;
|
|||
struct glyph_info;
|
||||
class text_symbolizer_helper;
|
||||
|
||||
using svg::svg_path_adapter;
|
||||
using svg_attribute_type = agg::pod_bvector<svg::path_attributes>;
|
||||
|
||||
struct virtual_renderer_common : private mapnik::noncopyable
|
||||
{
|
||||
|
||||
virtual_renderer_common(renderer_common & common) :
|
||||
width_(common.width_),
|
||||
height_(common.height_),
|
||||
|
@ -110,6 +116,38 @@ struct point_render_thunk
|
|||
composite_mode_e comp_op);
|
||||
};
|
||||
|
||||
struct vector_marker_render_thunk
|
||||
{
|
||||
svg_path_ptr src_;
|
||||
svg_attribute_type attrs_;
|
||||
agg::trans_affine tr_;
|
||||
double opacity_;
|
||||
composite_mode_e comp_op_;
|
||||
bool snap_to_pixels_;
|
||||
|
||||
vector_marker_render_thunk(svg_path_ptr const& src,
|
||||
svg_attribute_type const& attrs,
|
||||
agg::trans_affine const& marker_trans,
|
||||
double opacity,
|
||||
composite_mode_e comp_op,
|
||||
bool snap_to_pixels);
|
||||
};
|
||||
|
||||
struct raster_marker_render_thunk
|
||||
{
|
||||
image_data_32 & src_;
|
||||
agg::trans_affine tr_;
|
||||
double opacity_;
|
||||
composite_mode_e comp_op_;
|
||||
bool snap_to_pixels_;
|
||||
|
||||
raster_marker_render_thunk(image_data_32 & src,
|
||||
agg::trans_affine const& marker_trans,
|
||||
double opacity,
|
||||
composite_mode_e comp_op,
|
||||
bool snap_to_pixels);
|
||||
};
|
||||
|
||||
struct text_render_thunk
|
||||
{
|
||||
// need to keep these around, annoyingly, as the glyph_position
|
||||
|
@ -121,7 +159,7 @@ struct text_render_thunk
|
|||
composite_mode_e comp_op_;
|
||||
halo_rasterizer_enum halo_rasterizer_;
|
||||
|
||||
text_render_thunk(placements_list const& placements,
|
||||
text_render_thunk(placements_list const& placements,
|
||||
double opacity, composite_mode_e comp_op,
|
||||
halo_rasterizer_enum halo_rasterizer);
|
||||
};
|
||||
|
@ -130,6 +168,8 @@ struct text_render_thunk
|
|||
// via a static visitor later.
|
||||
|
||||
using render_thunk = util::variant<point_render_thunk,
|
||||
vector_marker_render_thunk,
|
||||
raster_marker_render_thunk,
|
||||
text_render_thunk>;
|
||||
using render_thunk_ptr = std::shared_ptr<render_thunk>;
|
||||
using render_thunk_list = std::list<render_thunk_ptr>;
|
||||
|
@ -152,6 +192,8 @@ struct render_thunk_extractor : public util::static_visitor<>
|
|||
|
||||
void operator()(point_symbolizer const& sym) const;
|
||||
|
||||
void operator()(markers_symbolizer const& sym) const;
|
||||
|
||||
void operator()(text_symbolizer const& sym) const;
|
||||
|
||||
void operator()(shield_symbolizer const& sym) const;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <mapnik/feature.hpp>
|
||||
#include <mapnik/agg_renderer.hpp>
|
||||
#include <mapnik/agg_rasterizer.hpp>
|
||||
#include <mapnik/agg_render_marker.hpp>
|
||||
#include <mapnik/image_util.hpp>
|
||||
#include <mapnik/util/variant.hpp>
|
||||
#include <mapnik/text/renderer.hpp>
|
||||
|
@ -32,6 +33,10 @@
|
|||
#include <mapnik/pixel_position.hpp>
|
||||
#include <mapnik/renderer_common/process_group_symbolizer.hpp>
|
||||
#include <mapnik/renderer_common/clipping_extent.hpp>
|
||||
#include <mapnik/svg/svg_renderer_agg.hpp>
|
||||
#include <mapnik/svg/svg_path_attributes.hpp>
|
||||
#include <mapnik/svg/svg_path_adapter.hpp>
|
||||
#include <mapnik/svg/svg_converter.hpp>
|
||||
// agg
|
||||
#include "agg_trans_affine.h"
|
||||
|
||||
|
@ -50,10 +55,11 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
using text_renderer_type = agg_text_renderer<buffer_type>;
|
||||
|
||||
thunk_renderer(renderer_type &ren,
|
||||
std::unique_ptr<rasterizer> const& ras_ptr,
|
||||
buffer_type *buf,
|
||||
renderer_common &common,
|
||||
pixel_position const &offset)
|
||||
: ren_(ren), buf_(buf), common_(common), offset_(offset)
|
||||
: ren_(ren), ras_ptr_(ras_ptr), buf_(buf), common_(common), offset_(offset)
|
||||
{}
|
||||
|
||||
void operator()(point_render_thunk const &thunk) const
|
||||
|
@ -63,6 +69,50 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
thunk.comp_op_);
|
||||
}
|
||||
|
||||
void operator()(vector_marker_render_thunk const &thunk) const
|
||||
{
|
||||
using blender_type = agg::comp_op_adaptor_rgba_pre<agg::rgba8, agg::order_rgba>; // comp blender
|
||||
using buf_type = agg::rendering_buffer;
|
||||
using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, buf_type>;
|
||||
using renderer_base = agg::renderer_base<pixfmt_comp_type>;
|
||||
using renderer_type = agg::renderer_scanline_aa_solid<renderer_base>;
|
||||
using svg_attribute_type = agg::pod_bvector<svg::path_attributes>;
|
||||
using svg_renderer_type = svg::svg_renderer_agg<svg_path_adapter,
|
||||
svg_attribute_type,
|
||||
renderer_type,
|
||||
pixfmt_comp_type>;
|
||||
ras_ptr_->reset();
|
||||
buf_type render_buffer(buf_->raw_data(), buf_->width(), buf_->height(), buf_->width() * 4);
|
||||
pixfmt_comp_type pixf(render_buffer);
|
||||
pixf.comp_op(static_cast<agg::comp_op_e>(thunk.comp_op_));
|
||||
renderer_base renb(pixf);
|
||||
svg::vertex_stl_adapter<svg::svg_path_storage> stl_storage(thunk.src_->source());
|
||||
svg_path_adapter svg_path(stl_storage);
|
||||
svg_renderer_type svg_renderer(svg_path, thunk.attrs_);
|
||||
|
||||
agg::trans_affine offset_tr = thunk.tr_;
|
||||
offset_tr.translate(offset_.x, offset_.y);
|
||||
render_vector_marker(svg_renderer, *ras_ptr_, renb, thunk.src_->bounding_box(), offset_tr, thunk.opacity_, thunk.snap_to_pixels_);
|
||||
}
|
||||
|
||||
void operator()(raster_marker_render_thunk const &thunk) const
|
||||
{
|
||||
using blender_type = agg::comp_op_adaptor_rgba_pre<agg::rgba8, agg::order_rgba>; // comp blender
|
||||
using buf_type = agg::rendering_buffer;
|
||||
using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, buf_type>;
|
||||
using renderer_base = agg::renderer_base<pixfmt_comp_type>;
|
||||
|
||||
ras_ptr_->reset();
|
||||
buf_type render_buffer(buf_->raw_data(), buf_->width(), buf_->height(), buf_->width() * 4);
|
||||
pixfmt_comp_type pixf(render_buffer);
|
||||
pixf.comp_op(static_cast<agg::comp_op_e>(thunk.comp_op_));
|
||||
renderer_base renb(pixf);
|
||||
|
||||
agg::trans_affine offset_tr = thunk.tr_;
|
||||
offset_tr.translate(offset_.x, offset_.y);
|
||||
render_raster_marker(renb, *ras_ptr_, thunk.src_, offset_tr, thunk.opacity_, common_.scale_factor_, thunk.snap_to_pixels_);
|
||||
}
|
||||
|
||||
void operator()(text_render_thunk const &thunk) const
|
||||
{
|
||||
text_renderer_type ren(*buf_, thunk.halo_rasterizer_, thunk.comp_op_, thunk.comp_op_,
|
||||
|
@ -92,6 +142,7 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
|
||||
private:
|
||||
renderer_type &ren_;
|
||||
std::unique_ptr<rasterizer> const& ras_ptr_;
|
||||
buffer_type *buf_;
|
||||
renderer_common &common_;
|
||||
pixel_position offset_;
|
||||
|
@ -106,7 +157,7 @@ void agg_renderer<T0,T1>::process(group_symbolizer const& sym,
|
|||
sym, feature, common_.vars_, prj_trans, clipping_extent(common_), common_,
|
||||
[&](render_thunk_list const& thunks, pixel_position const& render_offset)
|
||||
{
|
||||
thunk_renderer ren(*this, current_buffer_, common_, render_offset);
|
||||
thunk_renderer ren(*this, ras_ptr, current_buffer_, common_, render_offset);
|
||||
for (render_thunk_ptr const& thunk : thunks)
|
||||
{
|
||||
util::apply_visitor(ren, *thunk);
|
||||
|
|
|
@ -23,8 +23,11 @@
|
|||
#if defined(HAVE_CAIRO)
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/marker.hpp>
|
||||
#include <mapnik/svg/svg_path_adapter.hpp>
|
||||
#include <mapnik/make_unique.hpp>
|
||||
#include <mapnik/cairo/cairo_renderer.hpp>
|
||||
#include <mapnik/cairo/cairo_render_vector.hpp>
|
||||
|
||||
// mapnik symbolizer generics
|
||||
#include <mapnik/renderer_common/process_group_symbolizer.hpp>
|
||||
|
@ -63,6 +66,34 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
thunk.comp_op_);
|
||||
}
|
||||
|
||||
void operator()(vector_marker_render_thunk const &thunk) const
|
||||
{
|
||||
cairo_save_restore guard(context_);
|
||||
context_.set_operator(thunk.comp_op_);
|
||||
|
||||
svg::vertex_stl_adapter<svg::svg_path_storage> stl_storage(thunk.src_->source());
|
||||
svg::svg_path_adapter svg_path(stl_storage);
|
||||
|
||||
agg::trans_affine offset_tr = thunk.tr_;
|
||||
offset_tr.translate(offset_.x, offset_.y);
|
||||
mapnik::render_vector_marker(context_,
|
||||
svg_path,
|
||||
thunk.attrs_,
|
||||
thunk.src_->bounding_box(),
|
||||
offset_tr,
|
||||
thunk.opacity_);
|
||||
}
|
||||
|
||||
void operator()(raster_marker_render_thunk const &thunk) const
|
||||
{
|
||||
cairo_save_restore guard(context_);
|
||||
context_.set_operator(thunk.comp_op_);
|
||||
|
||||
agg::trans_affine offset_tr = thunk.tr_;
|
||||
offset_tr.translate(offset_.x, offset_.y);
|
||||
context_.add_image(offset_tr, thunk.src_, thunk.opacity_);
|
||||
}
|
||||
|
||||
void operator()(text_render_thunk const &thunk) const
|
||||
{
|
||||
cairo_save_restore guard(context_);
|
||||
|
|
|
@ -26,10 +26,15 @@
|
|||
#include <mapnik/grid/grid_renderer.hpp>
|
||||
#include <mapnik/grid/grid_renderer_base.hpp>
|
||||
#include <mapnik/grid/grid.hpp>
|
||||
#include <mapnik/grid/grid_render_marker.hpp>
|
||||
#include <mapnik/attribute_collector.hpp>
|
||||
#include <mapnik/text/placement_finder.hpp>
|
||||
#include <mapnik/text/symbolizer_helpers.hpp>
|
||||
#include <mapnik/text/renderer.hpp>
|
||||
#include <mapnik/svg/svg_renderer_agg.hpp>
|
||||
#include <mapnik/svg/svg_storage.hpp>
|
||||
#include <mapnik/svg/svg_path_adapter.hpp>
|
||||
#include <mapnik/svg/svg_path_attributes.hpp>
|
||||
#include <mapnik/group/group_layout_manager.hpp>
|
||||
#include <mapnik/group/group_symbolizer_helper.hpp>
|
||||
#include <mapnik/util/variant.hpp>
|
||||
|
@ -60,12 +65,13 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
using text_renderer_type = grid_text_renderer<buffer_type>;
|
||||
|
||||
thunk_renderer(renderer_type &ren,
|
||||
grid_rasterizer &ras,
|
||||
buffer_type &pixmap,
|
||||
renderer_common &common,
|
||||
feature_impl &feature,
|
||||
pixel_position const &offset)
|
||||
: ren_(ren), pixmap_(pixmap), common_(common),
|
||||
feature_(feature), offset_(offset)
|
||||
: ren_(ren), ras_(ras), pixmap_(pixmap),
|
||||
common_(common), feature_(feature), offset_(offset)
|
||||
{}
|
||||
|
||||
void operator()(point_render_thunk const &thunk) const
|
||||
|
@ -74,6 +80,51 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
*thunk.marker_, thunk.tr_, thunk.opacity_, thunk.comp_op_);
|
||||
}
|
||||
|
||||
void operator()(vector_marker_render_thunk const &thunk) const
|
||||
{
|
||||
using buf_type = grid_rendering_buffer;
|
||||
using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
|
||||
using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
|
||||
|
||||
using namespace mapnik::svg;
|
||||
using svg_attribute_type = agg::pod_bvector<path_attributes>;
|
||||
using svg_renderer_type = svg_renderer_agg<svg_path_adapter,
|
||||
svg_attribute_type,
|
||||
renderer_type,
|
||||
pixfmt_type>;
|
||||
|
||||
buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
|
||||
ras_.reset();
|
||||
pixfmt_type pixf(render_buf);
|
||||
grid_renderer_base_type renb(pixf);
|
||||
renderer_type ren(renb);
|
||||
vertex_stl_adapter<svg_path_storage> stl_storage(thunk.src_->source());
|
||||
svg_path_adapter svg_path(stl_storage);
|
||||
svg_renderer_type svg_renderer(svg_path, thunk.attrs_);
|
||||
agg::trans_affine offset_tr = thunk.tr_;
|
||||
offset_tr.translate(offset_.x, offset_.y);
|
||||
//render_vector_marker(svg_renderer, *ras_ptr_, renb, thunk.src_->bounding_box(), offset_tr, thunk.opacity_, thunk.snap_to_pixels_);
|
||||
agg::scanline_bin sl;
|
||||
svg_renderer.render_id(ras_, sl, renb, feature_.id(), offset_tr, thunk.opacity_, thunk.src_->bounding_box());
|
||||
pixmap_.add_feature(feature_);
|
||||
}
|
||||
|
||||
void operator()(raster_marker_render_thunk const &thunk) const
|
||||
{
|
||||
using buf_type = grid_rendering_buffer;
|
||||
using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
|
||||
using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
|
||||
buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
|
||||
ras_.reset();
|
||||
pixfmt_type pixf(render_buf);
|
||||
grid_renderer_base_type renb(pixf);
|
||||
renderer_type ren(renb);
|
||||
agg::trans_affine offset_tr = thunk.tr_;
|
||||
offset_tr.translate(offset_.x, offset_.y);
|
||||
render_raster_marker(ren, ras_, thunk.src_, feature_, offset_tr, thunk.opacity_);
|
||||
pixmap_.add_feature(feature_);
|
||||
}
|
||||
|
||||
void operator()(text_render_thunk const &thunk) const
|
||||
{
|
||||
text_renderer_type ren(pixmap_, thunk.comp_op_, common_.scale_factor_);
|
||||
|
@ -94,6 +145,7 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
}
|
||||
ren.render(*glyphs, feature_id);
|
||||
});
|
||||
pixmap_.add_feature(feature_);
|
||||
}
|
||||
|
||||
template <typename T1>
|
||||
|
@ -104,6 +156,7 @@ struct thunk_renderer : public util::static_visitor<>
|
|||
|
||||
private:
|
||||
renderer_type &ren_;
|
||||
grid_rasterizer & ras_;
|
||||
buffer_type &pixmap_;
|
||||
renderer_common &common_;
|
||||
feature_impl &feature_;
|
||||
|
@ -119,7 +172,7 @@ void grid_renderer<T>::process(group_symbolizer const& sym,
|
|||
sym, feature, common_.vars_, prj_trans, common_.query_extent_, common_,
|
||||
[&](render_thunk_list const& thunks, pixel_position const& render_offset)
|
||||
{
|
||||
thunk_renderer<T> ren(*this, pixmap_, common_, feature, render_offset);
|
||||
thunk_renderer<T> ren(*this, *ras_ptr, pixmap_, common_, feature, render_offset);
|
||||
for (render_thunk_ptr const& thunk : thunks)
|
||||
{
|
||||
util::apply_visitor(ren, *thunk);
|
||||
|
|
|
@ -105,7 +105,7 @@ struct vector_markers_rasterizer_dispatch : public vector_markers_dispatch<Detec
|
|||
attributes const& vars,
|
||||
bool snap_to_pixels,
|
||||
RendererContext const& renderer_context)
|
||||
: vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars, snap_to_pixels),
|
||||
: vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
|
||||
buf_(std::get<0>(renderer_context)),
|
||||
pixf_(buf_),
|
||||
renb_(pixf_),
|
||||
|
@ -154,8 +154,7 @@ struct raster_markers_rasterizer_dispatch : public raster_markers_dispatch<Detec
|
|||
mapnik::feature_impl & feature,
|
||||
attributes const& vars,
|
||||
RendererContext const& renderer_context)
|
||||
: raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor,
|
||||
feature, vars, false),
|
||||
: raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
|
||||
buf_(std::get<0>(renderer_context)),
|
||||
pixf_(buf_),
|
||||
renb_(pixf_),
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
// mapnik
|
||||
#include <mapnik/renderer_common/process_group_symbolizer.hpp>
|
||||
#include <mapnik/renderer_common/process_point_symbolizer.hpp>
|
||||
#include <mapnik/renderer_common/process_markers_symbolizer.hpp>
|
||||
#include <mapnik/text/glyph_info.hpp>
|
||||
|
||||
namespace mapnik {
|
||||
|
@ -34,6 +35,24 @@ point_render_thunk::point_render_thunk(pixel_position const& pos, marker const&
|
|||
tr_(tr), opacity_(opacity), comp_op_(comp_op)
|
||||
{}
|
||||
|
||||
vector_marker_render_thunk::vector_marker_render_thunk(svg_path_ptr const& src,
|
||||
svg_attribute_type const& attrs,
|
||||
agg::trans_affine const& marker_trans,
|
||||
double opacity,
|
||||
composite_mode_e comp_op,
|
||||
bool snap_to_pixels)
|
||||
: src_(src), attrs_(attrs), tr_(marker_trans), opacity_(opacity),
|
||||
comp_op_(comp_op), snap_to_pixels_(snap_to_pixels)
|
||||
{}
|
||||
|
||||
raster_marker_render_thunk::raster_marker_render_thunk(image_data_32 & src,
|
||||
agg::trans_affine const& marker_trans,
|
||||
double opacity,
|
||||
composite_mode_e comp_op,
|
||||
bool snap_to_pixels)
|
||||
: src_(src), tr_(marker_trans), opacity_(opacity), comp_op_(comp_op),
|
||||
snap_to_pixels_(snap_to_pixels)
|
||||
{}
|
||||
|
||||
text_render_thunk::text_render_thunk(placements_list const& placements,
|
||||
double opacity, composite_mode_e comp_op,
|
||||
|
@ -72,6 +91,74 @@ text_render_thunk::text_render_thunk(placements_list const& placements,
|
|||
}
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename Detector, typename RendererContext>
|
||||
struct vector_marker_thunk_dispatch : public vector_markers_dispatch<Detector>
|
||||
{
|
||||
vector_marker_thunk_dispatch(svg_path_ptr const& src,
|
||||
svg_path_adapter & path,
|
||||
svg_attribute_type const& attrs,
|
||||
agg::trans_affine const& marker_trans,
|
||||
symbolizer_base const& sym,
|
||||
Detector & detector,
|
||||
double scale_factor,
|
||||
feature_impl & feature,
|
||||
attributes const& vars,
|
||||
bool snap_to_pixels,
|
||||
RendererContext const& renderer_context)
|
||||
: vector_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
|
||||
attrs_(attrs), comp_op_(get<composite_mode_e>(sym, keys::comp_op, feature, vars, src_over)),
|
||||
snap_to_pixels_(snap_to_pixels), thunks_(std::get<0>(renderer_context))
|
||||
{}
|
||||
|
||||
~vector_marker_thunk_dispatch() {}
|
||||
|
||||
void render_marker(agg::trans_affine const& marker_tr, double opacity)
|
||||
{
|
||||
vector_marker_render_thunk thunk(this->src_, this->attrs_, marker_tr, opacity, comp_op_, snap_to_pixels_);
|
||||
thunks_.push_back(std::make_shared<render_thunk>(std::move(thunk)));
|
||||
}
|
||||
|
||||
private:
|
||||
svg_attribute_type const& attrs_;
|
||||
composite_mode_e comp_op_;
|
||||
bool snap_to_pixels_;
|
||||
render_thunk_list & thunks_;
|
||||
};
|
||||
|
||||
template <typename Detector, typename RendererContext>
|
||||
struct raster_marker_thunk_dispatch : public raster_markers_dispatch<Detector>
|
||||
{
|
||||
raster_marker_thunk_dispatch(image_data_32 & src,
|
||||
agg::trans_affine const& marker_trans,
|
||||
symbolizer_base const& sym,
|
||||
Detector & detector,
|
||||
double scale_factor,
|
||||
feature_impl & feature,
|
||||
attributes const& vars,
|
||||
RendererContext const& renderer_context,
|
||||
bool snap_to_pixels = false)
|
||||
: raster_markers_dispatch<Detector>(src, marker_trans, sym, detector, scale_factor, feature, vars),
|
||||
comp_op_(get<composite_mode_e>(sym, keys::comp_op, feature, vars, src_over)),
|
||||
snap_to_pixels_(snap_to_pixels), thunks_(std::get<0>(renderer_context))
|
||||
{}
|
||||
|
||||
~raster_marker_thunk_dispatch() {}
|
||||
|
||||
void render_marker(agg::trans_affine const& marker_tr, double opacity)
|
||||
{
|
||||
raster_marker_render_thunk thunk(this->src_, marker_tr, opacity, comp_op_, snap_to_pixels_);
|
||||
thunks_.push_back(std::make_shared<render_thunk>(std::move(thunk)));
|
||||
}
|
||||
|
||||
private:
|
||||
composite_mode_e comp_op_;
|
||||
bool snap_to_pixels_;
|
||||
render_thunk_list & thunks_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
render_thunk_extractor::render_thunk_extractor(box2d<double> & box,
|
||||
render_thunk_list & thunks,
|
||||
|
@ -99,6 +186,19 @@ void render_thunk_extractor::operator()(point_symbolizer const& sym) const
|
|||
update_box();
|
||||
}
|
||||
|
||||
void render_thunk_extractor::operator()(markers_symbolizer const& sym) const
|
||||
{
|
||||
auto renderer_context = std::tie(thunks_);
|
||||
using context_type = decltype(renderer_context);
|
||||
using vector_dispatch_type = detail::vector_marker_thunk_dispatch<label_collision_detector4, context_type>;
|
||||
using raster_dispatch_type = detail::raster_marker_thunk_dispatch<label_collision_detector4, context_type>;
|
||||
|
||||
render_markers_symbolizer<vector_dispatch_type, raster_dispatch_type>(
|
||||
sym, feature_, prj_trans_, common_, clipping_extent_, renderer_context);
|
||||
|
||||
update_box();
|
||||
}
|
||||
|
||||
void render_thunk_extractor::operator()(text_symbolizer const& sym) const
|
||||
{
|
||||
box2d<double> clip_box = clipping_extent_;
|
||||
|
@ -157,7 +257,6 @@ void render_thunk_extractor::update_box() const
|
|||
detector.clear();
|
||||
}
|
||||
|
||||
|
||||
geometry_type *origin_point(proj_transform const& prj_trans,
|
||||
renderer_common const& common)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue