/// <summary> /// Exports the specified plot model to a stream. /// </summary> /// <param name="model">The plot model.</param> /// <param name="stream">The stream to write to.</param> /// <param name="width">The width of the export image.</param> /// <param name="height">The height of the exported image.</param> /// <param name="background">The background.</param> public static void Export(IPlotModel model, Stream stream, double width, double height, OxyColor background) { var canvas = new Canvas { Width = width, Height = height }; if (background.IsVisible()) { canvas.Background = background.ToBrush(); } canvas.Measure(new Size(width, height)); canvas.Arrange(new Rect(0, 0, width, height)); var rc = new SilverlightRenderContext(canvas); model.Update(true); model.Render(rc, width, height); canvas.UpdateLayout(); var image = canvas.ToImage(); image.WriteToStream(stream); }
/// <summary> /// Gets the cached brush. /// </summary> /// <param name="fill">The fill color.</param> /// <returns>A <see cref="Brush" />.</returns> private Brush GetCachedBrush(OxyColor fill) { Brush brush; if (this.brushes.TryGetValue(fill, out brush)) { return brush; } return this.brushes[fill] = fill.ToBrush(); }
/// <summary> /// Draws the text. /// </summary> /// <param name="p">The p.</param> /// <param name="text">The text.</param> /// <param name="fill">The fill color.</param> /// <param name="fontFamily">The font family.</param> /// <param name="fontSize">Size of the font.</param> /// <param name="fontWeight">The font weight.</param> /// <param name="rotate">The rotation angle.</param> /// <param name="halign">The horizontal alignment.</param> /// <param name="valign">The vertical alignment.</param> /// <param name="maxSize">The maximum size of the text.</param> public override void DrawText( ScreenPoint p, string text, OxyColor fill, string fontFamily, double fontSize, double fontWeight, double rotate, HorizontalAlignment halign, VerticalAlignment valign, OxySize? maxSize) { if (text == null) { return; } var fontStyle = fontWeight < 700 ? FontStyle.Regular : FontStyle.Bold; using (var font = CreateFont(fontFamily, fontSize, fontStyle)) { this.stringFormat.Alignment = StringAlignment.Near; this.stringFormat.LineAlignment = StringAlignment.Near; var size = this.g.MeasureString(text, font, int.MaxValue, this.stringFormat); if (maxSize != null) { if (size.Width > maxSize.Value.Width) { size.Width = (float)maxSize.Value.Width; } if (size.Height > maxSize.Value.Height) { size.Height = (float)maxSize.Value.Height; } } float dx = 0; if (halign == HorizontalAlignment.Center) { dx = -size.Width / 2; } if (halign == HorizontalAlignment.Right) { dx = -size.Width; } float dy = 0; this.stringFormat.LineAlignment = StringAlignment.Near; if (valign == VerticalAlignment.Middle) { dy = -size.Height / 2; } if (valign == VerticalAlignment.Bottom) { dy = -size.Height; } var graphicsState = this.g.Save(); this.g.TranslateTransform((float)p.X, (float)p.Y); var layoutRectangle = new RectangleF(0, 0, size.Width, size.Height); if (Math.Abs(rotate) > double.Epsilon) { this.g.RotateTransform((float)rotate); layoutRectangle.Height += (float)(fontSize / 18.0); } this.g.TranslateTransform(dx, dy); this.g.DrawString(text, font, fill.ToBrush(), layoutRectangle, this.stringFormat); this.g.Restore(graphicsState); } }
/// <summary> /// Draws the rectangle. /// </summary> /// <param name="rect">The rectangle.</param> /// <param name="fill">The fill color.</param> /// <param name="stroke">The stroke color.</param> /// <param name="thickness">The stroke thickness.</param> public override void DrawRectangle(OxyRect rect, OxyColor fill, OxyColor stroke, double thickness) { if (fill.IsVisible()) { this.g.FillRectangle( fill.ToBrush(), (float)rect.Left, (float)rect.Top, (float)rect.Width, (float)rect.Height); } if (stroke.IsInvisible() || thickness <= 0) { return; } using (var pen = this.CreatePen(stroke, thickness)) { this.g.DrawRectangle(pen, (float)rect.Left, (float)rect.Top, (float)rect.Width, (float)rect.Height); } }
/// <summary> /// Draws the polygon from the specified points. The polygon can have stroke and/or fill. /// </summary> /// <param name="points">The points.</param> /// <param name="fill">The fill color.</param> /// <param name="stroke">The stroke color.</param> /// <param name="thickness">The stroke thickness.</param> /// <param name="dashArray">The dash array.</param> /// <param name="lineJoin">The line join type.</param> /// <param name="aliased">if set to <c>true</c> the shape will be aliased.</param> public override void DrawPolygon( IList<ScreenPoint> points, OxyColor fill, OxyColor stroke, double thickness, double[] dashArray, OxyPlot.LineJoin lineJoin, bool aliased) { if (points.Count < 2) { return; } this.g.SmoothingMode = aliased ? SmoothingMode.None : SmoothingMode.HighQuality; var pts = this.ToPoints(points); if (fill.IsVisible()) { this.g.FillPolygon(fill.ToBrush(), pts); } if (stroke.IsInvisible() || thickness <= 0) { return; } using (var pen = this.CreatePen(stroke, thickness)) { if (dashArray != null) { pen.DashPattern = this.ToFloatArray(dashArray); } switch (lineJoin) { case OxyPlot.LineJoin.Round: pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; break; case OxyPlot.LineJoin.Bevel: pen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel; break; // The default LineJoin is Miter } this.g.DrawPolygon(pen, pts); } }
/// <summary> /// Gets the cached brush. /// </summary> /// <param name="fill">The fill color.</param> /// <returns>A <see cref="Brush" />.</returns> private Brush GetCachedBrush(OxyColor fill) { // TODO: cache return fill.ToBrush(); }
/// <summary> /// Draws the text. /// </summary> /// <param name="p">The p.</param> /// <param name="text">The text.</param> /// <param name="fill">The fill color.</param> /// <param name="fontFamily">The font family.</param> /// <param name="fontSize">Size of the font.</param> /// <param name="fontWeight">The font weight.</param> /// <param name="rotate">The rotation angle.</param> /// <param name="halign">The horizontal alignment.</param> /// <param name="valign">The vertical alignment.</param> /// <param name="maxSize">The maximum size of the text.</param> public override void DrawText( ScreenPoint p, string text, OxyColor fill, string fontFamily, double fontSize, double fontWeight, double rotate, HorizontalAlignment halign, VerticalAlignment valign, OxySize? maxSize) { var fs = FontStyle.Regular; if (fontWeight >= 700) { fs = FontStyle.Bold; } using (var font = new Font(fontFamily, (float)fontSize * FontsizeFactor, fs)) { using (var sf = new StringFormat { Alignment = StringAlignment.Near }) { var size = this.g.MeasureString(text, font); if (maxSize != null) { if (size.Width > maxSize.Value.Width) { size.Width = (float)maxSize.Value.Width; } if (size.Height > maxSize.Value.Height) { size.Height = (float)maxSize.Value.Height; } } float dx = 0; if (halign == HorizontalAlignment.Center) { dx = -size.Width / 2; } if (halign == HorizontalAlignment.Right) { dx = -size.Width; } float dy = 0; sf.LineAlignment = StringAlignment.Near; if (valign == VerticalAlignment.Middle) { dy = -size.Height / 2; } if (valign == VerticalAlignment.Bottom) { dy = -size.Height; } this.g.TranslateTransform((float)p.X, (float)p.Y); if (Math.Abs(rotate) > double.Epsilon) { this.g.RotateTransform((float)rotate); } this.g.TranslateTransform(dx, dy); var layoutRectangle = new RectangleF(0, 0, size.Width + 0.1f, size.Height + 0.1f); this.g.DrawString(text, font, fill.ToBrush(), layoutRectangle, sf); this.g.ResetTransform(); } } }