public static SKPath?GetClipPathClipPath(SvgClipPath svgClipPath, SKRect skBounds, HashSet <Uri> uris, CompositeDisposable disposable) { var svgClipPathRef = svgClipPath.GetUriElementReference <SvgClipPath>("clip-path", uris); if (svgClipPathRef == null || svgClipPathRef.Children == null) { return(null); } var clipPath = GetClipPath(svgClipPathRef, skBounds, uris, disposable); if (clipPath != null) { var skMatrix = SKMatrix.MakeIdentity(); if (svgClipPathRef.ClipPathUnits == SvgCoordinateUnits.ObjectBoundingBox) { var skScaleMatrix = SKMatrix.MakeScale(skBounds.Width, skBounds.Height); SKMatrix.PostConcat(ref skMatrix, ref skScaleMatrix); var skTranslateMatrix = SKMatrix.MakeTranslation(skBounds.Left, skBounds.Top); SKMatrix.PostConcat(ref skMatrix, ref skTranslateMatrix); } var skTransformsMatrix = SvgTransformsExtensions.ToSKMatrix(svgClipPathRef.Transforms); SKMatrix.PostConcat(ref skMatrix, ref skTransformsMatrix); clipPath.Transform(skMatrix); } return(clipPath); }
private static SvgGroup GetDataGroup(float left, float top, IReadOnlyList <DataPoint> data) { SvgGroup group = Group(left, top); var definitions = new SvgDefinitionList(); var clip = new SvgClipPath() { ID = "data-clip" }; clip.Children.Add(Rect(0, 0, ChartWidth, ChartHeight)); definitions.Children.Add(clip); group.Children.Add(definitions); group.Children.Add(GetChartGroup(0, 0)); group.Children.Add(GetDayGroup(0, ChartHeight)); group.Children.Add(GetDateGroup(0, ChartHeight + DayRow)); for (int i = 0; i <= TotalDays * SegmentsPerDay; i++) { float x = i * SegmentWidth; bool endOfWeek = (i % (SegmentsPerDay * DaysPerWeek)) == 0; bool endOfDay = (i % SegmentsPerDay) == 0; group.Children.Add(Line(x, 0, x, endOfDay ? DataHeight : ChartHeight, endOfWeek ? 2.5f : 1f)); } group.Children.Add(Line(0, ChartHeight + DayRow, ChartWidth, ChartHeight + DayRow)); var chartDataGroup = GetChartDataGroup(0, 0, data); chartDataGroup.ClipPath = new Uri(string.Format("url(#{0})", clip.ID), UriKind.Relative); group.Children.Add(chartDataGroup); group.Children.Add(GetDaysDataGroup(0, ChartHeight, data.First().Time.Date)); return(group); }
private static SvgClipRule?GetSvgClipRule(SvgClipPath svgClipPath) { TryGetAttribute(svgClipPath, "clip-rule", out var clipRuleString); return(clipRuleString switch { "nonzero" => SvgClipRule.NonZero, "evenodd" => SvgClipRule.EvenOdd, // TODO: SvgClipRule.Inherit "inherit" => SvgClipRule.Inherit, _ => null });
public static SKPath?GetClipPath(SvgClipPath svgClipPath, SKRect skBounds, HashSet <Uri> uris, CompositeDisposable disposable) { var skPathClip = default(SKPath); var clipPathClipPath = GetClipPathClipPath(svgClipPath, skBounds, uris, disposable); if (clipPathClipPath != null && !clipPathClipPath.IsEmpty) { skPathClip = clipPathClipPath; } var clipPath = GetClipPath(svgClipPath.Children, skBounds, uris, disposable); if (clipPath != null) { var skMatrix = SKMatrix.MakeIdentity(); if (svgClipPath.ClipPathUnits == SvgCoordinateUnits.ObjectBoundingBox) { var skScaleMatrix = SKMatrix.MakeScale(skBounds.Width, skBounds.Height); SKMatrix.PostConcat(ref skMatrix, ref skScaleMatrix); var skTranslateMatrix = SKMatrix.MakeTranslation(skBounds.Left, skBounds.Top); SKMatrix.PostConcat(ref skMatrix, ref skTranslateMatrix); } var skTransformsMatrix = SvgTransformsExtensions.ToSKMatrix(svgClipPath.Transforms); SKMatrix.PostConcat(ref skMatrix, ref skTransformsMatrix); clipPath.Transform(skMatrix); if (skPathClip == null) { skPathClip = clipPath; } else { var result = skPathClip.Op(clipPath, SKPathOp.Intersect); disposable.Add(result); skPathClip = result; } } if (skPathClip == null) { skPathClip = new SKPath(); disposable.Add(skPathClip); } return(skPathClip); }