+ move 'clip' property to symbolizer_base

+ support 'clip' accross relevant symbolizer (agg)
This commit is contained in:
Artem Pavlenko 2012-04-24 11:10:54 +01:00
parent eb16d2867f
commit c26ad5706e
9 changed files with 45 additions and 46 deletions

View file

@ -46,8 +46,6 @@ struct MAPNIK_DECL polygon_symbolizer : public symbolizer_base
gamma_method_e get_gamma_method() const;
void set_smooth(double smooth);
double smooth() const;
void set_clip(bool clip);
bool clip() const;
private:
color fill_;
double opacity_;

View file

@ -47,7 +47,8 @@ public:
: properties_(),
properties_complete_(),
writer_name_(),
writer_ptr_()
writer_ptr_(),
clip_(true)
{
affine_transform_[0] = 1.0;
affine_transform_[1] = 0.0;
@ -59,7 +60,8 @@ public:
symbolizer_base(symbolizer_base const& other)
: comp_op_(other.comp_op_),
affine_transform_(other.affine_transform_) {}
affine_transform_(other.affine_transform_),
clip_(other.clip_) {}
/** Add a metawriter to this symbolizer using a name. */
void add_metawriter(std::string const& name, metawriter_properties const& properties);
@ -94,12 +96,13 @@ public:
metawriter_properties const& get_metawriter_properties_overrides() const { return properties_; }
/** Get metawriter name. */
std::string const& get_metawriter_name() const { return writer_name_; }
void set_comp_op(composite_mode_e comp_op);
boost::optional<composite_mode_e> comp_op() const;
void set_transform(transform_type const& );
transform_type const& get_transform() const;
std::string get_transform_string() const;
void set_clip(bool clip);
bool clip() const;
private:
metawriter_properties properties_;
metawriter_properties properties_complete_;
@ -107,6 +110,7 @@ private:
metawriter_ptr writer_ptr_;
boost::optional<composite_mode_e> comp_op_;
transform_type affine_transform_;
bool clip_;
};

View file

@ -90,9 +90,9 @@ void agg_renderer<T>::process(line_pattern_symbolizer const& sym,
vertex_converter<box2d<double>,rasterizer_type,line_pattern_symbolizer, proj_transform, CoordTransform, conv_types>
converter(ext,ras,sym,t_,prj_trans);
converter.set<clip_line_tag>(); //FIXME make an optinal clip (default: true)
if (sym.clip()) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
//if (sym.smooth() > 0.0) converter.set<smooth_tag>(); // optional smooth converter FIXME !
//if (sym.smooth() > 0.0) converter.set<smooth_tag>(); // FIXME optional smooth converter
BOOST_FOREACH(geometry_type & geom, feature->paths())
{

View file

@ -107,8 +107,7 @@ void agg_renderer<T>::process(line_symbolizer const& sym,
vertex_converter<box2d<double>,rasterizer,line_symbolizer, proj_transform, CoordTransform,conv_types>
converter(ext,*ras_ptr,sym,t_,prj_trans);
//if (sym.clip())
converter.set<clip_line_tag>(); //FIXME make an optinal clip (default: true)
if (sym.clip()) converter.set<clip_line_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
converter.set<affine_transform_tag>(); // optional affine transform
if (sym.smooth() > 0.0) converter.set<smooth_tag>(); // optional smooth converter

View file

@ -53,11 +53,10 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
{
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> ren_base;
agg::rendering_buffer buf(current_buffer_->raw_data(), width_, height_, width_ * 4);
agg::pixfmt_rgba32 pixf(buf);
ren_base renb(pixf);
agg::pixfmt_rgba32_plain pixf(buf);
agg::scanline_u8 sl;
ras_ptr->reset();
@ -89,19 +88,18 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
typedef agg::wrap_mode_repeat wrap_x_type;
typedef agg::wrap_mode_repeat wrap_y_type;
typedef agg::pixfmt_alpha_blend_rgba<agg::blender_rgba32,
agg::row_accessor<agg::int8u>, agg::pixel32_type> rendering_buffer;
typedef agg::image_accessor_wrap<rendering_buffer,
wrap_x_type,
wrap_y_type> img_source_type;
typedef agg::span_pattern_rgba<img_source_type> span_gen_type;
typedef agg::renderer_base<agg::pixfmt_rgba32_plain> ren_base;
typedef agg::renderer_scanline_aa<ren_base,
agg::span_allocator<agg::rgba8>,
span_gen_type> renderer_type;
ren_base renb(pixf);
unsigned w=(*pat)->width();
unsigned h=(*pat)->height();
agg::row_accessor<agg::int8u> pattern_rbuf((agg::int8u*)(*pat)->getBytes(),w,h,w*4);
@ -109,17 +107,17 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
rendering_buffer pixf_pattern(pattern_rbuf);
pixf_pattern.premultiply();
img_source_type img_src(pixf_pattern);
unsigned num_geometries = feature->num_geometries();
pattern_alignment_e align = sym.get_alignment();
unsigned offset_x=0;
unsigned offset_y=0;
if (align == LOCAL_ALIGNMENT)
{
double x0=0,y0=0;
if (num_geometries>0) // FIXME: hmm...?
if (num_geometries>0)
{
clipped_geometry_type clipped(feature->get_geometry(0));
clipped.clip_box(query_extent_.minx(),query_extent_.miny(),query_extent_.maxx(),query_extent_.maxy());
@ -137,22 +135,21 @@ void agg_renderer<T>::process(polygon_pattern_symbolizer const& sym,
box2d<double> inflated_extent = query_extent_ * 1.1;
typedef boost::mpl::vector<clip_poly_tag,transform_tag,smooth_tag> conv_types;
vertex_converter<box2d<double>,rasterizer,polygon_pattern_symbolizer, proj_transform, CoordTransform,conv_types>
vertex_converter<box2d<double>,rasterizer,polygon_pattern_symbolizer, proj_transform, CoordTransform,conv_types>
converter(inflated_extent,*ras_ptr,sym,t_,prj_trans);
//if (sym.clip())
converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
if (sym.clip()) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
if (sym.smooth() > 0.0) converter.set<smooth_tag>(); // optional smooth converter
BOOST_FOREACH( geometry_type & geom, feature->paths())
{
if (geom.num_points() > 2)
{
converter.apply(geom);
converter.apply(geom);
}
}
agg::render_scanlines(*ras_ptr, sl, rp);
}

View file

@ -54,7 +54,7 @@ void agg_renderer<T>::process(polygon_symbolizer const& sym,
vertex_converter<box2d<double>,rasterizer,polygon_symbolizer, proj_transform, CoordTransform,conv_types>
converter(inflated_extent,*ras_ptr,sym,t_,prj_trans);
if (sym.clip()) converter.set<clip_poly_tag>(); //optinal clip (default: true)
if (sym.clip()) converter.set<clip_poly_tag>(); //optional clip (default: true)
converter.set<transform_tag>(); //always transform
converter.set<affine_transform_tag>();
if (sym.smooth() > 0.0) converter.set<smooth_tag>(); // optional smooth converter

View file

@ -805,6 +805,9 @@ void map_parser::parse_metawriter_in_symbolizer(symbolizer_base &sym, xml_node c
sym.set_transform(matrix);
}
optional<boolean> clip = pt.get_opt_attr<boolean>("clip");
if (clip) sym.set_clip(*clip);
optional<std::string> writer = pt.get_opt_attr<std::string>("meta-writer");
if (!writer) return;
optional<std::string> output = pt.get_opt_attr<std::string>("meta-output");
@ -1379,11 +1382,7 @@ void map_parser::parse_polygon_symbolizer(rule & rule, xml_node const & sym)
// smooth value
optional<double> smooth = sym.get_opt_attr<double>("smooth");
if (smooth) poly_sym.set_smooth(*smooth);
// to clip or not to clip value
//optional<bool> clip = sym.get_opt_attr<bool>("clip");
//if (clip) poly_sym.set_clip(*clip);
parse_metawriter_in_symbolizer(poly_sym, sym);
rule.append(poly_sym);
}

View file

@ -32,9 +32,8 @@ polygon_symbolizer::polygon_symbolizer()
fill_(color(128,128,128)),
opacity_(1.0),
gamma_(1.0),
gamma_method_(GAMMA_POWER),
smooth_(0.0),
clip_(true) {}
gamma_method_(GAMMA_POWER)
{}
polygon_symbolizer::polygon_symbolizer(color const& fill)
: symbolizer_base(),
@ -42,8 +41,8 @@ polygon_symbolizer::polygon_symbolizer(color const& fill)
opacity_(1.0),
gamma_(1.0),
gamma_method_(GAMMA_POWER),
smooth_(0.0),
clip_(true) {}
smooth_(0.0)
{}
color const& polygon_symbolizer::get_fill() const
{
@ -95,13 +94,4 @@ double polygon_symbolizer::smooth() const
return smooth_;
}
void polygon_symbolizer::set_clip(bool clip)
{
clip_ = clip;
}
bool polygon_symbolizer::clip() const
{
return clip_;
}
}

View file

@ -99,6 +99,18 @@ std::string symbolizer_base::get_transform_string() const
return ss.str();
}
void symbolizer_base::set_clip(bool clip)
{
clip_ = clip;
}
bool symbolizer_base::clip() const
{
return clip_;
}
///////////////////////////////////////////////////////////////////////////////////////
symbolizer_with_image::symbolizer_with_image(path_expression_ptr file)
: image_filename_( file ),