/// <summary> /// Creates the specified pen. /// </summary> /// <param name="color">The color.</param> /// <param name="thickness">The thickness.</param> /// <param name="lineStyle">The line style.</param> /// <param name="lineJoin">The line join.</param> /// <returns>A pen.</returns> public static OxyPen Create( OxyColor color, double thickness, LineStyle lineStyle = LineStyle.Solid, LineJoin lineJoin = LineJoin.Miter) { if (color.IsInvisible() || lineStyle == LineStyle.None || Math.Abs(thickness) < double.Epsilon) { return(null); } return(new OxyPen(color, thickness, lineStyle, lineJoin)); }
/// <summary> /// Creates the specified pen. /// </summary> /// <param name="color">The color.</param> /// <param name="thickness">The thickness.</param> /// <param name="lineStyle">The line style.</param> /// <param name="lineJoin">The line join.</param> /// <returns>A pen.</returns> public static OxyPen Create( OxyColor color, double thickness, LineStyle lineStyle = LineStyle.Solid, LineJoin lineJoin = LineJoin.Miter) { if (color.IsInvisible() || lineStyle == LineStyle.None || Math.Abs(thickness) < double.Epsilon) { return null; } return new OxyPen(color, thickness, lineStyle, lineJoin); }
/// <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> /// Draws the polyline from the specified points. /// </summary> /// <param name="points">The points.</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 DrawLine( IList<ScreenPoint> points, OxyColor stroke, double thickness, double[] dashArray, OxyPlot.LineJoin lineJoin, bool aliased) { if (stroke.IsInvisible() || thickness <= 0 || points.Count < 2) { return; } this.g.SmoothingMode = aliased ? SmoothingMode.None : SmoothingMode.HighQuality; using (var pen = this.CreatePen(stroke, thickness, dashArray, lineJoin)) { this.g.DrawLines(pen, this.ToPoints(points)); } }
/// <summary> /// Writes text. /// </summary> /// <param name="position">The position.</param> /// <param name="text">The text.</param> /// <param name="fill">The text color.</param> /// <param name="fontFamily">The font family.</param> /// <param name="fontSize">The font size (in user units).</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> public void WriteText( ScreenPoint position, string text, OxyColor fill, string fontFamily = null, double fontSize = 10, double fontWeight = FontWeights.Normal, double rotate = 0, HorizontalAlignment halign = HorizontalAlignment.Left, VerticalAlignment valign = VerticalAlignment.Top) { // http://www.w3.org/TR/SVG/text.html this.WriteStartElement("text"); // WriteAttributeString("x", position.X); // WriteAttributeString("y", position.Y); string baselineAlignment = "hanging"; if (valign == VerticalAlignment.Middle) { baselineAlignment = "middle"; } if (valign == VerticalAlignment.Bottom) { baselineAlignment = "baseline"; } this.WriteAttributeString("dominant-baseline", baselineAlignment); string textAnchor = "start"; if (halign == HorizontalAlignment.Center) { textAnchor = "middle"; } if (halign == HorizontalAlignment.Right) { textAnchor = "end"; } this.WriteAttributeString("text-anchor", textAnchor); string fmt = "translate({0:" + this.NumberFormat + "},{1:" + this.NumberFormat + "})"; string transform = string.Format(CultureInfo.InvariantCulture, fmt, position.X, position.Y); if (Math.Abs(rotate) > 0) { transform += string.Format(CultureInfo.InvariantCulture, " rotate({0})", rotate); } this.WriteAttributeString("transform", transform); if (fontFamily != null) { this.WriteAttributeString("font-family", fontFamily); } if (fontSize > 0) { this.WriteAttributeString("font-size", fontSize); } if (fontWeight > 0) { this.WriteAttributeString("font-weight", fontWeight); } if (fill.IsInvisible()) { this.WriteAttributeString("fill", "none"); } else { this.WriteAttributeString("fill", this.ColorToString(fill)); if (fill.A != 0xFF) { this.WriteAttributeString("fill-opacity", fill.A / 255.0); } } // WriteAttributeString("style", style); this.WriteString(text); this.WriteEndElement(); }
/// <summary> /// Creates a style. /// </summary> /// <param name="fill">The fill color.</param> /// <param name="stroke">The stroke color.</param> /// <param name="thickness">The stroke thickness (in user units).</param> /// <param name="dashArray">The line dash array.</param> /// <param name="lineJoin">The line join type.</param> /// <returns>A style string.</returns> public string CreateStyle( OxyColor fill, OxyColor stroke, double thickness, double[] dashArray = null, OxyPenLineJoin lineJoin = OxyPenLineJoin.Miter) { // http://oreilly.com/catalog/svgess/chapter/ch03.html var style = new StringBuilder(); if (fill.IsInvisible()) { style.AppendFormat("fill:none;"); } else { style.AppendFormat("fill:{0};", this.ColorToString(fill)); if (fill.A != 0xFF) { style.AppendFormat(CultureInfo.InvariantCulture, "fill-opacity:{0};", fill.A / 255.0); } } if (stroke.IsInvisible()) { style.AppendFormat("stroke:none;"); } else { string formatString = "stroke:{0};stroke-width:{1:" + this.NumberFormat + "}"; style.AppendFormat(CultureInfo.InvariantCulture, formatString, this.ColorToString(stroke), thickness); switch (lineJoin) { case OxyPenLineJoin.Round: style.AppendFormat(";stroke-linejoin:round"); break; case OxyPenLineJoin.Bevel: style.AppendFormat(";stroke-linejoin:bevel"); break; } if (stroke.A != 0xFF) { style.AppendFormat(CultureInfo.InvariantCulture, ";stroke-opacity:{0}", stroke.A / 255.0); } if (dashArray != null && dashArray.Length > 0) { style.Append(";stroke-dasharray:"); for (int i = 0; i < dashArray.Length; i++) { style.AppendFormat( CultureInfo.InvariantCulture, "{0}{1}", i > 0 ? "," : string.Empty, dashArray[i]); } } } return style.ToString(); }