Add documentation.
This commit is contained in:
parent
3b887972b8
commit
469568862b
4 changed files with 112 additions and 18 deletions
20
docs/textrendering.gv
Normal file
20
docs/textrendering.gv
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#process with: dot textrendering.gv -Tpng > textrendering.png
|
||||||
|
digraph textrendering {
|
||||||
|
# Classes without important virtual members: Round
|
||||||
|
# Classes with important virtual members: Rect
|
||||||
|
# Pointers [style=dashed]
|
||||||
|
# Red: function is called
|
||||||
|
text_placements[shape=box]
|
||||||
|
text_placement_info[shape=box]
|
||||||
|
Renderer
|
||||||
|
|
||||||
|
TextSymbolizer -> text_placements [label="placement_options_", style=dashed]
|
||||||
|
text_placements -> text_symbolizer_properties [label="properties"]
|
||||||
|
text_placements -> text_placement_info [label="get_placement_info()", style=dashed]
|
||||||
|
text_placement_info -> text_symbolizer_properties [label="properties"]
|
||||||
|
text_placement_info -> text_path [label="placements", style=dashed]
|
||||||
|
text_symbolizer_properties -> text_processor [label="processor"]
|
||||||
|
text_path -> Renderer [label="used by"]
|
||||||
|
Renderer -> text_placement_info [color=red, label="init()"]
|
||||||
|
|
||||||
|
}
|
|
@ -117,7 +117,9 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct text_path : boost::noncopyable
|
|
||||||
|
/** List of all characters and their positions and formats for a placement. */
|
||||||
|
class text_path : boost::noncopyable
|
||||||
{
|
{
|
||||||
struct character_node
|
struct character_node
|
||||||
{
|
{
|
||||||
|
@ -139,41 +141,51 @@ struct text_path : boost::noncopyable
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int itr_;
|
||||||
|
public:
|
||||||
typedef std::vector<character_node> character_nodes_t;
|
typedef std::vector<character_node> character_nodes_t;
|
||||||
|
character_nodes_t nodes_;
|
||||||
double starting_x;
|
double starting_x;
|
||||||
double starting_y;
|
double starting_y;
|
||||||
character_nodes_t nodes_;
|
|
||||||
int itr_;
|
|
||||||
|
|
||||||
std::pair<unsigned,unsigned> string_dimensions;
|
// std::pair<unsigned,unsigned> string_dimensions;
|
||||||
|
|
||||||
text_path()
|
text_path()
|
||||||
: starting_x(0),
|
: itr_(0),
|
||||||
starting_y(0),
|
starting_x(0),
|
||||||
itr_(0) {}
|
starting_y(0)
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
~text_path() {}
|
~text_path() {}
|
||||||
|
|
||||||
|
/** Adds a new char to the list. */
|
||||||
void add_node(int c, double x, double y, double angle, char_properties *format)
|
void add_node(int c, double x, double y, double angle, char_properties *format)
|
||||||
{
|
{
|
||||||
nodes_.push_back(character_node(c, x, y, angle, format));
|
nodes_.push_back(character_node(c, x, y, angle, format));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return node. Always returns a new node. Has no way to report that there are no more nodes. */
|
||||||
void vertex(int *c, double *x, double *y, double *angle, char_properties **format)
|
void vertex(int *c, double *x, double *y, double *angle, char_properties **format)
|
||||||
{
|
{
|
||||||
nodes_[itr_++].vertex(c, x, y, angle, format);
|
nodes_[itr_++].vertex(c, x, y, angle, format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Start again at first node. */
|
||||||
void rewind()
|
void rewind()
|
||||||
{
|
{
|
||||||
itr_ = 0;
|
itr_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Number of nodes. */
|
||||||
int num_nodes() const
|
int num_nodes() const
|
||||||
{
|
{
|
||||||
return nodes_.size();
|
return nodes_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Delete all nodes. */
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
nodes_.clear();
|
nodes_.clear();
|
||||||
|
|
|
@ -92,10 +92,13 @@ enum justify_alignment
|
||||||
|
|
||||||
DEFINE_ENUM( justify_alignment_e, justify_alignment );
|
DEFINE_ENUM( justify_alignment_e, justify_alignment );
|
||||||
|
|
||||||
|
/** Contains all text symbolizer properties which are not directly related to text formating. */
|
||||||
struct text_symbolizer_properties
|
struct text_symbolizer_properties
|
||||||
{
|
{
|
||||||
text_symbolizer_properties();
|
text_symbolizer_properties();
|
||||||
|
/** Load all values and also the ```processor``` object from XML ptree. */
|
||||||
void set_values_from_xml(boost::property_tree::ptree const &sym, std::map<std::string,font_set> const & fontsets);
|
void set_values_from_xml(boost::property_tree::ptree const &sym, std::map<std::string,font_set> const & fontsets);
|
||||||
|
/** Save all values to XML ptree (but does not create a new parent node!). */
|
||||||
void to_xml(boost::property_tree::ptree &node, bool explicit_defaults, text_symbolizer_properties const &dfl=text_symbolizer_properties()) const;
|
void to_xml(boost::property_tree::ptree &node, bool explicit_defaults, text_symbolizer_properties const &dfl=text_symbolizer_properties()) const;
|
||||||
|
|
||||||
//Per symbolizer options
|
//Per symbolizer options
|
||||||
|
@ -105,71 +108,124 @@ struct text_symbolizer_properties
|
||||||
horizontal_alignment_e halign;
|
horizontal_alignment_e halign;
|
||||||
justify_alignment_e jalign;
|
justify_alignment_e jalign;
|
||||||
vertical_alignment_e valign;
|
vertical_alignment_e valign;
|
||||||
unsigned label_spacing; // distance between repeated labels on a single geometry
|
/** distance between repeated labels on a single geometry */
|
||||||
unsigned label_position_tolerance; //distance the label can be moved on the line to fit, if 0 the default is used
|
unsigned label_spacing;
|
||||||
|
/** distance the label can be moved on the line to fit, if 0 the default is used */
|
||||||
|
unsigned label_position_tolerance;
|
||||||
bool avoid_edges;
|
bool avoid_edges;
|
||||||
double minimum_distance;
|
double minimum_distance;
|
||||||
double minimum_padding;
|
double minimum_padding;
|
||||||
double minimum_path_length;
|
double minimum_path_length;
|
||||||
double max_char_angle_delta;
|
double max_char_angle_delta;
|
||||||
bool force_odd_labels; //Always try render an odd amount of labels
|
/** Always try render an odd amount of labels */
|
||||||
|
bool force_odd_labels;
|
||||||
bool allow_overlap;
|
bool allow_overlap;
|
||||||
unsigned text_ratio;
|
unsigned text_ratio;
|
||||||
unsigned wrap_width;
|
unsigned wrap_width;
|
||||||
text_processor processor; //Contains expressions and text formats
|
/** Contains everything related to text formating */
|
||||||
|
text_processor processor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Generate a possible placement and store results of placement_finder.
|
||||||
|
* This placement has first to be tested by placement_finder to verify it
|
||||||
|
* can actually be used.
|
||||||
|
*/
|
||||||
class text_placement_info : boost::noncopyable
|
class text_placement_info : boost::noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/** Constructor. Takes the parent text_placements object as a parameter
|
||||||
|
* to read defaults from it. */
|
||||||
text_placement_info(text_placements const* parent);
|
text_placement_info(text_placements const* parent);
|
||||||
/** Get next placement.
|
/** Get next placement.
|
||||||
* This function is also called before the first placement is tried.
|
* This function is also called before the first placement is tried.
|
||||||
* Each class has to return at least one position!
|
* Each class has to return at least one position!
|
||||||
* If this functions returns false the placement data should be considered invalid!
|
* If this functions returns false the placement data should be
|
||||||
|
* considered invalid!
|
||||||
*/
|
*/
|
||||||
virtual bool next()=0;
|
virtual bool next()=0;
|
||||||
virtual ~text_placement_info() {}
|
virtual ~text_placement_info() {}
|
||||||
|
/** Initialize values used by placement finder. Only has to be done once
|
||||||
|
* per object.
|
||||||
|
*/
|
||||||
void init(double scale_factor_,
|
void init(double scale_factor_,
|
||||||
unsigned w = 0, unsigned h = 0, bool has_dimensions_ = false);
|
unsigned w = 0, unsigned h = 0, bool has_dimensions_ = false);
|
||||||
|
|
||||||
|
/** Properties actually used by placement finder and renderer. Values in
|
||||||
|
* here are modified each time next() is called. */
|
||||||
text_symbolizer_properties properties;
|
text_symbolizer_properties properties;
|
||||||
|
|
||||||
|
/** Scale factor used by the renderer. */
|
||||||
double scale_factor;
|
double scale_factor;
|
||||||
|
/* TODO: Don't know what this is used for. */
|
||||||
bool has_dimensions;
|
bool has_dimensions;
|
||||||
|
/* TODO: Don't know what this is used for. */
|
||||||
std::pair<double, double> dimensions;
|
std::pair<double, double> dimensions;
|
||||||
|
/** Set scale factor. */
|
||||||
void set_scale_factor(double factor) { scale_factor = factor; }
|
void set_scale_factor(double factor) { scale_factor = factor; }
|
||||||
|
/** Get scale factor. */
|
||||||
double get_scale_factor() { return scale_factor; }
|
double get_scale_factor() { return scale_factor; }
|
||||||
|
/** Get label spacing taking the scale factor into account. */
|
||||||
double get_actual_label_spacing() { return scale_factor * properties.label_spacing; }
|
double get_actual_label_spacing() { return scale_factor * properties.label_spacing; }
|
||||||
|
/** Get minimum distance taking the scale factor into account. */
|
||||||
double get_actual_minimum_distance() { return scale_factor * properties.minimum_distance; }
|
double get_actual_minimum_distance() { return scale_factor * properties.minimum_distance; }
|
||||||
|
/** Get minimum padding taking the scale factor into account. */
|
||||||
double get_actual_minimum_padding() { return scale_factor * properties.minimum_padding; }
|
double get_actual_minimum_padding() { return scale_factor * properties.minimum_padding; }
|
||||||
|
|
||||||
|
/** Collect a bounding box of all texts placed. */
|
||||||
bool collect_extents;
|
bool collect_extents;
|
||||||
//Output
|
//Output by placement finder
|
||||||
|
/** Bounding box of all texts placed. */
|
||||||
box2d<double> extents;
|
box2d<double> extents;
|
||||||
|
/* TODO */
|
||||||
std::queue< box2d<double> > envelopes;
|
std::queue< box2d<double> > envelopes;
|
||||||
|
/* TODO */
|
||||||
boost::ptr_vector<placement_element> placements;
|
boost::ptr_vector<placement_element> placements;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef boost::shared_ptr<text_placement_info> text_placement_info_ptr;
|
typedef boost::shared_ptr<text_placement_info> text_placement_info_ptr;
|
||||||
|
|
||||||
|
/** This object handles the management of all TextSymbolizer properties. It can
|
||||||
|
* be used as a base class for own objects which implement new processing
|
||||||
|
* semantics. Basically this class just makes sure a pointer of the right
|
||||||
|
* class is returned by the get_placement_info call.
|
||||||
|
*/
|
||||||
class text_placements
|
class text_placements
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
text_placements();
|
text_placements();
|
||||||
|
/** Get a text_placement_info object to use in rendering.
|
||||||
|
* The returned object creates a list of settings which is
|
||||||
|
* used to try to find a placement and stores all
|
||||||
|
* information that is generated by
|
||||||
|
* the placement finder.
|
||||||
|
*
|
||||||
|
* This function usually is implemented as
|
||||||
|
* text_placement_info_ptr text_placements_XXX::get_placement_info() const
|
||||||
|
* {
|
||||||
|
* return text_placement_info_ptr(new text_placement_info_XXX(this));
|
||||||
|
* }
|
||||||
|
*/
|
||||||
virtual text_placement_info_ptr get_placement_info() const =0;
|
virtual text_placement_info_ptr get_placement_info() const =0;
|
||||||
/** Get a list of all expressions used in any placement.
|
/** Get a list of all expressions used in any placement.
|
||||||
* This function is used to collect attributes.
|
* This function is used to collect attributes.
|
||||||
*/
|
*/
|
||||||
virtual std::set<expression_ptr> get_all_expressions();
|
virtual std::set<expression_ptr> get_all_expressions();
|
||||||
|
|
||||||
|
/** Destructor. */
|
||||||
virtual ~text_placements() {}
|
virtual ~text_placements() {}
|
||||||
|
|
||||||
|
/** List of all properties used as the default for the subclasses. */
|
||||||
text_symbolizer_properties properties;
|
text_symbolizer_properties properties;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Pointer to object of class text_placements */
|
||||||
typedef boost::shared_ptr<text_placements> text_placements_ptr;
|
typedef boost::shared_ptr<text_placements> text_placements_ptr;
|
||||||
|
|
||||||
|
|
||||||
class text_placements_info_dummy;
|
class text_placements_info_dummy;
|
||||||
|
|
||||||
|
/** Dummy placement algorithm. Always takes the default value. */
|
||||||
class MAPNIK_DECL text_placements_dummy: public text_placements
|
class MAPNIK_DECL text_placements_dummy: public text_placements
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -177,6 +233,7 @@ public:
|
||||||
friend class text_placement_info_dummy;
|
friend class text_placement_info_dummy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Placement info object for dummy placement algorithm. Always takes the default value. */
|
||||||
class MAPNIK_DECL text_placement_info_dummy : public text_placement_info
|
class MAPNIK_DECL text_placement_info_dummy : public text_placement_info
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -68,9 +68,6 @@ struct char_properties
|
||||||
double halo_radius;
|
double halo_radius;
|
||||||
};
|
};
|
||||||
|
|
||||||
class abstract_token;
|
|
||||||
class processed_text;
|
|
||||||
|
|
||||||
class processed_expression
|
class processed_expression
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -78,8 +75,7 @@ public:
|
||||||
p(properties), str(text) {}
|
p(properties), str(text) {}
|
||||||
char_properties p;
|
char_properties p;
|
||||||
UnicodeString str;
|
UnicodeString str;
|
||||||
private:
|
|
||||||
friend class processed_text;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class processed_text
|
class processed_text
|
||||||
|
@ -101,15 +97,24 @@ private:
|
||||||
string_info info_;
|
string_info info_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class abstract_token;
|
||||||
|
|
||||||
|
/** Stores formating information and uses this to produce formated text for a given feature. */
|
||||||
class text_processor
|
class text_processor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
text_processor();
|
text_processor();
|
||||||
|
/** Construct object from XML. */
|
||||||
void from_xml(boost::property_tree::ptree const& pt, std::map<std::string,font_set> const &fontsets);
|
void from_xml(boost::property_tree::ptree const& pt, std::map<std::string,font_set> const &fontsets);
|
||||||
|
/** Write object to XML ptree. */
|
||||||
void to_xml(boost::property_tree::ptree &node, bool explicit_defaults, text_processor const& dfl) const;
|
void to_xml(boost::property_tree::ptree &node, bool explicit_defaults, text_processor const& dfl) const;
|
||||||
|
|
||||||
|
/** Takes a feature and produces formated text as output.
|
||||||
|
* The output object has to be created by the caller and passed in for thread safety.
|
||||||
|
*/
|
||||||
void process(processed_text &output, Feature const& feature);
|
void process(processed_text &output, Feature const& feature);
|
||||||
void set_old_style_expression(expression_ptr expr);
|
void set_old_style_expression(expression_ptr expr);
|
||||||
|
/** Add a new formating token. */
|
||||||
void push_back(abstract_token *token);
|
void push_back(abstract_token *token);
|
||||||
std::set<expression_ptr> get_all_expressions() const;
|
std::set<expression_ptr> get_all_expressions() const;
|
||||||
char_properties defaults;
|
char_properties defaults;
|
||||||
|
|
Loading…
Reference in a new issue