Path¶
Path parsing is controlled by Path Policy and Path Events Policy. Path Policy configures the adapter that simplifies path handling for application (e.g. adapter may substitute relative coordinates with absolute ones relieving programmer from this duty). Path Events Policy defines how parsed path data is passed to the user code.
Path Events Policy Concept¶
struct path_events_concept
{
typedef /*...*/ context_type;
static void path_move_to(context_type & context, number_type x, number_type y, AbsoluteOrRelative absoluteOrRelative);
static void path_line_to(context_type & context, number_type x, number_type y, AbsoluteOrRelative absoluteOrRelative);
static void path_line_to_ortho(context_type & context, number_type coord, bool horizontal, AbsoluteOrRelative absoluteOrRelative);
static void path_cubic_bezier_to(context_type & context, number_type x1, number_type y1,
number_type x2, number_type y2,
number_type x, number_type y,
AbsoluteOrRelative absoluteOrRelative);
static void path_cubic_bezier_to(context_type & context,
number_type x2, number_type y2,
number_type x, number_type y,
AbsoluteOrRelative absoluteOrRelative);
static void path_quadratic_bezier_to(context_type & context,
number_type x1, number_type y1,
number_type x, number_type y,
AbsoluteOrRelative absoluteOrRelative);
static void path_quadratic_bezier_to(context_type & context,
number_type x, number_type y,
AbsoluteOrRelative absoluteOrRelative);
static void path_elliptical_arc_to(context_type & context,
number_type rx, number_type ry, number_type x_axis_rotation,
bool large_arc_flag, bool sweep_flag,
number_type x, number_type y,
AbsoluteOrRelative absoluteOrRelative);
static void path_close_subpath(context_type & context);
static void path_exit(context_type & context);
};
absoluteOrRelative
parameter may have type tag::coordinate::absolute
or
tag::coordinate::relative
depending on whether absolute or relative coordinates are passed in other parameters.
Depending on Path Policy, some of the methods aren’t called by SVG++ and therefore shouldn’t be implemented.
Default Path Events Policy (policy::path_events::forward_to_method
) forwards calls to its static methods
to context
object methods:
struct forward_to_method
{
typedef Context context_type;
template<class Coordinate, class AbsoluteOrRelative>
static void path_move_to(Context & context, Coordinate x, Coordinate y, AbsoluteOrRelative absoluteOrRelative)
{
context.path_move_to(x, y, absoluteOrRelative);
}
/*...*/
};
Named class template parameter for Path Events Policy is path_events_policy
.
Path Policy Concept¶
struct path_policy_concept
{
static const bool absolute_coordinates_only = /* true or false */;
static const bool no_ortho_line_to = /* true or false */;
static const bool no_quadratic_bezier_shorthand = /* true or false */;
static const bool no_cubic_bezier_shorthand = /* true or false */;
static const bool quadratic_bezier_as_cubic = /* true or false */;
static const bool arc_as_cubic_bezier = /* true or false */;
};
Path Policy is a class with bool
static member constants.
If they all are false
(as in policy::path::raw
), then adapter isn’t used and parser passed parsed values to the user code as is.
By setting some members to true
programmer may simplify his work:
absolute_coordinates_only = true
- Relative coordinates are replaced with corresponding absolute. Therefore Path Events Policy methods with
tag::coordinate::relative
parameter aren’t used.no_ortho_line_to = true
- Instead of call to
path_line_to_ortho
with one coordinate call is made topath_line_to
with two coordinates.no_quadratic_bezier_shorthand = true
- Instead of
path_quadratic_bezier_to
with two coordinates (shorthand/smooth curve) overload of same method with four coordinates is used.no_cubic_bezier_shorthand = true
- Instead of
path_cubic_bezier_to
with four coordinates (shorthand/smooth curve) overload of same method with six coordinates is used.quadratic_bezier_as_cubic = true
- Call to
path_quadratic_bezier_to
is replaced with call topath_cubic_bezier_to
.arc_as_cubic_bezier = true
- Elliptical arc is approximated with cubic Bézier curve. Call to
path_elliptical_arc_to
substituted with series of calls topath_cubic_bezier_to
.
Named class template parameter for Path Policy is path_policy
.
File svgpp/policy/path.hpp
contains some predefined Path Policies.
policy::path::no_shorthands
used by default limits Path Events Policy interface as much as possible
not using approximation.
In this case Path Events Policy becomes:
struct path_events_no_shorthands_concept
{
typedef /*...*/ context_type;
static void path_move_to(context_type & context, number_type x, number_type y, tag::coordinate::absolute);
static void path_line_to(context_type & context, number_type x, number_type y, tag::coordinate::absolute);
static void path_cubic_bezier_to(context_type & context, number_type x1, number_type y1,
number_type x2, number_type y2,
number_type x, number_type y,
tag::coordinate::absolute);
static void path_quadratic_bezier_to(context_type & context,
number_type x1, number_type y1,
number_type x, number_type y,
tag::coordinate::absolute);
static void path_elliptical_arc_to(context_type & context,
number_type rx, number_type ry, number_type x_axis_rotation,
bool large_arc_flag, bool sweep_flag,
number_type x, number_type y,
tag::coordinate::absolute);
static void path_close_subpath(context_type & context);
static void path_exit(context_type & context);
};
It is better to inherit own Path Policy from some provided by SVG++ to easy upgrade to future versions of SVG++.