/// <summary> /// Set the clipping of the group /// </summary> public static void SetClipPath(GraphicGroup group, Matrix currentTransformationMatrix, CssStyleCascade cssStyleCascade, Dictionary <string, XElement> globalDefinitions) { var clipPath = cssStyleCascade.GetPropertyFromTop("clip-path"); if (string.IsNullOrEmpty(clipPath)) { return; } if (!clipPath.StartsWith("url(", StringComparison.OrdinalIgnoreCase)) { return; } int endUri = clipPath.IndexOf(")", StringComparison.OrdinalIgnoreCase); var uri = clipPath.Substring(4, endUri - 4); uri = uri.Trim(); var id = uri.Substring(1); if (!globalDefinitions.ContainsKey(id)) { return; } var clipElem = globalDefinitions[id]; // richt now we support only a single path for the clip geometry var shapeElement = clipElem.Elements().First(); if (shapeElement == null) { return; } var clipGeometry = GeometryParser.Parse(shapeElement, currentTransformationMatrix); clipGeometry.FillRule = GraphicFillRule.NoneZero; var clipRule = cssStyleCascade.GetProperty("clip-rule"); if (!string.IsNullOrEmpty(clipRule)) { switch (clipRule) { case "evenodd": clipGeometry.FillRule = GraphicFillRule.EvenOdd; break; case "nonzero": clipGeometry.FillRule = GraphicFillRule.NoneZero; break; } } group.Clip = clipGeometry; }
/// <summary> /// Get common gradient properties for linear and radial gradient /// </summary> private void GetCommonGradientProperties(XElement gradientElem, double opacity, GraphicGradientBrush gradientBrush) { var gradientUnitsAttribute = gradientElem.Attribute("gradientUnits"); if (gradientUnitsAttribute != null) { switch (gradientUnitsAttribute.Value) { case "userSpaceOnUse": gradientBrush.MappingMode = GraphicBrushMappingMode.Absolute; break; case "objectBoundingBox": gradientBrush.MappingMode = GraphicBrushMappingMode.RelativeToBoundingBox; break; } } foreach (var stopElem in gradientElem.Elements(svgNamespace + "stop")) { cssStyleCascade.PushStyles(stopElem); var stop = new GraphicGradientStop(); gradientBrush.GradientStops.Add(stop); double retVal; (_, retVal) = doubleParser.GetNumberPercent(stopElem, "offset", 0); stop.Position = retVal; var stopOpacity = cssStyleCascade.GetNumberPercentFromTop("stop-opacity", 1); var colorAttr = cssStyleCascade.GetPropertyFromTop("stop-color"); if (colorAttr != null && ColorParser.TryParseColor(colorAttr, opacity * stopOpacity, out Color color)) { stop.Color = color; } else { stop.Color = Colors.Black; } cssStyleCascade.Pop(); } }
/// <summary> /// Tests whether a clip path is set /// </summary> public bool IsClipPathSet() { var clipPath = cssStyleCascade.GetPropertyFromTop("clip-path"); return(!string.IsNullOrEmpty(clipPath)); }