Factored out common fields from grid renderer.

This commit is contained in:
Matt Amos 2013-12-05 19:34:32 +00:00
parent ee018dc589
commit 4f871d1fc7
11 changed files with 60 additions and 78 deletions

View file

@ -35,6 +35,7 @@
#include <mapnik/ctrans.hpp> // for CoordTransform
#include <mapnik/image_compositing.hpp> // for composite_mode_e
#include <mapnik/pixel_position.hpp>
#include <mapnik/renderer_common.hpp>
// boost
@ -124,20 +125,13 @@ public:
}
inline double scale_factor() const
{
return scale_factor_;
return common_.scale_factor_;
}
private:
buffer_type & pixmap_;
unsigned width_;
unsigned height_;
double scale_factor_;
CoordTransform t_;
freetype_engine font_engine_;
face_manager<freetype_engine> font_manager_;
std::shared_ptr<label_collision_detector4> detector_;
const std::unique_ptr<grid_rasterizer> ras_ptr;
box2d<double> query_extent_;
renderer_common common_;
void setup(Map const& m);
};
}

View file

@ -58,16 +58,10 @@ template <typename T>
grid_renderer<T>::grid_renderer(Map const& m, T & pixmap, double scale_factor, unsigned offset_x, unsigned offset_y)
: feature_style_processor<grid_renderer>(m, scale_factor),
pixmap_(pixmap),
width_(pixmap_.width()),
height_(pixmap_.height()),
scale_factor_(scale_factor),
ras_ptr(new grid_rasterizer),
// NOTE: can change this to m dims instead of pixmap_ if render-time
// resolution support is dropped from grid_renderer python interface
t_(pixmap_.width(),pixmap_.height(),m.get_current_extent(),offset_x,offset_y),
font_engine_(),
font_manager_(font_engine_),
detector_(std::make_shared<label_collision_detector4>(box2d<double>(-m.buffer_size(), -m.buffer_size(), m.width() + m.buffer_size() ,m.height() + m.buffer_size()))),
ras_ptr(new grid_rasterizer)
common_(m, offset_x, offset_y, pixmap_.width(), pixmap_.height(), scale_factor)
{
setup(m);
}
@ -76,16 +70,10 @@ template <typename T>
grid_renderer<T>::grid_renderer(Map const& m, request const& req, T & pixmap, double scale_factor, unsigned offset_x, unsigned offset_y)
: feature_style_processor<grid_renderer>(m, scale_factor),
pixmap_(pixmap),
width_(pixmap_.width()),
height_(pixmap_.height()),
scale_factor_(scale_factor),
ras_ptr(new grid_rasterizer),
// NOTE: can change this to m dims instead of pixmap_ if render-time
// resolution support is dropped from grid_renderer python interface
t_(pixmap_.width(),pixmap_.height(),req.extent(),offset_x,offset_y),
font_engine_(),
font_manager_(font_engine_),
detector_(std::make_shared<label_collision_detector4>(box2d<double>(-req.buffer_size(), -req.buffer_size(), req.width() + req.buffer_size() ,req.height() + req.buffer_size()))),
ras_ptr(new grid_rasterizer)
common_(req, offset_x, offset_y, pixmap_.width(), pixmap_.height(), scale_factor)
{
setup(m);
}
@ -105,7 +93,7 @@ void grid_renderer<T>::start_map_processing(Map const& m)
{
MAPNIK_LOG_DEBUG(grid_renderer) << "grid_renderer: Start map processing bbox=" << m.get_current_extent();
ras_ptr->clip_box(0,0,width_,height_);
ras_ptr->clip_box(0,0,common_.width_,common_.height_);
}
template <typename T>
@ -123,13 +111,13 @@ void grid_renderer<T>::start_layer_processing(layer const& lay, box2d<double> co
if (lay.clear_label_cache())
{
detector_->clear();
common_.detector_->clear();
}
query_extent_ = query_extent;
common_.query_extent_ = query_extent;
boost::optional<box2d<double> > const& maximum_extent = lay.maximum_extent();
if (maximum_extent)
{
query_extent_.clip(*maximum_extent);
common_.query_extent_.clip(*maximum_extent);
}
}
@ -148,7 +136,7 @@ void grid_renderer<T>::render_marker(mapnik::feature_impl & feature, unsigned in
typedef agg::renderer_scanline_bin_solid<grid_renderer_base_type> renderer_type;
agg::scanline_bin sl;
grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
pixfmt_type pixf(buf);
grid_renderer_base_type renb(pixf);
@ -162,7 +150,7 @@ void grid_renderer<T>::render_marker(mapnik::feature_impl & feature, unsigned in
agg::trans_affine mtx = agg::trans_affine_translation(-c.x,-c.y);
// apply symbol transformation to get to map space
mtx *= tr;
mtx *= agg::trans_affine_scaling(scale_factor_*(1.0/step));
mtx *= agg::trans_affine_scaling(common_.scale_factor_*(1.0/step));
// render the marker at the center of the marker box
mtx.translate(pos.x, pos.y);
using namespace mapnik::svg;
@ -184,7 +172,7 @@ void grid_renderer<T>::render_marker(mapnik::feature_impl & feature, unsigned in
double height = data.height();
double cx = 0.5 * width;
double cy = 0.5 * height;
if (step == 1 && (std::fabs(1.0 - scale_factor_) < 0.001 && tr.is_identity()))
if (step == 1 && (std::fabs(1.0 - common_.scale_factor_) < 0.001 && tr.is_identity()))
{
// TODO - support opacity
pixmap_.set_rectangle(feature.id(), data,

View file

@ -56,7 +56,7 @@ void grid_renderer<T>::process(building_symbolizer const& sym,
typedef coord_transform<CoordTransform,geometry_type> path_type;
agg::scanline_bin sl;
grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
pixfmt_type pixf(buf);
grid_renderer_base_type renb(pixf);
@ -103,7 +103,7 @@ void grid_renderer<T>::process(building_symbolizer const& sym,
faces->line_to(std::get<2>(seg),std::get<3>(seg) + height);
faces->line_to(std::get<0>(seg),std::get<1>(seg) + height);
path_type faces_path (t_,*faces,prj_trans);
path_type faces_path (common_.t_,*faces,prj_trans);
ras_ptr->add_path(faces_path);
ren.color(color_type(feature.id()));
agg::render_scanlines(*ras_ptr, sl, ren);
@ -129,14 +129,14 @@ void grid_renderer<T>::process(building_symbolizer const& sym,
roof->line_to(x,y+height);
}
}
path_type path(t_,*frame,prj_trans);
path_type path(common_.t_,*frame,prj_trans);
agg::conv_stroke<path_type> stroke(path);
ras_ptr->add_path(stroke);
ren.color(color_type(feature.id()));
agg::render_scanlines(*ras_ptr, sl, ren);
ras_ptr->reset();
path_type roof_path (t_,*roof,prj_trans);
path_type roof_path (common_.t_,*roof,prj_trans);
ras_ptr->add_path(roof_path);
ren.color(color_type(feature.id()));
agg::render_scanlines(*ras_ptr, sl, ren);

View file

@ -76,7 +76,7 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
simplify_tag, smooth_tag, stroke_tag> conv_types;
agg::scanline_bin sl;
grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
pixfmt_type pixf(buf);
grid_renderer_base_type renb(pixf);
@ -90,16 +90,16 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) { evaluate_transform(tr, feature, *transform); }
box2d<double> clipping_extent = query_extent_;
box2d<double> clipping_extent = common_.query_extent_;
if (clip)
{
double padding = (double)(query_extent_.width()/pixmap_.width());
double padding = (double)(common_.query_extent_.width()/pixmap_.width());
double half_stroke = stroke_width/2.0;
if (half_stroke > 1)
padding *= half_stroke;
if (std::fabs(offset) > 0)
padding *= std::fabs(offset) * 1.2;
padding *= scale_factor_;
padding *= common_.scale_factor_;
clipping_extent.pad(padding);
}
@ -116,7 +116,7 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
vertex_converter<box2d<double>, grid_rasterizer, line_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(clipping_extent,*ras_ptr,line,t_,prj_trans,tr,scale_factor_);
converter(clipping_extent,*ras_ptr,line,common_.t_,prj_trans,tr,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset

View file

@ -57,7 +57,7 @@ void grid_renderer<T>::process(line_symbolizer const& sym,
simplify_tag, smooth_tag, dash_tag, stroke_tag> conv_types;
agg::scanline_bin sl;
grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
pixfmt_type pixf(buf);
grid_renderer_base_type renb(pixf);
@ -69,7 +69,7 @@ void grid_renderer<T>::process(line_symbolizer const& sym,
auto transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (transform) { evaluate_transform(tr, feature, *transform); }
box2d<double> clipping_extent = query_extent_;
box2d<double> clipping_extent = common_.query_extent_;
bool clip = get<value_bool>(sym, keys::clip, feature, true);
double width = get<value_double>(sym, keys::stroke_width, feature, 1.0);
@ -80,19 +80,19 @@ void grid_renderer<T>::process(line_symbolizer const& sym,
if (clip)
{
double padding = (double)(query_extent_.width()/pixmap_.width());
double padding = (double)(common_.query_extent_.width()/pixmap_.width());
double half_stroke = width/2.0;
if (half_stroke > 1)
padding *= half_stroke;
if (std::fabs(offset) > 0)
padding *= std::fabs(offset) * 1.2;
padding *= scale_factor_;
padding *= common_.scale_factor_;
clipping_extent.pad(padding);
}
vertex_converter<box2d<double>, grid_rasterizer, line_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(clipping_extent,*ras_ptr,sym,t_,prj_trans,tr,scale_factor_);
converter(clipping_extent,*ras_ptr,sym,common_.t_,prj_trans,tr,common_.scale_factor_);
if (clip) converter.set<clip_line_tag>(); // optional clip (default: true)
converter.set<transform_tag>(); // always transform
if (std::fabs(offset) > 0.0) converter.set<offset_transform_tag>(); // parallel offset

View file

@ -100,7 +100,7 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
auto geom_transform = get_optional<transform_type>(sym, keys::geometry_transform);
if (geom_transform) { evaluate_transform(geom_tr, feature, *geom_transform); }
agg::trans_affine tr = agg::trans_affine_scaling(scale_factor_*(1.0/pixmap_.get_resolution()));
agg::trans_affine tr = agg::trans_affine_scaling(common_.scale_factor_*(1.0/pixmap_.get_resolution()));
auto img_transform = get_optional<transform_type>(sym, keys::image_transform);
if ((*mark)->is_vector())
@ -140,20 +140,20 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
coord2d center = bbox.center();
agg::trans_affine_translation recenter(-center.x, -center.y);
agg::trans_affine marker_trans = recenter * tr;
buf_type render_buf(pixmap_.raw_data(), width_, height_, width_);
buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
dispatch_type rasterizer_dispatch(render_buf,
svg_renderer,
*ras_ptr,
bbox,
marker_trans,
sym,
*detector_,
scale_factor_,
*common_.detector_,
common_.scale_factor_,
feature,
pixmap_);
vertex_converter<box2d<double>, dispatch_type, markers_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(query_extent_, rasterizer_dispatch, sym,t_,prj_trans,tr,scale_factor_);
converter(common_.query_extent_, rasterizer_dispatch, sym,common_.t_,prj_trans,tr,common_.scale_factor_);
if (clip && feature.paths().size() > 0) // optional clip (default: true)
{
geometry_type::types type = feature.paths()[0].type();
@ -183,20 +183,20 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
svg_attribute_type attributes;
bool result = push_explicit_style( (*stock_vector_marker)->attributes(), attributes, sym);
svg_renderer_type svg_renderer(svg_path, result ? attributes : (*stock_vector_marker)->attributes());
buf_type render_buf(pixmap_.raw_data(), width_, height_, width_);
buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
dispatch_type rasterizer_dispatch(render_buf,
svg_renderer,
*ras_ptr,
bbox,
marker_trans,
sym,
*detector_,
scale_factor_,
*common_.detector_,
common_.scale_factor_,
feature,
pixmap_);
vertex_converter<box2d<double>, dispatch_type, markers_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(query_extent_, rasterizer_dispatch, sym,t_,prj_trans,tr,scale_factor_);
converter(common_.query_extent_, rasterizer_dispatch, sym,common_.t_,prj_trans,tr,common_.scale_factor_);
if (clip && feature.paths().size() > 0) // optional clip (default: true)
{
geometry_type::types type = feature.paths()[0].type();
@ -230,19 +230,19 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
renderer_type,
detector_type,
mapnik::grid > dispatch_type;
buf_type render_buf(pixmap_.raw_data(), width_, height_, width_);
buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
dispatch_type rasterizer_dispatch(render_buf,
*ras_ptr,
**marker,
marker_trans,
sym,
*detector_,
scale_factor_,
*common_.detector_,
common_.scale_factor_,
feature,
pixmap_);
vertex_converter<box2d<double>, dispatch_type, markers_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(query_extent_, rasterizer_dispatch, sym,t_,prj_trans,tr,scale_factor_);
converter(common_.query_extent_, rasterizer_dispatch, sym,common_.t_,prj_trans,tr,common_.scale_factor_);
if (clip && feature.paths().size() > 0) // optional clip (default: true)
{
geometry_type::types type = feature.paths()[0].type();

View file

@ -75,11 +75,11 @@ void grid_renderer<T>::process(point_symbolizer const& sym,
agg::trans_affine tr;
if (img_transform) { evaluate_transform(tr, feature, *img_transform); }
tr = agg::trans_affine_scaling(scale_factor_) * tr;
tr = agg::trans_affine_scaling(common_.scale_factor_) * tr;
agg::trans_affine_translation recenter(-center.x, -center.y);
agg::trans_affine recenter_tr = recenter * tr;
box2d<double> label_ext = bbox * recenter_tr * agg::trans_affine_scaling(scale_factor_) ;
box2d<double> label_ext = bbox * recenter_tr * agg::trans_affine_scaling(common_.scale_factor_) ;
for (std::size_t i=0; i<feature.num_geometries(); ++i)
{
@ -99,10 +99,10 @@ void grid_renderer<T>::process(point_symbolizer const& sym,
}
prj_trans.backward(x,y,z);
t_.forward(&x,&y);
common_.t_.forward(&x,&y);
label_ext.re_center(x,y);
if (allow_overlap ||
detector_->has_placement(label_ext))
common_.detector_->has_placement(label_ext))
{
render_marker(feature,
@ -114,7 +114,7 @@ void grid_renderer<T>::process(point_symbolizer const& sym,
comp_op);
if (!ignore_placement)
detector_->insert(label_ext);
common_.detector_->insert(label_ext);
}
}
}

View file

@ -77,7 +77,7 @@ void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
typedef boost::mpl::vector<clip_poly_tag,transform_tag,affine_transform_tag,smooth_tag> conv_types;
vertex_converter<box2d<double>, grid_rasterizer, polygon_pattern_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(query_extent_,*ras_ptr,sym,t_,prj_trans,tr,scale_factor_);
converter(common_.query_extent_,*ras_ptr,sym,common_.t_,prj_trans,tr,common_.scale_factor_);
if (prj_trans.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
@ -96,7 +96,7 @@ void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
typedef typename grid_renderer_base_type::pixfmt_type::color_type color_type;
typedef agg::renderer_scanline_bin_solid<grid_renderer_base_type> renderer_type;
grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
pixfmt_type pixf(buf);
grid_renderer_base_type renb(pixf);

View file

@ -64,7 +64,7 @@ void grid_renderer<T>::process(polygon_symbolizer const& sym,
typedef boost::mpl::vector<clip_poly_tag,transform_tag,affine_transform_tag,simplify_tag,smooth_tag> conv_types;
vertex_converter<box2d<double>, grid_rasterizer, polygon_symbolizer,
CoordTransform, proj_transform, agg::trans_affine, conv_types>
converter(query_extent_,*ras_ptr,sym,t_,prj_trans,tr,scale_factor_);
converter(common_.query_extent_,*ras_ptr,sym,common_.t_,prj_trans,tr,common_.scale_factor_);
if (prj_trans.equal() && clip) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
@ -81,7 +81,7 @@ void grid_renderer<T>::process(polygon_symbolizer const& sym,
}
}
grid_rendering_buffer buf(pixmap_.raw_data(), width_, height_, width_);
grid_rendering_buffer buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
pixfmt_type pixf(buf);
grid_renderer_base_type renb(pixf);

View file

@ -43,10 +43,10 @@ void grid_renderer<T>::process(shield_symbolizer const& sym,
{
text_symbolizer_helper helper(
sym, feature, prj_trans,
width_, height_,
scale_factor_,
t_, font_manager_, *detector_,
query_extent_);
common_.width_, common_.height_,
common_.scale_factor_,
common_.t_, common_.font_manager_, *common_.detector_,
common_.query_extent_);
bool placement_found = false;
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, src_over);
@ -54,7 +54,7 @@ void grid_renderer<T>::process(shield_symbolizer const& sym,
grid_text_renderer<T> ren(pixmap_,
comp_op,
scale_factor_);
common_.scale_factor_);
placements_list const& placements = helper.get();
value_integer feature_id = feature.id();

View file

@ -36,17 +36,17 @@ void grid_renderer<T>::process(text_symbolizer const& sym,
{
text_symbolizer_helper helper(
sym, feature, prj_trans,
width_, height_,
scale_factor_ * (1.0/pixmap_.get_resolution()),
t_, font_manager_, *detector_,
query_extent_);
common_.width_, common_.height_,
common_.scale_factor_ * (1.0/pixmap_.get_resolution()),
common_.t_, common_.font_manager_, *common_.detector_,
common_.query_extent_);
bool placement_found = false;
composite_mode_e comp_op = get<composite_mode_e>(sym, keys::comp_op, feature, src_over);
grid_text_renderer<T> ren(pixmap_,
comp_op,
scale_factor_);
common_.scale_factor_);
placements_list const& placements = helper.get();
value_integer feature_id = feature.id();