public override string ConvertToString(object value)
        {
            if (value == null)
            {
                return(string.Empty);
            }

            var    shadow = (Shadow)value;
            string result = shadow.BlurRadius.ToString() + " | " + shadow.Color.ToString();

            result += " | " + (shadow.Offset == null ? "0, 0" : Vector2TypeConverter.ToString(shadow.Offset));
            result += " | " + (shadow.Extents == null ? "0, 0" : Vector2TypeConverter.ToString(shadow.Extents));

            return(result);
        }
        public override string ConvertToString(object value)
        {
            if (value == null)
            {
                return(string.Empty);
            }

            var    imageShadow = (ImageShadow)value;
            string result      = imageShadow.Url;

            result += " / " + (imageShadow.Offset == null ? "0, 0" : Vector2TypeConverter.ToString(imageShadow.Offset));
            result += " / " + (imageShadow.Extents == null ? "0, 0" : Vector2TypeConverter.ToString(imageShadow.Extents));

            return(result);
        }
        public override object ConvertFromInvariantString(string value)
        {
            // "blurRadius | color [| offset] [| extents]"
            // Examples
            // "1.0 | #AABBCCFF"
            // "6.2 | #AABBCC | 5, 5"
            // "8.0 | #AABBCC | 5, 5 | 7, 8"

            if (string.IsNullOrEmpty(value))
            {
                return(new Shadow(0.0f, Color.Transparent));
            }

            var items = value.Split('|');

            if (items.Length < 2 || items.Length > 4)
            {
                return(new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Shadow)}"));
            }

            var     blurRadius = Single.Parse(items[0].Trim(), CultureInfo.InvariantCulture);
            var     color      = new Color(items[1].Trim());
            Vector2 offset     = null;
            Vector2 extents    = null;

            if (items.Length > 2)
            {
                offset = Vector2TypeConverter.FromString(items[2].Trim());
            }

            if (items.Length == 4)
            {
                extents = Vector2TypeConverter.FromString(items[3].Trim());
            }

            return(new Shadow(blurRadius, color, offset, extents));
        }
        public override object ConvertFromInvariantString(string value)
        {
            // "imageUrl [| offset] [| extents]"
            // Examples
            // "*Resource*/image.9.png"
            // "*Resource*/image.9.png | 5, 5"
            // "*Resource*/image.9.png | 5, 5 | 7, 8"

            if (string.IsNullOrEmpty(value))
            {
                return(new ImageShadow(String.Empty));
            }

            var items = value.Split('|');

            if (items.Length < 1 || items.Length > 3)
            {
                return(new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(ImageShadow)}"));
            }

            var     url     = items[0].Trim();
            Vector2 offset  = null;
            Vector2 extents = null;

            if (items.Length > 1)
            {
                offset = Vector2TypeConverter.FromString(items[1].Trim());
            }

            if (items.Length == 3)
            {
                extents = Vector2TypeConverter.FromString(items[2].Trim());
            }

            return(new ImageShadow(url, offset, extents));
        }