internal void WriteGeometry(PathGeometry geo)
{
BeginGraphic();
// PathGeometry itself may have its own transform
if (geo.Transform != null) // also check render mode?
{
MultiplyTransform(geo.Transform);
WriteRenderTransform(geo.Transform);
}
foreach (PathFigure figure in geo.Figures)
{
PolyLineSegment pseg;
PolyBezierSegment bseg;
ArcSegment aseg;
PolyQuadraticBezierSegment qseg;
// And now for the most superfluous and unnecessary optimization within the whole PDFsharp library
if (figure.IsClosed && figure.Segments.Count == 1 && (pseg = figure.Segments[0] as PolyLineSegment) != null && pseg.Points.Count == 3)
{
// Identify rectangles
Point pt0 = figure.StartPoint;
Point pt1 = pseg.Points[0];
Point pt2 = pseg.Points[1];
Point pt3 = pseg.Points[2];
// This
// M16,0 L24,0 24,144 16,144 Z
// becomes
// 16 0 m 24 0 l 24 144 l 16 144 l h
// but shorter is this
// 16 0 8 144 re
if (pt0.X == pt3.X && pt0.Y == pt1.Y && pt1.X == pt2.X && pt2.Y == pt3.Y)
{
WriteLiteral("{0:0.###} {1:0.###} {2:0.###} {3:0.###} re \n", pt0.X, pt0.Y, pt2.X - pt0.X, pt2.Y - pt1.Y);
continue;
}
}
WriteMoveStart(figure.StartPoint);
foreach (PathSegment seg in figure.Segments)
{
if ((pseg = seg as PolyLineSegment) != null)
WriteSegment(pseg);
else if ((bseg = seg as PolyBezierSegment) != null)
WriteSegment(bseg);
else if ((aseg = seg as ArcSegment) != null)
WriteSegment(aseg);
else if ((qseg = seg as PolyQuadraticBezierSegment) != null)
WriteSegment(qseg);
}
if (figure.IsClosed)
WriteLiteral("h\n"); // Close current figure
}
}