ensure the bounds used for avoid-edges and minimum-padding is non-buffered - refs #1283

This commit is contained in:
Dane Springmeyer 2012-07-04 18:34:04 -07:00
parent 7d9b4ce0da
commit c677b4f47c
6 changed files with 31 additions and 14 deletions

View file

@ -72,7 +72,7 @@ private:
class MAPNIK_DECL cairo_renderer_base : private boost::noncopyable class MAPNIK_DECL cairo_renderer_base : private boost::noncopyable
{ {
protected: protected:
cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x=0, unsigned offset_y=0); cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0);
public: public:
~cairo_renderer_base(); ~cairo_renderer_base();
void start_map_processing(Map const& map); void start_map_processing(Map const& map);
@ -127,6 +127,9 @@ protected:
Map const& m_; Map const& m_;
Cairo::RefPtr<Cairo::Context> context_; Cairo::RefPtr<Cairo::Context> context_;
unsigned width_;
unsigned height_;
double scale_factor_;
CoordTransform t_; CoordTransform t_;
boost::shared_ptr<freetype_engine> font_engine_; boost::shared_ptr<freetype_engine> font_engine_;
face_manager<freetype_engine> font_manager_; face_manager<freetype_engine> font_manager_;
@ -141,7 +144,7 @@ class MAPNIK_DECL cairo_renderer : public feature_style_processor<cairo_renderer
{ {
public: public:
typedef cairo_renderer_base processor_impl_type; typedef cairo_renderer_base processor_impl_type;
cairo_renderer(Map const& m, Cairo::RefPtr<T> const& surface, unsigned offset_x=0, unsigned offset_y=0); cairo_renderer(Map const& m, Cairo::RefPtr<T> const& surface, double scale_factor=1.0, unsigned offset_x=0, unsigned offset_y=0);
void end_map_processing(Map const& map); void end_map_processing(Map const& map);
}; };
} }

View file

@ -42,9 +42,10 @@ void agg_renderer<T>::process(shield_symbolizer const& sym,
shield_symbolizer_helper<face_manager<freetype_engine>, shield_symbolizer_helper<face_manager<freetype_engine>,
label_collision_detector4> helper( label_collision_detector4> helper(
sym, feature, prj_trans, sym, feature, prj_trans,
detector_->extent().width(), detector_->extent().height(), width_, height_,
scale_factor_, scale_factor_,
t_, font_manager_, *detector_, query_extent_); t_, font_manager_, *detector_,
query_extent_);
text_renderer<T> ren(*current_buffer_, text_renderer<T> ren(*current_buffer_,
font_manager_, font_manager_,

View file

@ -35,9 +35,10 @@ void agg_renderer<T>::process(text_symbolizer const& sym,
text_symbolizer_helper<face_manager<freetype_engine>, text_symbolizer_helper<face_manager<freetype_engine>,
label_collision_detector4> helper( label_collision_detector4> helper(
sym, feature, prj_trans, sym, feature, prj_trans,
detector_->extent().width(), detector_->extent().height(), width_,height_,
scale_factor_, scale_factor_,
t_, font_manager_, *detector_, query_extent_); t_, font_manager_, *detector_,
query_extent_);
text_renderer<T> ren(*current_buffer_, text_renderer<T> ren(*current_buffer_,
font_manager_, font_manager_,

View file

@ -737,9 +737,16 @@ private:
Cairo::RefPtr<Cairo::Context> context_; Cairo::RefPtr<Cairo::Context> context_;
}; };
cairo_renderer_base::cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x, unsigned offset_y) cairo_renderer_base::cairo_renderer_base(Map const& m,
Cairo::RefPtr<Cairo::Context> const& context,
double scale_factor,
unsigned offset_x,
unsigned offset_y)
: m_(m), : m_(m),
context_(context), context_(context),
width_(m.width()),
height_(m.height()),
scale_factor_(scale_factor),
t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y), t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y),
font_engine_(boost::make_shared<freetype_engine>()), font_engine_(boost::make_shared<freetype_engine>()),
font_manager_(*font_engine_), font_manager_(*font_engine_),
@ -750,14 +757,14 @@ cairo_renderer_base::cairo_renderer_base(Map const& m, Cairo::RefPtr<Cairo::Cont
} }
template <> template <>
cairo_renderer<Cairo::Context>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, unsigned offset_x, unsigned offset_y) cairo_renderer<Cairo::Context>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Context> const& context, double scale_factor, unsigned offset_x, unsigned offset_y)
: feature_style_processor<cairo_renderer>(m), : feature_style_processor<cairo_renderer>(m),
cairo_renderer_base(m,context,offset_x,offset_y) cairo_renderer_base(m,context,offset_x,offset_y)
{ {
} }
template <> template <>
cairo_renderer<Cairo::Surface>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Surface> const& surface, unsigned offset_x, unsigned offset_y) cairo_renderer<Cairo::Surface>::cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Surface> const& surface, double scale_factor, unsigned offset_x, unsigned offset_y)
: feature_style_processor<cairo_renderer>(m), : feature_style_processor<cairo_renderer>(m),
cairo_renderer_base(m,Cairo::Context::create(surface),offset_x,offset_y) cairo_renderer_base(m,Cairo::Context::create(surface),offset_x,offset_y)
{ {
@ -1192,7 +1199,7 @@ void cairo_renderer_base::start_map_processing(Map const& map)
shield_symbolizer_helper<face_manager<freetype_engine>, shield_symbolizer_helper<face_manager<freetype_engine>,
label_collision_detector4> helper( label_collision_detector4> helper(
sym, feature, prj_trans, sym, feature, prj_trans,
detector_.extent().width(), detector_.extent().height(), width_, height_,
1.0 /*scale_factor*/, 1.0 /*scale_factor*/,
t_, font_manager_, detector_, query_extent_); t_, font_manager_, detector_, query_extent_);
cairo_context context(context_); cairo_context context(context_);
@ -1619,7 +1626,12 @@ void cairo_renderer_base::start_map_processing(Map const& map)
mapnik::feature_impl & feature, mapnik::feature_impl & feature,
proj_transform const& prj_trans) proj_transform const& prj_trans)
{ {
text_symbolizer_helper<face_manager<freetype_engine>, label_collision_detector4> helper(sym, feature, prj_trans, detector_.extent().width(), detector_.extent().height(), 1.0 /*scale_factor*/, t_, font_manager_, detector_, query_extent_); text_symbolizer_helper<face_manager<freetype_engine>,
label_collision_detector4> helper(
sym, feature, prj_trans,
width_, height_,
1.0 /*scale_factor*/,
t_, font_manager_, detector_, query_extent_);
cairo_context context(context_); cairo_context context(context_);
context.set_operator(sym.comp_op()); context.set_operator(sym.comp_op());

View file

@ -47,8 +47,8 @@ void grid_renderer<T>::process(shield_symbolizer const& sym,
sym, feature, prj_trans, sym, feature, prj_trans,
width_, height_, width_, height_,
scale_factor_, scale_factor_,
t_, font_manager_, detector_, query_extent); t_, font_manager_, detector_,
query_extent);
bool placement_found = false; bool placement_found = false;
text_renderer<T> ren(pixmap_, text_renderer<T> ren(pixmap_,

View file

@ -35,7 +35,7 @@ void grid_renderer<T>::process(text_symbolizer const& sym,
text_symbolizer_helper<face_manager<freetype_engine>, text_symbolizer_helper<face_manager<freetype_engine>,
label_collision_detector4> helper( label_collision_detector4> helper(
sym, feature, prj_trans, sym, feature, prj_trans,
detector_.extent().width(), detector_.extent().height(), width_, height_,
scale_factor_ * (1.0/pixmap_.get_resolution()), scale_factor_ * (1.0/pixmap_.get_resolution()),
t_, font_manager_, detector_, t_, font_manager_, detector_,
query_extent); query_extent);