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);
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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);
        }