/// <summary>
/// Draws the specified Image at the specified location and with the specified shape and size.
///
/// The destPoints parameter specifies three points of a parallelogram. The three PointF structures
/// represent the upper-left, upper-right, and lower-left corners of the parallelogram. The fourth point
/// is extrapolated from the first three to form a parallelogram.
///
/// The image represented by the image object is scaled and sheared to fit the shape of the parallelogram
/// specified by the destPoints parameter.
/// </summary>
/// <param name="image">Image.</param>
/// <param name="destPoints">Destination points.</param>
public void DrawImage(Image image, PointF [] destPoints)
{
if (image == null)
{
throw new ArgumentNullException("image");
}
if (destPoints == null)
{
throw new ArgumentNullException("destPoints");
}
if (destPoints.Length < 3)
{
throw new ArgumentException("Destination points must be an array with a length of 3 or 4. " +
"A length of 3 defines a parallelogram with the upper-left, upper-right, " +
"and lower-left corners. A length of 4 defines a quadrilateral with the " +
"fourth element of the array specifying the lower-right coordinate.");
}
// Windows throws a Not Implemented error if the points are more than 3
if (destPoints.Length > 3)
{
throw new NotImplementedException();
}
if (image.nativeMetafilePage != null)
{
throw new NotImplementedException();
}
// create our rectangle. Offset is 0 because the CreateGeometricTransform bakes our x,y offset in there.
var rect = new CGRect(0, 0, destPoints [1].X - destPoints [0].X, destPoints [2].Y - destPoints [0].Y);
// We need to flip our Y axis so the image appears right side up
var geoTransform = new CGAffineTransform(1, 0, 0, -1, 0, rect.Height);
//var geott = GeomUtilities.CreateGeometricTransform (rect, destPoints);
geoTransform.Multiply(GeomUtilities.CreateGeometricTransform(rect, destPoints));
// Apply our transform to the context
context.ConcatCTM(geoTransform);
// now we draw our image.
context.DrawImage(rect, image.NativeCGImage);
// Now we revert our image transform from the context
var revert = CGAffineTransform.CGAffineTransformInvert(geoTransform);
context.ConcatCTM(revert);
}