public static Drawing DrawCharacter(char ch, Typeface typeFace, double fontSize, Color?color, Color?bgColor, bool drawOutline, double outlineThickness, bool reverse, CharRenderMode mode) { DrawingGroup dGroup = new DrawingGroup(); var brush = color.HasValue ? new SolidColorBrush(color.Value) : new SolidColorBrush(Colors.White); var bgBrush = bgColor.HasValue ? new SolidColorBrush(bgColor.Value) : Brushes.Transparent; using (DrawingContext dc = dGroup.Open()) { var formattedText = new FormattedText( ch.ToString(), System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, fontSize, Brushes.Black); var geometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0)); var pen = drawOutline ? new Pen(Brushes.Black, outlineThickness) : null; var bounds = pen != null?geometry.GetRenderBounds(pen) : geometry.Bounds; Rect bb; switch (mode) { case CharRenderMode.Full: { double size = formattedText.Height; bb = new Rect(bounds.X + bounds.Width / 2 - size / 2, 0, size, size); } break; case CharRenderMode.Caps: { double size = typeFace.CapsHeight * fontSize; bb = new Rect(bounds.X + bounds.Width / 2 - size / 2, formattedText.Baseline - size, size, size); } break; case CharRenderMode.Free: bb = bounds; break; default: throw new Exception(); } if (reverse) { geometry = new CombinedGeometry(GeometryCombineMode.Exclude, new RectangleGeometry(bb), geometry); } //dc.DrawRectangle(bgBrush, new Pen(Brushes.Red, 1), bb); dc.DrawRectangle(bgBrush, null, bb); dc.DrawGeometry(brush, pen, geometry); /* * var dl = new Action<double>((y) => * dc.DrawLine(new Pen(Brushes.Red, 1), new Point(bb.Left, y), new Point(bb.Right, y))); * * dl(0); * dl(formattedText.Baseline); * dl(fontSize); * dl(formattedText.Height); * dl(formattedText.Baseline - typeFace.CapsHeight * fontSize); */ } return(dGroup); }
public static Drawing DrawCharacter(char ch, Typeface typeFace, double fontSize, GameColor color, GameColor bgColor, bool drawOutline, double outlineThickness, bool reverse, CharRenderMode mode) { Color c; if (color == GameColor.None) c = Colors.White; else c = color.ToWindowsColor(); DrawingGroup dGroup = new DrawingGroup(); var brush = new SolidColorBrush(c); var bgBrush = bgColor != GameColor.None ? new SolidColorBrush(bgColor.ToWindowsColor()) : Brushes.Transparent; using (DrawingContext dc = dGroup.Open()) { var formattedText = new FormattedText( ch.ToString(), System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, fontSize, Brushes.Black); var geometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0)); var pen = drawOutline ? new Pen(Brushes.Black, outlineThickness) : null; var bounds = pen != null ? geometry.GetRenderBounds(pen) : geometry.Bounds; Rect bb; switch (mode) { case CharRenderMode.Full: { double size = formattedText.Height; bb = new Rect(bounds.X + bounds.Width / 2 - size / 2, 0, size, size); } break; case CharRenderMode.Caps: { double size = typeFace.CapsHeight * fontSize; bb = new Rect(bounds.X + bounds.Width / 2 - size / 2, formattedText.Baseline - size, size, size); } break; case CharRenderMode.Free: bb = bounds; break; default: throw new Exception(); } if (reverse) geometry = new CombinedGeometry(GeometryCombineMode.Exclude, new RectangleGeometry(bb), geometry); //dc.DrawRectangle(bgBrush, new Pen(Brushes.Red, 1), bb); dc.DrawRectangle(bgBrush, null, bb); dc.DrawGeometry(brush, pen, geometry); /* var dl = new Action<double>((y) => dc.DrawLine(new Pen(Brushes.Red, 1), new Point(bb.Left, y), new Point(bb.Right, y))); dl(0); dl(formattedText.Baseline); dl(fontSize); dl(formattedText.Height); dl(formattedText.Baseline - typeFace.CapsHeight * fontSize); */ } return dGroup; }
Drawing Test(char ch) { var typeFace = new Typeface(new FontFamily("arial"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); int fontSize = 64; DrawingGroup dGroup = new DrawingGroup(); var brush = new SolidColorBrush(Colors.Black); using (DrawingContext dc = dGroup.Open()) { var formattedText = new FormattedText( ch.ToString(), System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, fontSize, Brushes.Black, null, TextFormattingMode.Display); bool drawOutline = false; double outlineThickness = 0; CharRenderMode mode = CharRenderMode.Caps; bool reverse = false; var geometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0)); var pen = drawOutline ? new Pen(Brushes.Black, outlineThickness) : null; var bounds = pen != null?geometry.GetRenderBounds(pen) : geometry.Bounds; if (bounds.IsEmpty) { return(null); } Rect bb; switch (mode) { case CharRenderMode.Full: { double size = formattedText.Height; bb = new Rect(bounds.X + bounds.Width / 2 - size / 2, 0, size, size); } break; case CharRenderMode.Caps: { double size = typeFace.CapsHeight * fontSize; bb = new Rect(bounds.X + bounds.Width / 2 - size / 2, formattedText.Baseline - size, size, size); } break; case CharRenderMode.Free: bb = bounds; break; default: throw new Exception(); } if (reverse) { geometry = new CombinedGeometry(GeometryCombineMode.Exclude, new RectangleGeometry(bb), geometry); } dc.DrawRectangle(Brushes.Transparent, null, bb); dc.DrawGeometry(brush, pen, geometry); /* * var dl = new Action<double>((y) => * dc.DrawLine(new Pen(Brushes.Red, 1), new Point(bb.Left, y), new Point(bb.Right, y))); * * dl(0); * dl(formattedText.Baseline); * dl(fontSize); * dl(formattedText.Height); * dl(formattedText.Baseline - typeFace.CapsHeight * fontSize); */ } return(dGroup); }