/// <summary>
/// Converts the given object to the type of this converter, using the specified context and culture information.
/// </summary>
/// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"/> that provides a format context.</param>
/// <param name="culture">The <see cref="T:System.Globalization.CultureInfo"/> to use as the current culture.</param>
/// <param name="value">The <see cref="T:System.Object"/> to convert.</param>
/// <returns>
/// An <see cref="T:System.Object"/> that represents the converted value.
/// </returns>
/// <exception cref="T:System.NotSupportedException">The conversion cannot be performed. </exception>
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
SvgTransformCollection transformList = new SvgTransformCollection();
string[] parts;
string contents;
string transformName;
foreach (string transform in SvgTransformConverter.SplitTransforms((string)value))
{
if (string.IsNullOrEmpty(transform))
{
continue;
}
parts = transform.Split('(', ')');
transformName = parts[0].Trim();
contents = parts[1].Trim();
switch (transformName)
{
case "translate":
string[] coords = contents.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (coords.Length == 0 || coords.Length > 2)
{
throw new FormatException("Translate transforms must be in the format 'translate(x [,y])'");
}
float x = float.Parse(coords[0].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture);
if (coords.Length > 1)
{
float y = float.Parse(coords[1].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture);
transformList.Add(new SvgTranslate(x, y));
}
else
{
transformList.Add(new SvgTranslate(x));
}
break;
case "rotate":
string[] args = contents.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (args.Length != 1 && args.Length != 3)
{
throw new FormatException("Rotate transforms must be in the format 'rotate(angle [cx cy ])'");
}
float angle = float.Parse(args[0], NumberStyles.Float, CultureInfo.InvariantCulture);
if (args.Length == 1)
{
transformList.Add(new SvgRotate(angle));
}
else
{
float cx = float.Parse(args[1], NumberStyles.Float, CultureInfo.InvariantCulture);
float cy = float.Parse(args[2], NumberStyles.Float, CultureInfo.InvariantCulture);
transformList.Add(new SvgRotate(angle, cx, cy));
}
break;
case "scale":
string[] scales = contents.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (scales.Length == 0 || scales.Length > 2)
{
throw new FormatException("Scale transforms must be in the format 'scale(x [,y])'");
}
float sx = float.Parse(scales[0].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture);
if (scales.Length > 1)
{
float sy = float.Parse(scales[1].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture);
transformList.Add(new SvgScale(sx, sy));
}
else
{
transformList.Add(new SvgScale(sx));
}
break;
case "matrix":
string[] points = contents.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (points.Length != 6)
{
throw new FormatException("Matrix transforms must be in the format 'matrix(m11, m12, m21, m22, dx, dy)'");
}
List <float> mPoints = new List <float>();
foreach (string point in points)
{
mPoints.Add(float.Parse(point.Trim(), NumberStyles.Float, CultureInfo.InvariantCulture));
}
transformList.Add(new SvgMatrix(mPoints));
break;
case "shear":
string[] shears = contents.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (shears.Length == 0 || shears.Length > 2)
{
throw new FormatException("Shear transforms must be in the format 'shear(x [,y])'");
}
float hx = float.Parse(shears[0].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture);
if (shears.Length > 1)
{
float hy = float.Parse(shears[1].Trim(), NumberStyles.Float, CultureInfo.InvariantCulture);
transformList.Add(new SvgShear(hx, hy));
}
else
{
transformList.Add(new SvgShear(hx));
}
break;
case "skewX":
float ax = float.Parse(contents, NumberStyles.Float, CultureInfo.InvariantCulture);
transformList.Add(new SvgSkew(ax, 0));
break;
case "skewY":
float ay = float.Parse(contents, NumberStyles.Float, CultureInfo.InvariantCulture);
transformList.Add(new SvgSkew(0, ay));
break;
}
}
return(transformList);
}
return(base.ConvertFrom(context, culture, value));
}