Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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();
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Tests whether a clip path is set
        /// </summary>
        public bool IsClipPathSet()
        {
            var clipPath = cssStyleCascade.GetPropertyFromTop("clip-path");

            return(!string.IsNullOrEmpty(clipPath));
        }