Viewport¶
When establishing new viewport by elements svg, symbol (instanced by use) or image several attributes must be processed (x, y, width, height, preserveAspectRatio, viewbox) to get the new user coordinate system, viewport and clipping path. SVG++ may do it itself and present result in convenient way. This behavior is configured by Viewport Policy. Viewport Events Policy defines how viewport information is passed to the user code.
marker element establish new viewport similar way, when it is instances in path vertices, so marker elements may also be handled by Viewport Policy and Viewport Events Policy.
Viewport Policy Concept¶
struct viewport_policy_concept
{
static const bool calculate_viewport = /* true or false */;
static const bool calculate_marker_viewport = /* true or false */;
static const bool calculate_pattern_viewport = /* true or false */;
static const bool viewport_as_transform = /* true or false */;
};
calculate_viewport = trueEnables handling of viewport attributes for svg and symbol elements. Values will be passed by calls to
set_viewportorset_viewbox_transformof Viewport Events Policy.calculate_marker_viewport = trueThe same for marker elements.
calculate_pattern_viewport = trueThe same for pattern elements.
viewport_as_transform = trueIs checked only if
calculate_viewport = true.set_viewbox_transformmethod of Viewport Events Policy isn’t used, new coordinate system is set by Transform Events Policy instead.
Named class template parameter for Viewport Policy is viewport_policy.
File svgpp/policy/viewport.hpp contains some predefined Viewport Policies.
policy::viewport::raw, used by default, turns off viewport processing in SVG++.
policy::viewport::as_transform sets all boolean members to true,
thus enabling viewport attributes handling by SVG++ and
passing coordinate system changes by Transform Events Policy.
Viewport Events Policy Concept¶
struct viewport_events_policy_concept
{
static void set_viewport(context_type & context, number_type viewport_x, number_type viewport_y,
number_type viewport_width, number_type viewport_height);
static void set_viewbox_transform(context_type & context, number_type translate_x, number_type translate_y,
number_type scale_x, number_type scale_y, bool defer);
static void set_viewbox_size(context_type & context, number_type viewbox_width, number_type viewbox_height);
static void get_reference_viewport_size(context_type & context,
number_type & viewport_width, number_type & viewport_height);
static void disable_rendering(context_type & context);
};
set_viewportSets new viewport position.
set_viewbox_transformPasses offset and scale that are set by combination of viewbox and preserveAspectRatio. Not used if
viewport_as_transform = true.set_viewbox_sizePasses size of viewbox, set by viewbox attribute. Called only if viewbox attribute is present. It can be used to set viewport size in Length Factory.
get_reference_viewport_sizeSee Referenced element.
disable_renderingSVG Specification says that “[width or height attribute] value of zero disables rendering of this element”.
disable_renderingwill be called in such cases, so that application can behave in proper way. Document Traversal Control Policy may be used to skip processing of element content.
Named class template parameter for Viewport Events Policy is viewport_events_policy.
Referenced element¶
When processing svg element referenced by use or image, symbol referenced by use values of width and height of referencing element are required.
To pass to SVG++ information that element is referenced by use or image,
tag of referenced element must be passed as referencing_element parameter
of document_traversal class.
In this case get_reference_viewport_size method of Viewport Events Policy will be called.
Implementation of get_reference_viewport_size must set viewport_width to
value of width attribute of referenced element, if this attribute is set.
And set viewport_height value of height attribute of referenced element, if this attribute is set.
Processed attributes¶
If calculate_viewport = true or calculate_pattern_viewport = true in Viewport Policy,
then SVG++ intercepts and processes attributes,
listed in traits::viewport_attributes:
namespace traits
{
typedef boost::mpl::set6<
tag::attribute::x,
tag::attribute::y,
tag::attribute::width,
tag::attribute::height,
tag::attribute::viewBox,
tag::attribute::preserveAspectRatio
> viewport_attributes;
}
If calculate_marker_viewport = true in Viewport Policy, then SVG++
intercepts and processes marker attributes listed in traits::marker_viewport_attributes:
namespace traits
{
typedef boost::mpl::set6<
tag::attribute::refX,
tag::attribute::refY,
tag::attribute::markerWidth,
tag::attribute::markerHeight,
tag::attribute::viewBox,
tag::attribute::preserveAspectRatio
> marker_viewport_attributes;
}
Processing of this attributes must be enabled by the programmer.
Order of viewport processing¶
Viewport attributes will be processed and result will be passed by Viewport Events Policy
after all SVG element attributes are processed or when notification
with tag tag::event::after_viewport_attributes arrives.