Some formulas and notes are here about displaying things with cairo.
--------------------------------------------------------------------

1. Visio.ArcTo and cairo_arc
----------------------------
cairo uses coords of center, radius and start/end angles for drawing arc.
Visio uses coords of start and end points of arc and distance from the middle
of imaginable chord to the arc.
Translation from xstart/ystart, xend/yend/a (distance) to xcenter/ycenter/radius/ang1/ang2

radius = ((xend-xstart)^2+(yend-ystart)^+4*a*a)/(8*a);
			
xcenter = (xstart + xend)/2 + (radius-a)*(yend - ystart)/sqrt((yend-ystart)^2+(xend-xstart)^2);
ycenter = (ystart + yend)/2 + (radius-a)*(xstart - xend)/sqrt((yend-ystart)^2+(xend-xstart)^2);
ang1 = atan2((ystart - ycenter),(xstart-xcenter));
ang2 = atan2((yend - ycenter),(xend-xcenter));

To cairo it use
'cairo_arc_negative (cr, xc, yc, radius, ang1, ang2);'
============================

2. Visio.Ellipse and cairo
----------------------------
cairo doesn't have 'ellipse' command, so one need to draw a circle and transform it.

Visio uses coords of the center, most right and top points on the ellipse.
(the 'right' and 'top' are before possible rotation, that Visio can make on ellipse).
So x/y are for center coords.
a/b are x/y coords of the most right point.
c/d are x/y coords of the top point.

The command below seems to make right ellipse.
cairo_translate(cr, x, y);
cairo_rotate(cr, clockwise_angle_in_radians);
cairo_scale(cr, (a-x)/2, (d-y)/2);
cairo_arc(cr, 0.,0.,1.,0.,2*M_PI);
============================