public static VectorXaml GetVectorXaml(IEnumerable <string> pathCollection, Brush overrideFill) { var pathGeometryContainer = new VectorContainer(); var streamGeometryContainer = new VectorContainer(); var pathGeometry = new PathGeometry(); foreach (var pathString in pathCollection) { var path = (Path)XamlReader.Parse(pathString); if (overrideFill != Brushes.Transparent && (path.Fill == null || path.Fill.Equals(Brushes.Transparent))) { path.Fill = overrideFill; } pathGeometryContainer.AddToContainer(path); pathGeometry.AddGeometry(path.Data); } streamGeometryContainer.AddToContainer(new Path { Data = pathGeometry.Clone() }); var pathData = pathGeometry.ToString(); return(new VectorXaml { PathData = pathData, PathGeometryXaml = XamlWriter.Save(pathGeometryContainer.Container), StreamGeometryXaml = XamlWriter.Save(streamGeometryContainer.Container), XamlObject = pathGeometryContainer.Container }); }
public static PathGeometry TransformedGeometry(PathGeometry g, Transform t) { Matrix m = t.Value; double scaleX = Math.Sqrt(m.M11 * m.M11 + m.M21 * m.M21); double scaleY = (m.M11 * m.M22 - m.M12 * m.M21) / scaleX; PathGeometry ng = g.Clone(); foreach (PathFigure f in ng.Figures) { f.StartPoint = t.Transform(f.StartPoint); foreach (PathSegment s in f.Segments) { if (s is LineSegment) { (s as LineSegment).Point = t.Transform((s as LineSegment).Point); } else if (s is PolyLineSegment) { (s as PolyLineSegment).Points = TransformPoints((s as PolyLineSegment).Points, t); } else if (s is BezierSegment) { (s as BezierSegment).Point1 = t.Transform((s as BezierSegment).Point1); (s as BezierSegment).Point2 = t.Transform((s as BezierSegment).Point2); (s as BezierSegment).Point3 = t.Transform((s as BezierSegment).Point3); } else if (s is PolyBezierSegment) { (s as PolyBezierSegment).Points = TransformPoints((s as PolyBezierSegment).Points, t); } else if (s is QuadraticBezierSegment) { (s as QuadraticBezierSegment).Point1 = t.Transform((s as QuadraticBezierSegment).Point1); (s as QuadraticBezierSegment).Point2 = t.Transform((s as QuadraticBezierSegment).Point2); } else if (s is PolyQuadraticBezierSegment) { (s as PolyQuadraticBezierSegment).Points = TransformPoints((s as PolyQuadraticBezierSegment).Points, t); } else if (s is ArcSegment) { ArcSegment a = s as ArcSegment; a.Point = t.Transform(a.Point); a.Size = new Size(a.Size.Width * scaleX, a.Size.Height * scaleY); // NEVER TRIED } } } return(ng); }
private static PathGeometry ExtendPathGeometry(PathGeometry geometry, double exLength) { if (geometry.Figures.Count != 1) { throw new ArgumentException(); } PathGeometry geometry2 = (PathGeometry)geometry.Clone(); PointAndTangentDouble pointAtLength = geometry.GetPointAtLength(0.0, flatteningTolerance); VectorDouble num2 = pointAtLength.Tangent.NormalizeOrZeroCopy(); PointDouble num3 = pointAtLength.Point - ((PointDouble)(num2 * exLength)); geometry2.Figures[0].Segments.Insert(0, new LineSegment(pointAtLength.Point)); geometry2.Figures[0].StartPoint = num3; PointAndTangentDouble num4 = geometry.GetPointAtLength(double.PositiveInfinity, flatteningTolerance); VectorDouble num5 = num4.Tangent.NormalizeOrZeroCopy(); PointDouble point = num4.Point + ((PointDouble)(num5 * exLength)); geometry2.Figures[0].Segments.Add(new LineSegment(point)); return(geometry2); }
private void SubdivideSegment(PathGeometry oldGeometry, int figure, int segment, int pointIndex, double parameter, Dictionary <TimelineSceneNode, StoryboardTimelineSceneNode> subdivisionProperties) { PropertyReference propertyReference1 = new PropertyReference(this.pathProperty).Append(PathElement.FiguresProperty).Append((ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathFigureCollection, figure)); PropertyReference propertyReference2 = propertyReference1.Append(PathElement.PathFigureSegmentsProperty); PropertyReference propertyReference3 = segment != oldGeometry.Figures[figure].Segments.Count ? propertyReference2.Append((ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathSegmentCollection, segment)) : propertyReference1.Append(PathElement.PathFigureStartPointProperty); PropertyReference propertyReference4; if (segment == 0) { propertyReference4 = propertyReference1.Append(PathElement.PathFigureStartPointProperty); } else { ReferenceStep step = (ReferenceStep)IndexedClrPropertyReferenceStep.GetReferenceStep((IPlatformMetadata)this.platformMetadata, PlatformTypes.PathSegmentCollection, segment - 1); propertyReference4 = propertyReference2.Append(step).Append(this.LastPointProperty(oldGeometry.Figures[figure].Segments[segment - 1])); } PropertyReference propertyReference5 = (PropertyReference)null; if (segment == oldGeometry.Figures[figure].Segments.Count - 1 && PathFigureUtilities.IsClosed(oldGeometry.Figures[figure]) && PathFigureUtilities.IsCloseSegmentDegenerate(oldGeometry.Figures[figure])) { propertyReference5 = propertyReference1.Append(PathElement.PathFigureStartPointProperty); } foreach (StoryboardTimelineSceneNode timelineSceneNode1 in this.targetElement.ViewModel.AnimationEditor.EnumerateStoryboardsForContainer(this.targetElement.StoryboardContainer)) { Dictionary <double, List <KeyFrameSceneNode> > keyFrames1 = new Dictionary <double, List <KeyFrameSceneNode> >(); foreach (KeyValuePair <TimelineSceneNode, StoryboardTimelineSceneNode> keyValuePair in subdivisionProperties) { if (keyValuePair.Value == timelineSceneNode1) { KeyFrameAnimationSceneNode keyFrameNode = keyValuePair.Key as KeyFrameAnimationSceneNode; if (keyFrameNode != null) { this.RecordKeyFrames(keyFrames1, keyFrameNode); } } } Dictionary <double, List <KeyFrameSceneNode> > keyFrames2 = new Dictionary <double, List <KeyFrameSceneNode> >(); foreach (TimelineSceneNode timelineSceneNode2 in (IEnumerable <TimelineSceneNode>)timelineSceneNode1.Children) { if (timelineSceneNode2.TargetElement == this.targetElement && timelineSceneNode2.TargetProperty != null && (propertyReference3.Equals((object)timelineSceneNode2.TargetProperty) || propertyReference3.IsPrefixOf(timelineSceneNode2.TargetProperty) || propertyReference4.Equals((object)timelineSceneNode2.TargetProperty) || propertyReference5 != null && propertyReference5.Equals((object)timelineSceneNode2.TargetProperty))) { KeyFrameAnimationSceneNode keyFrameNode = timelineSceneNode2 as KeyFrameAnimationSceneNode; if (keyFrameNode != null) { this.RecordKeyFrames(keyFrames2, keyFrameNode); } } } foreach (KeyValuePair <double, List <KeyFrameSceneNode> > keyValuePair in keyFrames2) { PathGeometry path = oldGeometry.Clone(); PathGeometryEditor pathGeometryEditor = new PathGeometryEditor(path); foreach (KeyFrameSceneNode keyFrameSceneNode in keyValuePair.Value) { PropertyReference propertyReference6 = this.targetElement.ViewModel.DefaultView.ConvertToWpfPropertyReference(keyFrameSceneNode.TargetProperty.Subreference(1)); object valueToSet = this.targetElement.ViewModel.DefaultView.ConvertToWpfValue(keyFrameSceneNode.Value); propertyReference6.SetValue((object)path, valueToSet); } pathGeometryEditor.SubdivideSegment(figure, pointIndex, parameter); List <KeyFrameSceneNode> list; if (keyFrames1.TryGetValue(keyValuePair.Key, out list)) { foreach (KeyFrameSceneNode keyFrameSceneNode in list) { object obj = this.targetElement.ViewModel.DefaultView.ConvertFromWpfValue(this.targetElement.ViewModel.DefaultView.ConvertToWpfPropertyReference(keyFrameSceneNode.TargetProperty.Subreference(1)).GetCurrentValue((object)path)); keyFrameSceneNode.Value = obj; } } } } }