Operations 
void   arc(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise)
 The arc(x, y,
radius, startAngle, endAngle, anticlockwise) and ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) methods draw arcs.

void   arcTo(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius, optional unrestricted double radiusY, optional unrestricted double rotation)
 The arcTo(x1, y1, x2, y2, radiusX,
radiusY, rotation) method must first
ensure there is a subpath for (x1, y1). Then, the behavior depends on the arguments and the last point in the
subpath, as described below.

void   bezierCurveTo(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y)
 The bezierCurveTo(cp1x,
cp1y, cp2x, cp2y, x, y) method must ensure there is a
subpath for (cp1x, cp1y), and
then must connect the last point in the subpath to the given point (x, y) using a cubic Bézier curve with control points (cp1x,
cp1y) and (cp2x, cp2y).

void   closePath()
 The closePath() method must do nothing
if the object's path has no subpaths. Otherwise, it must mark the last subpath as closed, create a
new subpath whose first point is the same as the previous subpath's first point, and finally add
this new subpath to the path.

void   ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise)
 The arc(x, y,
radius, startAngle, endAngle, anticlockwise) and ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) methods draw arcs.

void   lineTo(unrestricted double x, unrestricted double y)
 The lineTo(x, y) method must ensure there is a subpath for (x, y) if the object's path has no
subpaths. Otherwise, it must connect the last point in the subpath to the given point (x, y) using a straight line, and must then add the given point
(x, y) to the subpath.

void   moveTo(unrestricted double x, unrestricted double y)
 The moveTo(x, y) method must create a new subpath with the specified point as its
first (and only) point.

void   quadraticCurveTo(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y)
 The quadraticCurveTo(cpx, cpy, x, y) method must ensure there is a subpath for (cpx, cpy), and then must connect the last
point in the subpath to the given point (x, y) using a
quadratic Bézier curve with control point (cpx, cpy), and must then add the given point (x, y) to the subpath.

void   rect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h)
 The rect(x, y,
w, h) method must create a new subpath
containing just the four points (x, y), (x+w, y), (x+w, y+h), (x, y+h), in that order, with those four points connected by straight lines, and
must then mark the subpath as closed. It must then create a new subpath with the point (x, y) as the only point in the subpath.
