public PathGradientBrush(GraphicsPath path)
{
if (path == null)
throw new ArgumentNullException ("path");
var pathClone = (GraphicsPath)path.Clone ();
pathClone.CloseAllFigures ();
pathClone.Flatten ();
pathPoints = pathClone.PathPoints;
// make sure we have a closed path
if (pathPoints[0] != pathPoints[pathPoints.Length - 1])
{
var first = pathPoints [0];
var temps = new PointF[pathPoints.Length + 1];
for (var p = 0; p < pathPoints.Length; p++)
temps[p] = pathPoints[p];
temps[temps.Length - 1] = first;
pathPoints = temps;
}
rectangle = GeomUtilities.PolygonBoundingBox (pathPoints);
centerPoint = GeomUtilities.PolygonCentroid (pathPoints);
wrapMode = WrapMode.Clamp;
// verify the winding of the polygon so that we cen calculate the
// edges correctly
var vt1 = pathPoints [0];
var vt2 = centerPoint;
var vt3 = pathPoints [1];
var pWinding = vt1.X * vt2.Y - vt2.X * vt1.Y;
pWinding += vt2.X * vt3.Y - vt3.X * vt2.Y;
pWinding += vt3.X * vt1.Y - vt1.X * vt3.Y;
// Positive is counter clockwise
if (pWinding < 0)
polygonWinding = FillMode.Alternate;
blend = new Blend(1);
blend.Factors = new float[]{ 1.0f};
blend.Positions = new float[] { 1.0f };
}