# Basic Shapes¶

Basic shapes (**rect**, **circle**, **ellipse**, **line**, **polyline**
and **polygon**) can be automatically converted to *path* commands.

## Basic Shapes Policy Concept¶

```
struct basic_shapes_policy
{
typedef /* Associative Sequence */ convert_to_path;
typedef /* Associative Sequence */ collect_attributes;
static const bool convert_only_rounded_rect_to_path = /* true or false */;
};
```

`convert_to_path`

- Associative Sequence (e.g.
`boost::mpl::set`

), containing SVG*basic shapes*elements tags, which will be converted to**path**. Generated**path**uses*Path Policy*and*Path Events Policy*settings. `collect_attributes`

- Associative Sequence, containing any of
**rect**,**circle**,**ellipse**or**line**element tags. Geometry of elements included in the sequence will be passed with single call instead of separate attribute handling (see*Basic Shapes Events Policy*). `convert_only_rounded_rect_to_path`

- If static member constant
`convert_only_rounded_rect_to_path`

equals to`true`

and`tag::element::rect`

is included in`convert_to_path`

sequence, then only rounded rectangles will be converted to**path**, and regular rectangles will be handle like if`tag::element::rect`

is included in`collect_attributes`

.

In `document_traversal`

processing of attributes describing *basic shapes* geometry (**x**, **y**,
**r** etc) must be enabled,
i. e. they must be included in `processed_attributes`

or excluded from `ignored_attributes`

.
Associative Sequence `traits::shapes_attributes_by_element`

contains tags of all such attributes
for *basic shapes*.

Named class template parameter for *Basic Shapes Policy* is `basic_shapes_policy`

.

## Basic Shapes Events Policy Concept¶

```
struct basic_shapes_events_policy
{
static void set_rect(Context & context, Coordinate x, Coordinate y, Coordinate width, Coordinate height,
Coordinate rx, Coordinate ry);
static void set_rect(Context & context, Coordinate x, Coordinate y, Coordinate width, Coordinate height);
static void set_line(Context & context, Coordinate x1, Coordinate y1, Coordinate x2, Coordinate y2);
static void set_circle(Context & context, Coordinate cx, Coordinate cy, Coordinate r);
static void set_ellipse(Context & context, Coordinate cx, Coordinate cy, Coordinate rx, Coordinate ry);
};
```

*Basic Shapes Events Policy* is used for *basic shapes* (except **polyline** and **polygon**) elements,
that are listed in `collect_attributes`

field of *Basic Shapes Policy*.

Adapters that implement these conversions, use `length_to_user_coordinate`

method of *Length Factory*
to get *user coordinates* value by *length*. These adapters passes default values if attributes are missing
and check correctness of attributes. If value disables rendering of the element
according to SVG specification, then *Basic Shapes Events Policy* methods aren’t called,
and if an attribute has negative value that is not permitted by specification,
then `negative_value`

function of Error Policy is called.

Default *Basic Shapes Events Policy* (`policy::basic_shapes_events::forward_to_method`

)
forwards calls to its static methods to `context`

object methods:

```
struct forward_to_method
{
template<class Coordinate>
static void set_rect(Context & context, Coordinate x, Coordinate y, Coordinate width, Coordinate height,
Coordinate rx, Coordinate ry)
{
context.set_rect(x, y, width, height, rx, ry);
}
/*...*/
};
```

Named class template parameter for *Basic Shapes Events Policy* is `basic_shapes_events_policy`

.