merge with master

This commit is contained in:
Dane Springmeyer 2013-07-18 15:58:57 -04:00
commit dce3a73e0d
6 changed files with 84 additions and 74 deletions

View file

@ -199,6 +199,11 @@ struct symbolizer_attributes : public boost::static_visitor<>
{ {
boost::apply_visitor(f_attr,*width_expr); boost::apply_visitor(f_attr,*width_expr);
} }
path_expression_ptr const& filename_expr = sym.get_filename();
if (filename_expr)
{
path_processor_type::collect_attributes(*filename_expr,names_);
}
collect_transform(sym.get_image_transform()); collect_transform(sym.get_image_transform());
collect_transform(sym.get_transform()); collect_transform(sym.get_transform());
} }

View file

@ -33,11 +33,9 @@
#include <mapnik/ctrans.hpp> #include <mapnik/ctrans.hpp>
#include <mapnik/noncopyable.hpp> #include <mapnik/noncopyable.hpp>
// agg // agg
#include "agg_conv_clip_polyline.h" #include "agg_conv_clip_polyline.h"
// stl // stl
#include <queue> #include <queue>
@ -65,21 +63,21 @@ public:
DetectorT & detector, DetectorT & detector,
box2d<double> const& extent); box2d<double> const& extent);
/** Try place a single label at the given point. */ // Try place a single label at the given point. */
void find_point_placement(double pos_x, double pos_y, double angle=0.0); void find_point_placement(double pos_x, double pos_y, double angle=0.0);
/** Iterate over the given path, placing point labels with respect to label_spacing. */ // Iterate over the given path, placing point labels with respect to label_spacing. */
template <typename T> template <typename T>
void find_point_placements(T & path); void find_point_placements(T & path);
/** Iterate over the given path, placing line-following labels with respect to label_spacing. */ // Iterate over the given path, placing line-following labels with respect to label_spacing. */
template <typename T> template <typename T>
void find_line_placements(T & path); void find_line_placements(T & path);
/** Add placements to detector. */ // Add placements to detector. */
void update_detector(); void update_detector();
/** Remove old placements. */ // Remove old placements. */
void clear_placements(); void clear_placements();
inline placements_type const& get_results() { return placements_; } inline placements_type const& get_results() { return placements_; }
@ -134,17 +132,14 @@ private:
string_info const& info_; string_info const& info_;
text_symbolizer_properties const& p; text_symbolizer_properties const& p;
text_placement_info const& pi; text_placement_info const& pi;
/** Length of the longest line after linebreaks. // Length of the longest line after linebreaks.
* Before find_line_breaks() this is the total length of the string. // Before find_line_breaks() this is the total length of the string.
*/
double string_width_; double string_width_;
/** Height of the string after linebreaks. // Height of the string after linebreaks.
* Before find_line_breaks() this is the total length of the string. // Before find_line_breaks() this is the total length of the string.
*/
double string_height_; double string_height_;
/** Height of the tallest font in the first line not including line spacing. // Height of the tallest font in the first line not including line spacing.
* Used to determine the correct offset for the first line. // Used to determine the correct offset for the first line.
*/
double first_line_space_; double first_line_space_;
vertical_alignment_e valign_; vertical_alignment_e valign_;
horizontal_alignment_e halign_; horizontal_alignment_e halign_;
@ -152,18 +147,17 @@ private:
std::vector<unsigned> line_breaks_; std::vector<unsigned> line_breaks_;
std::vector<std::pair<double, double> > line_sizes_; std::vector<std::pair<double, double> > line_sizes_;
std::queue< box2d<double> > envelopes_; std::queue< box2d<double> > envelopes_;
/** Used to return all placements found. */ // Used to return all placements found. */
placements_type placements_; placements_type placements_;
/** Bounding box of all texts placed. */ // Bounding box of all texts placed. */
box2d<double> extents_; box2d<double> extents_;
/** Collect a bounding box of all texts placed. */ // Collect a bounding box of all texts placed. */
bool collect_extents_; bool collect_extents_;
/** Additional boxes to take into account when finding placement. // Additional boxes to take into account when finding placement.
* Used for finding line placements where multiple placements are returned. // Used for finding line placements where multiple placements are returned.
* Boxes are relative to starting point of current placement. // Boxes are relative to starting point of current placement.
* Only used for point placements! // Only used for point placements!
*/
std::vector<box2d<double> > additional_boxes_; std::vector<box2d<double> > additional_boxes_;
}; };
} }

View file

@ -40,11 +40,10 @@ template <typename T> class face_manager;
class MAPNIK_DECL processed_text : mapnik::noncopyable class MAPNIK_DECL processed_text : mapnik::noncopyable
{ {
public: public:
class processed_expression struct processed_expression
{ {
public: processed_expression(char_properties const& properties, UnicodeString const& text)
processed_expression(char_properties const& properties, UnicodeString const& text) : : p(properties), str(text) {}
p(properties), str(text) {}
char_properties p; char_properties p;
UnicodeString str; UnicodeString str;
}; };
@ -57,7 +56,7 @@ public:
typedef std::list<processed_expression> expression_list; typedef std::list<processed_expression> expression_list;
expression_list::const_iterator begin() const; expression_list::const_iterator begin() const;
expression_list::const_iterator end() const; expression_list::const_iterator end() const;
string_info &get_string_info(); string_info const& get_string_info();
private: private:
expression_list expr_list_; expression_list expr_list_;
face_manager<freetype_engine> &font_manager_; face_manager<freetype_engine> &font_manager_;

View file

@ -30,7 +30,7 @@
#include <mapnik/processed_text.hpp> #include <mapnik/processed_text.hpp>
//boost //boost
#include <boost/shared_ptr.hpp> #include <boost/scoped_ptr.hpp>
// agg // agg
#include "agg_trans_affine.h" #include "agg_trans_affine.h"
@ -65,34 +65,14 @@ public:
CoordTransform const& t, CoordTransform const& t,
FaceManagerT &font_manager, FaceManagerT &font_manager,
DetectorT &detector, DetectorT &detector,
box2d<double> const& query_extent) box2d<double> const& query_extent);
: sym_(sym),
feature_(feature),
prj_trans_(prj_trans),
t_(t),
font_manager_(font_manager),
detector_(detector),
dims_(0, 0, width, height),
query_extent_(query_extent),
text_(font_manager, scale_factor),
angle_(0.0),
placement_valid_(false),
points_on_line_(false),
finder_()
{
initialize_geometries();
if (!geometries_to_process_.size()) return;
placement_ = sym_.get_placement_options()->get_placement_info(scale_factor);
next_placement();
initialize_points();
}
/** Return next placement. ~text_symbolizer_helper();
* If no more placements are found returns null pointer. // Return next placement.
*/ // If no more placements are found returns null pointer.
bool next(); bool next();
/** Get current placement. next() has to be called before! */ // Get current placement. next() has to be called before!
placements_type const& placements() const; placements_type const& placements() const;
protected: protected:
bool next_point_placement(); bool next_point_placement();
@ -113,28 +93,26 @@ protected:
box2d<double> const& query_extent_; box2d<double> const& query_extent_;
//Processing //Processing
processed_text text_; processed_text text_;
/* Using list instead of vector, because we delete random elements and need iterators to stay valid. */ // Using list instead of vector, because we delete random elements and need iterators to stay valid.
/** Remaining geometries to be processed. */ // Remaining geometries to be processed.
std::list<geometry_type*> geometries_to_process_; std::list<geometry_type*> geometries_to_process_;
/** Geometry currently being processed. */ // Geometry currently being processed.
std::list<geometry_type*>::iterator geo_itr_; std::list<geometry_type*>::iterator geo_itr_;
/** Remaining points to be processed. */ // Remaining points to be processed.
std::list<position> points_; std::list<position> points_;
/** Point currently being processed. */ // Point currently being processed.
std::list<position>::iterator point_itr_; std::list<position>::iterator point_itr_;
/** Text rotation. */ // Text rotation.
double angle_; double angle_;
/** Text + formatting. */ // Did last call to next_placement return true?
string_info *info_;
/** Did last call to next_placement return true? */
bool placement_valid_; bool placement_valid_;
/** Use point placement. Otherwise line placement is used. */ // Use point placement. Otherwise line placement is used.
bool point_placement_; bool point_placement_;
/** Place text at points on a line instead of following the line (used for ShieldSymbolizer) .*/ // Place text at points on a line instead of following the line (used for ShieldSymbolizer).
bool points_on_line_; bool points_on_line_;
text_placement_info_ptr placement_; text_placement_info_ptr placement_;
boost::shared_ptr<placement_finder<DetectorT> > finder_; boost::scoped_ptr<placement_finder<DetectorT> > finder_;
}; };
template <typename FaceManagerT, typename DetectorT> template <typename FaceManagerT, typename DetectorT>
@ -193,7 +171,6 @@ protected:
using text_symbolizer_helper<FaceManagerT, DetectorT>::geometries_to_process_; using text_symbolizer_helper<FaceManagerT, DetectorT>::geometries_to_process_;
using text_symbolizer_helper<FaceManagerT, DetectorT>::placement_; using text_symbolizer_helper<FaceManagerT, DetectorT>::placement_;
using text_symbolizer_helper<FaceManagerT, DetectorT>::next_placement; using text_symbolizer_helper<FaceManagerT, DetectorT>::next_placement;
using text_symbolizer_helper<FaceManagerT, DetectorT>::info_;
using text_symbolizer_helper<FaceManagerT, DetectorT>::geo_itr_; using text_symbolizer_helper<FaceManagerT, DetectorT>::geo_itr_;
using text_symbolizer_helper<FaceManagerT, DetectorT>::point_itr_; using text_symbolizer_helper<FaceManagerT, DetectorT>::point_itr_;
using text_symbolizer_helper<FaceManagerT, DetectorT>::points_; using text_symbolizer_helper<FaceManagerT, DetectorT>::points_;

View file

@ -55,7 +55,7 @@ void processed_text::clear()
} }
string_info &processed_text::get_string_info() string_info const& processed_text::get_string_info()
{ {
info_.clear(); //if this function is called twice invalid results are returned, so clear string_info first info_.clear(); //if this function is called twice invalid results are returned, so clear string_info first
expression_list::iterator itr = expr_list_.begin(); expression_list::iterator itr = expr_list_.begin();

View file

@ -39,6 +39,42 @@
namespace mapnik { namespace mapnik {
template <typename FaceManagerT, typename DetectorT>
text_symbolizer_helper<FaceManagerT, DetectorT>::text_symbolizer_helper(text_symbolizer const& sym,
feature_impl const& feature,
proj_transform const& prj_trans,
unsigned width,
unsigned height,
double scale_factor,
CoordTransform const& t,
FaceManagerT &font_manager,
DetectorT &detector,
box2d<double> const& query_extent)
: sym_(sym),
feature_(feature),
prj_trans_(prj_trans),
t_(t),
font_manager_(font_manager),
detector_(detector),
dims_(0, 0, width, height),
query_extent_(query_extent),
text_(font_manager, scale_factor),
angle_(0.0),
placement_valid_(false),
points_on_line_(false),
finder_(0)
{
initialize_geometries();
if (!geometries_to_process_.size()) return;
placement_ = sym_.get_placement_options()->get_placement_info(scale_factor);
next_placement();
initialize_points();
}
template <typename FaceManagerT, typename DetectorT>
text_symbolizer_helper<FaceManagerT, DetectorT>::~text_symbolizer_helper()
{}
template <typename FaceManagerT, typename DetectorT> template <typename FaceManagerT, typename DetectorT>
bool text_symbolizer_helper<FaceManagerT, DetectorT>::next() bool text_symbolizer_helper<FaceManagerT, DetectorT>::next()
{ {
@ -283,7 +319,6 @@ bool text_symbolizer_helper<FaceManagerT, DetectorT>::next_placement()
return false; return false;
} }
placement_->properties.process(text_, feature_); placement_->properties.process(text_, feature_);
info_ = &(text_.get_string_info());
if (placement_->properties.orientation) if (placement_->properties.orientation)
{ {
// https://github.com/mapnik/mapnik/issues/1352 // https://github.com/mapnik/mapnik/issues/1352
@ -295,10 +330,9 @@ bool text_symbolizer_helper<FaceManagerT, DetectorT>::next_placement()
angle_ = 0.0; angle_ = 0.0;
} }
finder_.reset(new placement_finder<DetectorT>(feature_, *placement_,
finder_ = boost::shared_ptr<placement_finder<DetectorT> >(new placement_finder<DetectorT>(feature_, *placement_, *info_, detector_, dims_)); text_.get_string_info(),
// boost::make_shared<placement_finder<DetectorT> >(feature_, *placement_, *info_, detector_, dims_); detector_, dims_));
placement_valid_ = true; placement_valid_ = true;
return true; return true;
} }
@ -470,4 +504,5 @@ agg::trans_affine const& shield_symbolizer_helper<FaceManagerT, DetectorT>::get_
template class text_symbolizer_helper<face_manager<freetype_engine>, label_collision_detector4>; template class text_symbolizer_helper<face_manager<freetype_engine>, label_collision_detector4>;
template class shield_symbolizer_helper<face_manager<freetype_engine>, label_collision_detector4>; template class shield_symbolizer_helper<face_manager<freetype_engine>, label_collision_detector4>;
template class mapnik::placement_finder<mapnik::label_collision_detector4>;
} //namespace } //namespace