+ clip geometries before applying any
transformations.
This commit is contained in:
parent
86ac497584
commit
c12161bf19
18 changed files with 55 additions and 40 deletions
|
@ -67,7 +67,7 @@ public:
|
|||
~agg_renderer();
|
||||
void start_map_processing(Map const& map);
|
||||
void end_map_processing(Map const& map);
|
||||
void start_layer_processing(layer const& lay);
|
||||
void start_layer_processing(layer const& lay, box2d<double> const& query_extent);
|
||||
void end_layer_processing(layer const& lay);
|
||||
void render_marker(pixel_position const& pos, marker const& marker, agg::trans_affine const& tr, double opacity);
|
||||
|
||||
|
@ -123,7 +123,7 @@ private:
|
|||
face_manager<freetype_engine> font_manager_;
|
||||
boost::shared_ptr<label_collision_detector4> detector_;
|
||||
boost::scoped_ptr<rasterizer> ras_ptr;
|
||||
|
||||
box2d<double> query_extent_;
|
||||
void setup(Map const &m);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ protected:
|
|||
public:
|
||||
~cairo_renderer_base();
|
||||
void start_map_processing(Map const& map);
|
||||
void start_layer_processing(layer const& lay);
|
||||
void start_layer_processing(layer const& lay, box2d<double> const& query_extent);
|
||||
void end_layer_processing(layer const& lay);
|
||||
void process(point_symbolizer const& sym,
|
||||
mapnik::feature_ptr const& feature,
|
||||
|
|
|
@ -72,16 +72,16 @@ template <typename Transform, typename Geometry>
|
|||
struct MAPNIK_DECL coord_transform2
|
||||
{
|
||||
typedef std::size_t size_type;
|
||||
typedef typename Geometry::value_type value_type;
|
||||
//typedef typename Geometry::value_type value_type;
|
||||
|
||||
coord_transform2(Transform const& t,
|
||||
Geometry const& geom,
|
||||
Geometry & geom,
|
||||
proj_transform const& prj_trans)
|
||||
: t_(t),
|
||||
geom_(geom),
|
||||
prj_trans_(prj_trans) {}
|
||||
|
||||
unsigned vertex(double *x, double *y) const
|
||||
unsigned vertex(double *x, double *y)
|
||||
{
|
||||
unsigned command = SEG_MOVETO;
|
||||
bool ok = false;
|
||||
|
@ -115,7 +115,7 @@ struct MAPNIK_DECL coord_transform2
|
|||
|
||||
private:
|
||||
Transform const& t_;
|
||||
Geometry const& geom_;
|
||||
Geometry & geom_;
|
||||
proj_transform const& prj_trans_;
|
||||
};
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ public:
|
|||
~grid_renderer();
|
||||
void start_map_processing(Map const& map);
|
||||
void end_map_processing(Map const& map);
|
||||
void start_layer_processing(layer const& lay);
|
||||
void start_layer_processing(layer const& lay, box2d<double> const& query_extent);
|
||||
void end_layer_processing(layer const& lay);
|
||||
void render_marker(mapnik::feature_ptr const& feature, unsigned int step, pixel_position const& pos, marker const& marker, const agg::trans_affine & tr, double opacity);
|
||||
|
||||
|
|
|
@ -201,16 +201,18 @@ void agg_renderer<T>::end_map_processing(Map const& )
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
void agg_renderer<T>::start_layer_processing(layer const& lay)
|
||||
void agg_renderer<T>::start_layer_processing(layer const& lay, box2d<double> const& query_extent)
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "start layer processing : " << lay.name() << "\n";
|
||||
std::clog << "datasource = " << lay.datasource().get() << "\n";
|
||||
std::clog << "query_extent = " << query_extent << "\n";
|
||||
#endif
|
||||
if (lay.clear_label_cache())
|
||||
{
|
||||
detector_->clear();
|
||||
}
|
||||
query_extent_ = query_extent;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
|
|
@ -85,7 +85,7 @@ void agg_renderer<T>::process(line_pattern_symbolizer const& sym,
|
|||
metawriter_with_properties writer = sym.get_metawriter();
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#include "agg_conv_dash.h"
|
||||
#include "agg_renderer_outline_aa.h"
|
||||
#include "agg_rasterizer_outline_aa.h"
|
||||
|
||||
#include "agg_conv_clip_polyline.h"
|
||||
|
||||
// stl
|
||||
#include <string>
|
||||
|
@ -51,7 +51,8 @@ void agg_renderer<T>::process(line_symbolizer const& sym,
|
|||
proj_transform const& prj_trans)
|
||||
{
|
||||
typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
|
||||
typedef coord_transform2<CoordTransform,geometry_type> path_type;
|
||||
typedef agg::conv_clip_polyline<geometry_type> clipped_geometry_type;
|
||||
typedef coord_transform2<CoordTransform,clipped_geometry_type> path_type;
|
||||
|
||||
stroke const& stroke_ = sym.get_stroke();
|
||||
color const& col = stroke_.get_color();
|
||||
|
@ -81,10 +82,12 @@ void agg_renderer<T>::process(line_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
clipped_geometry_type clipped(geom);
|
||||
clipped.clip_box(query_extent_.minx(),query_extent_.miny(),query_extent_.maxx(),query_extent_.maxy());
|
||||
path_type path(t_,clipped,prj_trans);
|
||||
ras.add_path(path);
|
||||
}
|
||||
}
|
||||
|
@ -122,10 +125,12 @@ void agg_renderer<T>::process(line_symbolizer const& sym,
|
|||
metawriter_with_properties writer = sym.get_metawriter();
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
clipped_geometry_type clipped(geom);
|
||||
clipped.clip_box(query_extent_.minx(),query_extent_.miny(),query_extent_.maxx(),query_extent_.maxy());
|
||||
path_type path(t_,clipped,prj_trans);
|
||||
|
||||
if (stroke_.has_dash())
|
||||
{
|
||||
|
@ -188,7 +193,7 @@ void agg_renderer<T>::process(line_symbolizer const& sym,
|
|||
stroke.generator().miter_limit(4.0);
|
||||
stroke.generator().width(stroke_.get_width() * scale_factor_);
|
||||
ras_ptr->add_path(stroke);
|
||||
if (writer.first) writer.first->add_line(path, *feature, t_, writer.second);
|
||||
//if (writer.first) writer.first->add_line(path, *feature, t_, writer.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -104,7 +104,7 @@ void agg_renderer<T>::process(markers_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0; i<feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
// TODO - merge this code with point_symbolizer rendering
|
||||
if (placement_method == MARKER_POINT_PLACEMENT || geom.num_points() <= 1)
|
||||
{
|
||||
|
@ -206,7 +206,7 @@ void agg_renderer<T>::process(markers_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0; i<feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
//if (geom.num_points() <= 1) continue;
|
||||
if (placement_method == MARKER_POINT_PLACEMENT || geom.num_points() <= 1)
|
||||
{
|
||||
|
|
|
@ -147,7 +147,7 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
|
|||
metawriter_with_properties writer = sym.get_metawriter();
|
||||
for (unsigned i=0;i<num_geometries;++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 2)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "agg_scanline_u.h"
|
||||
// for polygon_symbolizer
|
||||
#include "agg_renderer_scanline.h"
|
||||
|
||||
#include "agg_conv_clip_polygon.h"
|
||||
// stl
|
||||
#include <string>
|
||||
|
||||
|
@ -45,7 +45,8 @@ void agg_renderer<T>::process(polygon_symbolizer const& sym,
|
|||
mapnik::feature_ptr const& feature,
|
||||
proj_transform const& prj_trans)
|
||||
{
|
||||
typedef coord_transform2<CoordTransform,geometry_type> path_type;
|
||||
typedef agg::conv_clip_polygon<geometry_type> clipped_geometry_type;
|
||||
typedef coord_transform2<CoordTransform,clipped_geometry_type> path_type;
|
||||
typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
|
||||
typedef agg::renderer_scanline_aa_solid<ren_base> renderer;
|
||||
|
||||
|
@ -60,7 +61,7 @@ void agg_renderer<T>::process(polygon_symbolizer const& sym,
|
|||
unsigned g=fill_.green();
|
||||
unsigned b=fill_.blue();
|
||||
unsigned a=fill_.alpha();
|
||||
renb.clip_box(0,0,width_,height_);
|
||||
//renb.clip_box(0,0,width_,height_);
|
||||
renderer ren(renb);
|
||||
|
||||
ras_ptr->reset();
|
||||
|
@ -88,12 +89,15 @@ void agg_renderer<T>::process(polygon_symbolizer const& sym,
|
|||
metawriter_with_properties writer = sym.get_metawriter();
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom=feature->get_geometry(i);
|
||||
geometry_type & geom=feature->get_geometry(i);
|
||||
if (geom.num_points() > 2)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
clipped_geometry_type clipped(geom);
|
||||
//clipped.clip_box(4211605.95493,7504793.67543,4212017.83704,7505169.29792);
|
||||
clipped.clip_box(query_extent_.minx(),query_extent_.miny(),query_extent_.maxx(),query_extent_.maxy());
|
||||
path_type path(t_,clipped,prj_trans);
|
||||
ras_ptr->add_path(path);
|
||||
if (writer.first) writer.first->add_polygon(path, *feature, t_, writer.second);
|
||||
//if (writer.first) writer.first->add_polygon(path, *feature, t_, writer.second);
|
||||
}
|
||||
}
|
||||
ren.color(agg::rgba8(r, g, b, int(a * sym.get_opacity())));
|
||||
|
|
|
@ -696,11 +696,12 @@ void cairo_renderer_base::start_map_processing(Map const& map)
|
|||
context_->show_page();
|
||||
}
|
||||
|
||||
void cairo_renderer_base::start_layer_processing(layer const& lay)
|
||||
void cairo_renderer_base::start_layer_processing(layer const& lay, box2d<double> const& query_extent)
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "start layer processing : " << lay.name() << "\n";
|
||||
std::clog << "datasource = " << lay.datasource().get() << "\n";
|
||||
std::clog << "query_extent = " << query_extent << "\n";
|
||||
#endif
|
||||
if (lay.clear_label_cache())
|
||||
{
|
||||
|
@ -727,7 +728,7 @@ void cairo_renderer_base::start_map_processing(Map const& map)
|
|||
|
||||
for (unsigned i = 0; i < feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
|
||||
if (geom.num_points() > 2)
|
||||
{
|
||||
|
@ -862,7 +863,7 @@ void cairo_renderer_base::start_map_processing(Map const& map)
|
|||
|
||||
for (unsigned i = 0; i < feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
|
@ -1093,7 +1094,7 @@ void cairo_renderer_base::start_map_processing(Map const& map)
|
|||
|
||||
for (unsigned i = 0; i < feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
|
@ -1159,7 +1160,7 @@ void cairo_renderer_base::start_map_processing(Map const& map)
|
|||
|
||||
for (unsigned i = 0; i < feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
|
||||
if (geom.num_points() > 2)
|
||||
{
|
||||
|
@ -1229,7 +1230,7 @@ void cairo_renderer_base::start_map_processing(Map const& map)
|
|||
|
||||
for (unsigned i = 0; i < feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
|
|
|
@ -203,7 +203,7 @@ void feature_style_processor<Processor>::apply_to_layer(layer const& lay, Proces
|
|||
return;
|
||||
}
|
||||
|
||||
p.start_layer_processing(lay);
|
||||
|
||||
|
||||
#if defined(RENDERING_STATS)
|
||||
progress_timer layer_timer(std::clog, "rendering total for layer: '" + lay.name() + "'");
|
||||
|
@ -269,6 +269,8 @@ void feature_style_processor<Processor>::apply_to_layer(layer const& lay, Proces
|
|||
|
||||
query q(layer_ext,res,scale_denom,unbuffered_extent);
|
||||
|
||||
p.start_layer_processing(lay, query_ext);
|
||||
|
||||
std::vector<feature_type_style*> active_styles;
|
||||
attribute_collector collector(names);
|
||||
double filt_factor = 1;
|
||||
|
|
|
@ -97,11 +97,12 @@ void grid_renderer<T>::end_map_processing(Map const& )
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
void grid_renderer<T>::start_layer_processing(layer const& lay)
|
||||
void grid_renderer<T>::start_layer_processing(layer const& lay, box2d<double> const& query_extent)
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog << "start layer processing : " << lay.name() << "\n";
|
||||
std::clog << "datasource = " << lay.datasource().get() << "\n";
|
||||
std::clog << "query_extent = " << query_extent << "\n";
|
||||
#endif
|
||||
if (lay.clear_label_cache())
|
||||
{
|
||||
|
|
|
@ -64,7 +64,7 @@ void grid_renderer<T>::process(line_pattern_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
|
|
|
@ -63,7 +63,7 @@ void grid_renderer<T>::process(line_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 1)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
|
|
|
@ -104,7 +104,7 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
|
|||
bool placed = false;
|
||||
for (unsigned i=0; i<feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() <= 1)
|
||||
{
|
||||
std::clog << "### Warning svg markers not supported yet for points within markers_symbolizer\n";
|
||||
|
@ -181,7 +181,7 @@ void grid_renderer<T>::process(markers_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0; i<feature->num_geometries(); ++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (placement_method == MARKER_POINT_PLACEMENT || geom.num_points() <= 1)
|
||||
{
|
||||
geom.label_position(&x,&y);
|
||||
|
|
|
@ -60,7 +60,7 @@ void grid_renderer<T>::process(polygon_pattern_symbolizer const& sym,
|
|||
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 2)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
|
|
|
@ -59,7 +59,7 @@ void grid_renderer<T>::process(polygon_symbolizer const& sym,
|
|||
ras_ptr->reset();
|
||||
for (unsigned i=0;i<feature->num_geometries();++i)
|
||||
{
|
||||
geometry_type const& geom = feature->get_geometry(i);
|
||||
geometry_type & geom = feature->get_geometry(i);
|
||||
if (geom.num_points() > 2)
|
||||
{
|
||||
path_type path(t_,geom,prj_trans);
|
||||
|
|
Loading…
Add table
Reference in a new issue