Beispiel #1
0
        public static void ProcessStyleValue(XElement svgElement, string styleText, BaseElement avElement, List <string> warnings, bool local = false)
        {
            if (!string.IsNullOrWhiteSpace(styleText))
            {
                var styleParts = styleText.Split(';');
                foreach (var part in styleParts)
                {
                    if (string.IsNullOrWhiteSpace(part))
                    {
                        continue;
                    }
                    var tokens = part.Split(':');
                    if (tokens.Length == 2)
                    {
                        var cmd   = tokens[0].Trim();
                        var value = tokens[1].Trim();
                        if (AttributeMap.TryGetValue(cmd, out string avAtrName))
                        {
                            /*
                             * if (value == "inherit" && svgElement.InheritedAttributeValue(cmd) is string inheritedValue)
                             * {
                             *  // do nothing because style attributes are already inherited (and thus, should have already been set before reaching here)
                             * }
                             * else */
                            if (cmd == "fill" || cmd == "stroke")
                            {
                                SetColorStyleValue(cmd, avAtrName, value, svgElement, avElement, warnings);
                            }
                            else if (cmd == "stroke-fill")
                            {
                                SetColorStyleValue("fill", AttributeMap["fill"], value, svgElement, avElement, warnings);
                                SetColorStyleValue("stroke", AttributeMap["stroke"], value, svgElement, avElement, warnings);
                            }

                            /*
                             * {
                             * if (value == "none")
                             * {
                             *  avElement.SetAndroidAttributeValue(avAtrName, value);
                             * }
                             * else if (value.StartsWith("url("))
                             * {
                             *  if (!value.StartsWith("url(#"))
                             *      throw new Exception("Only anchor URLs are supported at this time.");
                             *
                             *  //var iri = value.Substring("url(#".Length).Trim(')').Trim();
                             *  var iri = value.SubstringWithTerminator("url(#".Length, ')').Trim();
                             *  if (svgElement.GetRoot() is XElement root)
                             *  {
                             *      if (root.Descendants(Namespace.Svg + "linearGradient").FirstOrDefault(e => e.Attribute("id").Value == iri) is XElement svgLinearGradient)
                             *      {
                             *          if (PaintConverter.ConvertLinearGradient(svgLinearGradient, warnings) is LinearGradient avGradient)
                             *          {
                             *              if (avElement.Element(AndroidVector.Namespace.Aapt + "attr") is XElement aaptAttr)
                             *                  aaptAttr.Remove();
                             *              var aapt = new AaptAttr(cmd + "Color", avGradient);
                             *              avElement.Add(aapt);
                             *              avElement.SetAndroidAttributeValue(avAtrName, null);
                             *              return;
                             *          }
                             *      }
                             *      if (root.Descendants(Namespace.Svg + "radialGradient").FirstOrDefault(e => e.Attribute("id").Value == iri) is XElement svgRadialGradient)
                             *      {
                             *          if (PaintConverter.ConvertRadialGradient(svgRadialGradient, warnings) is RadialGradient avGradient)
                             *          {
                             *              if (avElement.Element(AndroidVector.Namespace.Aapt + "attr") is XElement aaptAttr)
                             *                  aaptAttr.Remove();
                             *              var aapt = new AaptAttr(cmd+"Color", avGradient);
                             *              avElement.Add(aapt);
                             *              avElement.SetAndroidAttributeValue(avAtrName, null);
                             *              return;
                             *          }
                             *      }
                             *      warnings.AddWarning("Ignoring gradient because no element found to complete link [" + value + "].");
                             *      return;
                             *  }
                             *  throw new Exception("Could not find document root");
                             *
                             * }
                             * else
                             * {
                             *  var (hexColor, opacity) = GetHexColorAndFloatOpacity(value, warnings);
                             *  avElement.SetAndroidAttributeValue(avAtrName, hexColor);
                             *  if (!float.IsNaN(opacity))
                             *      avElement.SetAndroidAttributeValue(cmd + "Alpha", opacity);
                             * }
                             *
                             * } */
                            else if (cmd == "stroke-width")
                            {
                                ElementExtensions.TryGetValueInPx(svgElement, value, Orientation.Unknown, out float strokeWidth);
                                avElement.SetAndroidAttributeValue(avAtrName, strokeWidth);
                            }
                            else if (cmd == "fill-rule")
                            {
                                if (value == "evenodd")
                                {
                                    avElement.SetAndroidAttributeValue(avAtrName, AndroidVector.FillType.EvenOdd.ToString().ToCamelCase());
                                }
                                else if (value == "nonzero")
                                {
                                    avElement.SetAndroidAttributeValue(avAtrName, AndroidVector.FillType.NonZero.ToString().ToCamelCase());
                                }
                                else
                                {
                                    warnings.AddWarning("Ignoring fill-rule because value [" + value + "] in <" + svgElement?.Name + " id='" + svgElement?.Attribute("id")?.Value + "'> is unexpected.");
                                }
                            }
                            else if (cmd == "stroke-linecap" || cmd == "stroke-linejoin")
                            {
                                avElement.SetAndroidAttributeValue(avAtrName, value.ToCamelCase());
                                var attr = avElement.AndroidAttribute(avAtrName);
                                if (avElement is AndroidVector.Path path)
                                {
                                    var cap  = path.StrokeLineCap;
                                    var join = path.StrokeLineJoin;
                                }
                            }
                            else
                            {
                                avElement.SetAndroidAttributeValue(avAtrName, value);
                            }
                        }
                        else if (cmd == "display")
                        {
                            avElement.SvgDisplayStyle = value;
                        }
                        else if (cmd == "visibility")
                        {
                            avElement.SvgDisplayStyle = (value == "hidden" || value == "collapse")
                                ? "none"
                                : "visible";
                        }
                        else if (cmd == "opacity" && local)
                        {
                            if (float.TryParse(value, out float opacity))
                            {
                                avElement.SvgOpacity = opacity;
                            }

                            /*
                             * {
                             * if (avElement.AndroidAttribute("fillAlpha") is XAttribute fillAlphaAttribute &&
                             * float.TryParse(fillAlphaAttribute.Value, out float fillAlpha))
                             *  avElement.SetAndroidAttributeValue("fillAlpha", fillAlpha * opacity);
                             * else
                             *  avElement.SetAndroidAttributeValue("fillAlpha", opacity);
                             * if (avElement.AndroidAttribute("strokeAlpha") is XAttribute strokeAlphaAttribute &&
                             * float.TryParse(strokeAlphaAttribute.Value, out float strokeAlpha))
                             *  avElement.SetAndroidAttributeValue("strokeAlpha", strokeAlpha * opacity);
                             * else
                             *  avElement.SetAndroidAttributeValue("strokeAlpha", opacity);
                             * }
                             */
                        }
                        else if (!IgnoreAttributeMap.Contains(cmd))
                        {
                            warnings.AddWarning("Ignoring SVG style [" + cmd + "] because could not map to an AndroidVector attribute.");
                        }
                    }
                    else
                    {
                        warnings.AddWarning("Ignoring SVG style [" + part + "] in <" + svgElement?.Name + " id='" + svgElement?.Attribute("id")?.Value + "'> because could not parce into a style and a value.");
                    }
                }
            }
        }