+ clip geometries before applying any

transformations.
This commit is contained in:
Artem Pavlenko 2012-03-06 13:07:04 +00:00
parent 86ac497584
commit c12161bf19
18 changed files with 55 additions and 40 deletions

View file

@ -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);
};
}

View file

@ -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,

View file

@ -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_;
};

View file

@ -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);

View file

@ -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>

View file

@ -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);

View file

@ -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);
}
}
}

View file

@ -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)
{

View file

@ -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);

View file

@ -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())));

View file

@ -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)
{

View file

@ -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;

View file

@ -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())
{

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);