Exemplo n.º 1
0
        static float[] ParseVector(YamlNode node, int count)
        {
            switch (node)
            {
            case YamlScalarNode scalar:
                var parts = scalar.Value.Split(',');

                if (parts.Length == 1)     // scalar shorthand
                {
                    var a = new float[count];
                    var n = node.ToSingle(parts[0]);

                    for (var i = 0; i < count; i++)
                    {
                        a[i] = n;
                    }

                    return(a);
                }

                if (parts.Length == count)
                {
                    var a = new float[count];

                    for (var i = 0; i < count; i++)
                    {
                        a[i] = node.ToSingle(parts[i]);
                    }

                    return(a);
                }

                break;

            case YamlSequenceNode sequence when sequence.Children.Count == count:
            {
                var a = new float[count];

                for (var i = 0; i < count; i++)
                {
                    a[i] = sequence[i].ToSingle();
                }

                return(a);
            }
            }

            throw new YamlComponentException($"Must be a scalar or sequence containing {count} components.", node);
        }
Exemplo n.º 2
0
        static Color4 ParseColor(YamlNode node)
        {
            var value = node.ToScalar().Value;

            if (ParseColorString(value, node, out var color))
            {
                return(color);
            }

            var parts = value.Split(',');

            switch (parts.Length)
            {
            // name, alpha
            case 2:
                if (!ParseColorString(parts[0], node, out color))
                {
                    throw new YamlComponentException($"Cannot convert '{parts[0]}' to named color.", node);
                }

                color.A = node.ToSingle(parts[1]);

                return(color);

            // r, g, b, [alpha]
            case 3:
            case 4:
                return(new Color4(
                           node.ToSingle(parts[0]) / byte.MaxValue,
                           node.ToSingle(parts[1]) / byte.MaxValue,
                           node.ToSingle(parts[2]) / byte.MaxValue,
                           parts.Length == 4 ? node.ToSingle(parts[3]) : 1)); // alpha is [0, 1] so we don't divide
            }

            throw new YamlComponentException("Must be a scalar containing three or four components representing R, G, B and optionally A.", node);
        }
Exemplo n.º 3
0
        public IPropProvider Resolve(ComponentBuilderContext context, ElementBuilder element, PropTypeInfo prop, YamlNode node)
        {
            if (prop.Type != typeof(FontUsage))
            {
                return(null);
            }

            switch (node)
            {
            case YamlScalarNode scalar:
                var parts = scalar.Value.Split(',');

                switch (parts.Length)
                {
                case 1:
                    return(new Provider(FontUsage.Default.With(family: parts[0])));

                case 2:
                    return(new Provider(FontUsage.Default.With(family: parts[0], size: node.ToSingle(parts[1]))));

                default: throw new YamlComponentException("Must be a scalar that indicates the font family name and an optional font size.", node);
                }

            case YamlMappingNode mapping:
                var usage = FontUsage.Default;

                foreach (var(keyNode, valueNode) in mapping)
                {
                    var key = keyNode.ToScalar().Value;

                    switch (key)
                    {
                    case "family":
                        usage = usage.With(family: valueNode.ToScalar().Value);
                        break;

                    case "weight":
                        usage = usage.With(weight: valueNode.ToScalar().Value);
                        break;

                    case "italics":
                        usage = usage.With(italics: valueNode.ToBoolean());
                        break;

                    case "size":
                        usage = usage.With(size: valueNode.ToSingle());
                        break;

                    case "fixed":
                        usage = usage.With(fixedWidth: valueNode.ToBoolean());
                        break;

                    default:
                        throw new YamlComponentException($"Invalid font property '{key}'.", keyNode);
                    }
                }

                return(new Provider(usage));

            default:
                throw new YamlComponentException("Must be a scalar or sequence.", node);
            }
        }