public static void ConvertToVxs(System.Drawing.Drawing2D.PathData pathdata, VertexStore outputVxs)
{
byte[] pointTypes = pathdata.Types;
PointF[] points = pathdata.Points;
int pointCount = points.Length;
//from MSDN document
//0 = start of figure (MoveTo)
//1 = one of the two endpoints of a line (LineTo)
//3 = an endpoint or control point of a cubic Bezier spline (4 points spline)
//masks..
//0x7 = 111b (binary) => for masking lower 3 bits
//0x20 = (1<<6) specific that point is a marker
//0x80 = (1<<7) specific that point is the last point of a closed subpath( figure)
//----------------------------------
//convert to Agg's VertexStorage
int curvePointCount = 0;
for (int i = 0; i < pointCount; ++i)
{
byte pointType = pointTypes[i];
PointF p = points[i];
switch (0x7 & pointType)
{
case 0:
//move to
outputVxs.AddMoveTo(p.X, p.Y);
curvePointCount = 0;
break;
case 1:
//line to
outputVxs.AddLineTo(p.X, p.Y);
curvePointCount = 0;
break;
case 3:
//end point of control point of cubic Bezier spline
{
switch (curvePointCount)
{
case 0:
{
outputVxs.AddP2c(p.X, p.Y);
curvePointCount++;
} break;
case 1:
{
outputVxs.AddP3c(p.X, p.Y);
curvePointCount++;
} break;
case 2:
{
outputVxs.AddLineTo(p.X, p.Y);
curvePointCount = 0; //reset
} break;
default:
{
throw new NotSupportedException();
}
}
} break;
default:
{
} break;
}
if ((pointType >> 7) == 1)
{
//close figure to
outputVxs.AddCloseFigure();
}
if ((pointType >> 6) == 1)
{
}
}
}