+ add clipping to polygon/line_pattern_syms

This commit is contained in:
Artem Pavlenko 2012-03-08 15:02:46 +00:00
parent 48b6d9899e
commit 500f344b34
4 changed files with 23 additions and 14 deletions

View file

@ -42,6 +42,7 @@
#include "agg_span_allocator.h"
#include "agg_span_pattern_rgba.h"
#include "agg_renderer_outline_image.h"
#include "agg_conv_clip_polyline.h"
namespace mapnik {
@ -50,7 +51,8 @@ void agg_renderer<T>::process(line_pattern_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_polyline<geometry_type> clipped_geometry_type;
typedef coord_transform2<CoordTransform,clipped_geometry_type> path_type;
typedef agg::line_image_pattern<agg::pattern_filter_bilinear_rgba8> pattern_type;
typedef agg::renderer_base<agg::pixfmt_rgba32_plain> renderer_base;
typedef agg::renderer_outline_image<renderer_base, pattern_type> renderer_type;
@ -74,6 +76,7 @@ void agg_renderer<T>::process(line_pattern_symbolizer const& sym,
if (!pat) return;
box2d<double> ext = query_extent_ * 1.1;
renderer_base ren_base(pixf);
agg::pattern_filter_bilinear_rgba8 filter;
pattern_source source(*(*pat));
@ -82,15 +85,17 @@ void agg_renderer<T>::process(line_pattern_symbolizer const& sym,
// TODO - should be sensitive to buffer size
ren.clip_box(0,0,width_,height_);
rasterizer_type ras(ren);
metawriter_with_properties writer = sym.get_metawriter();
//metawriter_with_properties writer = sym.get_metawriter();
for (unsigned i=0;i<feature->num_geometries();++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(ext.minx(),ext.miny(),ext.maxx(),ext.maxy());
path_type path(t_,clipped,prj_trans);
ras.add_path(path);
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

@ -123,7 +123,7 @@ void agg_renderer<T>::process(line_symbolizer const& sym,
ras_ptr->gamma(agg::gamma_power(stroke_.get_gamma()));
}
metawriter_with_properties writer = sym.get_metawriter();
//metawriter_with_properties writer = sym.get_metawriter();
for (unsigned i=0;i<feature->num_geometries();++i)
{
geometry_type & geom = feature->get_geometry(i);

View file

@ -38,8 +38,7 @@
#include "agg_span_allocator.h"
#include "agg_span_pattern_rgba.h"
#include "agg_image_accessors.h"
#include "agg_conv_clip_polygon.h"
namespace mapnik {
@ -48,7 +47,8 @@ void agg_renderer<T>::process(polygon_pattern_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::wrap_mode_repeat wrap_x_type;
typedef agg::wrap_mode_repeat wrap_y_type;
@ -133,9 +133,11 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
if (align == LOCAL_ALIGNMENT)
{
double x0=0,y0=0;
if (num_geometries>0)
if (num_geometries>0) // FIXME: hmm...?
{
path_type path(t_,feature->get_geometry(0),prj_trans);
clipped_geometry_type clipped(feature->get_geometry(0));
clipped.clip_box(query_extent_.minx(),query_extent_.miny(),query_extent_.maxx(),query_extent_.maxy());
path_type path(t_,clipped,prj_trans);
path.vertex(&x0,&y0);
}
offset_x = unsigned(width_-x0);
@ -144,15 +146,17 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
span_gen_type sg(img_src, offset_x, offset_y);
renderer_type rp(renb,sa, sg);
metawriter_with_properties writer = sym.get_metawriter();
//metawriter_with_properties writer = sym.get_metawriter();
for (unsigned i=0;i<num_geometries;++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(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);
}
}
agg::render_scanlines(*ras_ptr, sl, rp);

View file

@ -86,7 +86,7 @@ void agg_renderer<T>::process(polygon_symbolizer const& sym,
ras_ptr->gamma(agg::gamma_power(sym.get_gamma()));
}
metawriter_with_properties writer = sym.get_metawriter();
//metawriter_with_properties writer = sym.get_metawriter();
for (unsigned i=0;i<feature->num_geometries();++i)
{
geometry_type & geom=feature->get_geometry(i);