public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value == null)
{
return new SvgUnit(SvgUnitType.User, 0.0f);
}
if (!(value is string))
{
throw new ArgumentOutOfRangeException("value must be a string.");
}
//support exponents (the SVG that comes back from IE may be an exponent ugh!!!)
if ((value as string).Contains("e"))
{
var d = Decimal.Parse((string)value, System.Globalization.NumberStyles.Float);
value = d.ToString();
}
// http://www.w3.org/TR/CSS21/syndata.html#values
// http://www.w3.org/TR/SVG11/coords.html#Units
string unit = (string)value;
int identifierIndex = -1;
if (unit == "none")
return SvgUnit.None;
for (int i = 0; i < unit.Length; i++)
{
if (char.IsLetter(unit[i]) || unit[i] == '%')
{
identifierIndex = i;
break;
}
}
float val = 0.0f;
float.TryParse((identifierIndex > -1) ? unit.Substring(0, identifierIndex) : unit, NumberStyles.Float, CultureInfo.InvariantCulture, out val);
if (identifierIndex == -1)
{
return new SvgUnit(val);
}
switch (unit.Substring(identifierIndex).Trim().ToLower())
{
case "mm":
return new SvgUnit(SvgUnitType.Millimeter, val);
case "cm":
return new SvgUnit(SvgUnitType.Centimeter, val);
case "in":
return new SvgUnit(SvgUnitType.Inch, val);
case "px":
return new SvgUnit(SvgUnitType.Pixel, val);
case "pt":
return new SvgUnit(SvgUnitType.Point, val);
case "pc":
return new SvgUnit(SvgUnitType.Pica, val);
case "%":
return new SvgUnit(SvgUnitType.Percentage, val);
case "em":
return new SvgUnit(SvgUnitType.Em, val);
default:
throw new FormatException("Unit is in an invalid format '" + unit + "'.");
}
}