static Transform CreateNormalizeTransform(Rect bounds, Point location, Size size, double angle) { var t = new TransformGroup(); var b = bounds; // Move center of the geometry to origin t.Children.Add(new TranslateTransform(-b.X - b.Width / 2, -b.Y - b.Height / 2)); // Rotate around origin t.Children.Add(new RotateTransform(angle)); b = t.TransformBounds(bounds); // Scale to requested size t.Children.Add(new ScaleTransform(size.Width / b.Width, size.Height / b.Height)); b = t.TransformBounds(bounds); // Move to requested position t.Children.Add(new TranslateTransform(-b.X + location.X, -b.Y + location.Y)); t.Freeze(); b = t.TransformBounds(bounds); Debug.Assert(Math.Abs(b.X - location.X) < 0.0001); Debug.Assert(Math.Abs(b.Y - location.Y) < 0.0001); Debug.Assert(Math.Abs(b.Width - size.Width) < 0.0001); Debug.Assert(Math.Abs(b.Height - size.Height) < 0.0001); return(t); }
public DrawHandler(WindowGraphics windowGraphics) { this.windowGraphics = windowGraphics; windowGraphics.TryUpdateGraphics(); DrawingContext = windowGraphics.drawingVisual.RenderOpen(); var transformGroup = new TransformGroup(); transformGroup.Children.Add(new ScaleTransform(1, -1)); transformGroup.Children.Add(new TranslateTransform(0, windowGraphics.height)); transformGroup.Freeze(); DrawingContext.PushTransform(transformGroup); }
/// <summary> </summary> public override void InitializeTransform() { const double mercatorSize = 360; var translateTransform = new TranslateTransform(MapView.ReferenceSize / 2 - 180, MapView.ReferenceSize / 2 - 180); var zoomTransform = new ScaleTransform(MapView.ZoomAdjust * MapView.ReferenceSize / mercatorSize, MapView.ZoomAdjust * MapView.ReferenceSize / mercatorSize, MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var transformGroup = new TransformGroup(); transformGroup.Children.Add(translateTransform); transformGroup.Children.Add(zoomTransform); zoomTransform.Freeze(); translateTransform.Freeze(); transformGroup.Freeze(); RenderTransform = transformGroup; }
protected virtual void UpdateChildren() { if (this.designerView == null) { return; } double zoom = this.Zoom; Vector rootToArtboardScale = this.ViewRootToArtboardScale; rootToArtboardScale.X *= zoom; rootToArtboardScale.Y *= zoom; this.designerView.ZoomLevel = this.Zoom; double centerX = this.CenterX; double centerY = this.CenterY; TransformGroup transformGroup1 = new TransformGroup(); transformGroup1.Children.Add((Transform) new ScaleTransform(rootToArtboardScale.X, rootToArtboardScale.Y, centerX, centerY)); transformGroup1.Children.Add((Transform) new TranslateTransform(this.canvas.RenderSize.Width / 2.0 - centerX, this.canvas.RenderSize.Height / 2.0 - centerY)); Point point = this.TranslatePoint(new Point(1.0 / rootToArtboardScale.X, 1.0 / rootToArtboardScale.Y) * transformGroup1.Value, this.VisualTreeRoot); point.X = Math.Round(point.X) - point.X; point.Y = Math.Round(point.Y) - point.Y; transformGroup1.Children.Add((Transform) new TranslateTransform(point.X, point.Y)); transformGroup1.Freeze(); this.designerView.RenderTransform = (Transform)transformGroup1; this.feedbackLayer.RenderTransform = (Transform)transformGroup1; this.liveControlLayer.RenderTransform = (Transform)transformGroup1; this.annotationLayer.RenderTransform = (Transform)transformGroup1; foreach (Artboard.ExtraLayer extraLayer in this.extraLayers) { TransformGroup transformGroup2 = transformGroup1; if (ArtboardExtraLayerOptionsExtensions.IsSet(extraLayer.Options, ArtboardExtraLayerOptions.OriginIsDocumentCenter)) { transformGroup2 = new TransformGroup(); transformGroup2.Children.Add((Transform) new TranslateTransform(this.DocumentBounds.Width / 2.0, this.DocumentBounds.Height / 2.0)); transformGroup2.Children.Add((Transform)transformGroup1); transformGroup2.Freeze(); } extraLayer.Layer.RenderTransform = (Transform)transformGroup2; } this.annotationLayer.ChildRenderTransform = (Transform) new ScaleTransform(1.0 / zoom, 1.0 / zoom, 0.0, 0.0); this.contentBorder.BorderThickness = new Thickness(1.0 / rootToArtboardScale.X); this.transform = (Transform)transformGroup1; this.snapToGridRenderer.InvalidateVisual(); }
protected override void OnRender(DrawingContext drawingContext) { var view = this.TextView; if (view == null || !view.VisualLinesValid) { return; } if (!Workspace.CurrentWorkspace.DebugContext.IsDebuggerAttached) { return; } if (!Workspace.CurrentWorkspace.DebugContext.IsPaused) { return; } if (Workspace.CurrentWorkspace.CurrentDocument != Workspace.CurrentWorkspace.DebugContext.CurrentDocument) { return; } var color = new SolidColorBrush(ConfigHost.Coloring.ExecutionMarker.MainColor); color.Freeze(); var pen = new Pen(new SolidColorBrush(ConfigHost.Coloring.ExecutionMarker.BorderColor), 2); pen.Freeze(); var line = view.GetVisualLine(Workspace.CurrentWorkspace.DebugContext.CurrentLine); if (line == null) { return; } var lineTop = line.GetTextLineVisualYPosition(line.TextLines[0], VisualYPosition.TextTop) - view.VerticalOffset; var lineBot = line.GetTextLineVisualYPosition(line.TextLines[0], VisualYPosition.TextBottom) - view.VerticalOffset; var geo = new StreamGeometry(); using (var context = geo.Open()) { context.BeginFigure(new Point(3, 5), true, true); context.LineTo(new Point(6, 5), false, false); context.LineTo(new Point(6, 2), false, false); context.LineTo(new Point(10, 6.5), false, false); context.LineTo(new Point(6, 11), false, false); context.LineTo(new Point(6, 8), false, false); context.LineTo(new Point(3, 8), false, false); } var transgroup = new TransformGroup(); Transform t; t = new TranslateTransform(-16, lineTop); t.Freeze(); transgroup.Children.Add(t); t = new ScaleTransform((lineBot - lineTop) / 14, (lineBot - lineTop) / 14); t.Freeze(); transgroup.Children.Add(t); transgroup.Freeze(); geo.Transform = transgroup; geo.Freeze(); drawingContext.DrawGeometry(color, pen, geo); }
/// <summary> Returns a Transform object for a spatial reference. </summary> /// <param name="reference"> The spatial reference. </param> /// <returns> The resulting render transform. </returns> public static Transform CreateTransform(SpatialReference reference) { switch (reference) { case SpatialReference.PtvMercator: { const double EARTH_RADIUS = 6371000.0; const double MERCATOR_SIZE = EARTH_RADIUS * 2.0 * Math.PI; var translateTransform = new TranslateTransform(MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var zoomTransform = new ScaleTransform(MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, -MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var transformGroup = new TransformGroup(); transformGroup.Children.Add(translateTransform); transformGroup.Children.Add(zoomTransform); zoomTransform.Freeze(); translateTransform.Freeze(); transformGroup.Freeze(); return(transformGroup); } case SpatialReference.PtvMercatorInvertedY: { const double EARTH_RADIUS = 6371000.0; const double MERCATOR_SIZE = EARTH_RADIUS * 2.0 * Math.PI; var translateTransform = new TranslateTransform(MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var zoomTransform = new ScaleTransform(MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var transformGroup = new TransformGroup(); transformGroup.Children.Add(translateTransform); transformGroup.Children.Add(zoomTransform); zoomTransform.Freeze(); translateTransform.Freeze(); transformGroup.Freeze(); return(transformGroup); } case SpatialReference.WebMercator: { const double EARTH_RADIUS = 6378137.0; const double MERCATOR_SIZE = EARTH_RADIUS * 2.0 * Math.PI; var translateTransform = new TranslateTransform(MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var zoomTransform = new ScaleTransform(MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, -MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var transformGroup = new TransformGroup(); transformGroup.Children.Add(translateTransform); transformGroup.Children.Add(zoomTransform); zoomTransform.Freeze(); translateTransform.Freeze(); transformGroup.Freeze(); return(transformGroup); } case SpatialReference.WebMercatorInvertedY: { const double EARTH_RADIUS = 6378137.0; const double MERCATOR_SIZE = EARTH_RADIUS * 2.0 * Math.PI; var translateTransform = new TranslateTransform(MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var zoomTransform = new ScaleTransform(MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, MapView.ZoomAdjust * MapView.ReferenceSize / MERCATOR_SIZE, MapView.ReferenceSize / 2, MapView.ReferenceSize / 2); var transformGroup = new TransformGroup(); transformGroup.Children.Add(translateTransform); transformGroup.Children.Add(zoomTransform); zoomTransform.Freeze(); translateTransform.Freeze(); transformGroup.Freeze(); return(transformGroup); } default: throw new ArgumentException("not supported"); } }