Ejemplo n.º 1
0
        public void DrawText(string text, IFont font, IBrush brush, int x, int y, IDrawTextFormat format)
        {
            var skPoint = new SKPoint(x, y);
            var skPaint = GetSKPaint(font, (SKPaint)brush.EngineElement, format, ref text, ref skPoint);

            DrawMultilineText(text, skPoint, skPaint);
        }
Ejemplo n.º 2
0
        private SKPaint GetSKPaint(IFont font, SKPaint brush, IDrawTextFormat format, ref string text, ref SKPoint point)
        {
            var skPaint = GetSKPaint(font, brush);

            text = text.RemoveReturns();

            if (format != null)
            {
                var skAlignment = (SKPaint)format.EngineElement;

                skPaint.TextAlign = skAlignment.TextAlign;
                //if(format.LineAlignment != StringAlignment.Far)
                {
                    //var height = font.Size.FontSizePointsToPixels() * 0.72f; //this.MeasureText("X", font).Height;
                    //switch(format.LineAlignment)
                    //{
                    //    case StringAlignment.Center:
                    //        point.Y += skPaint.FontMetrics != null ? skPaint.FontMetrics.XHeight / 2f : height / 2.5f;
                    //        break;
                    //    case StringAlignment.Near:
                    //        point.Y += skPaint.FontMetrics != null ? skPaint.FontMetrics.CapHeight : height;
                    //        break;
                    //}

                    //var capHeight = skPaint.FontMetrics != null ? skPaint.FontMetrics.CapHeight : height * 0.75f;

                    var far  = -skPaint.FontMetrics.Bottom /*- height * 0.00f*/;
                    var near = -skPaint.FontMetrics.Top;

                    switch (format.LineAlignment)
                    {
                    case StringAlignment.Far:
                        point.Y += far;
                        break;

                    case StringAlignment.Center:
                        point.Y += (far + near) * .5f;
                        //point.Y = this.MeasureText(text, font).Height;
                        break;

                    case StringAlignment.Near:
                        point.Y += near;
                        break;
                    }
                }
            }

            return(skPaint);
        }
Ejemplo n.º 3
0
        virtual protected void DrawAtPoint(IDisplay display, IPoint point, string text, float angle, IDrawTextFormat format, int level)
        {
            if (_font != null)
            {
                //point.X+=_xOffset;
                //point.Y+=_yOffset;

                try
                {
                    display.Canvas.TextRenderingHint =
                        ((this.Smoothingmode == SymbolSmoothing.None) ?
                         TextRenderingHint.SystemDefault :
                         TextRenderingHint.AntiAlias);

                    display.Canvas.TranslateTransform(new CanvasPointF((float)point.X, (float)point.Y));
                    if (angle != 0 || _angle != 0 || _rotation != 0)
                    {
                        display.Canvas.RotateTransform(angle + _angle + _rotation);
                    }
                    DrawString(display.Canvas, text, _font, _brush, _xOffset, _yOffset, format);
                }
                finally
                {
                    display.Canvas.ResetTransform();
                    display.Canvas.TextRenderingHint = TextRenderingHint.SystemDefault;
                }
            }
        }
Ejemplo n.º 4
0
 private void DrawAtPoint(IDisplay display, IPoint point, string text, float angle, IDrawTextFormat format)
 {
     DrawAtPoint(display, point, text, angle, format, -1);
 }
Ejemplo n.º 5
0
        protected void DrawString(ICanvas canvas, string text, IFont font, IBrush brush, float xOffset, float yOffset, IDrawTextFormat format)
        {
            float alignXOffset = xOffset,
                  alignYOffset = yOffset;

            if (format.Alignment == StringAlignment.Far)
            {
                alignXOffset = -alignXOffset;
            }
            if (format.LineAlignment == StringAlignment.Near)
            {
                alignYOffset = -alignYOffset;
            }

            if (IncludesSuperScript == true)
            {
                if (!text.Contains("^"))
                {
                    canvas.DrawText(text, font, brush, alignXOffset, alignYOffset, format);
                }
                else
                {
                    float fontSize = font.Size;
                    while (!String.IsNullOrWhiteSpace(text))
                    {
                        var  pos1 = text.IndexOf("^");
                        var  pos2 = text.IndexOf("~");
                        int  pos;
                        bool superScript = true;

                        if (pos1 >= 0 && pos2 >= 0)
                        {
                            if (pos1 < pos2)
                            {
                                pos = pos1;
                            }
                            else
                            {
                                pos         = pos2;
                                superScript = false;
                            }
                        }
                        else if (pos1 >= 0 && pos2 < 0)
                        {
                            pos = pos1;
                        }
                        else if (pos2 >= 0 && pos1 < 0)
                        {
                            pos         = pos2;
                            superScript = false;
                        }
                        else
                        {
                            pos = -1;
                        }

                        string subText = String.Empty;
                        if (pos < 0)
                        {
                            subText = text;
                        }
                        if (pos > 0)
                        {
                            subText = text.Substring(0, text.IndexOf(superScript ? "^" : "~"));
                        }

                        using (var subFont = Current.Engine.CreateFont(font.Name, fontSize))
                        {
                            canvas.DrawText(subText, subFont, brush, alignXOffset, alignYOffset, format);
                            var size = canvas.MeasureText(subText, subFont);
                            if (!String.IsNullOrWhiteSpace(subText))
                            {
                                alignXOffset += size.Width - subFont.Size * .2f;
                            }

                            if (superScript)
                            {
                                alignYOffset -= subFont.Size * .4f;
                            }
                            else
                            {
                                alignYOffset += (subFont.Size / .9f) * .4f;
                            }
                        }

                        if (pos >= 0)
                        {
                            text = text.Substring(pos + 1);
                            if (superScript)
                            {
                                fontSize *= .9f;
                            }
                            else
                            {
                                fontSize /= .9f;
                            }
                        }
                        else
                        {
                            text = String.Empty;
                        }
                    }
                }
            }
            else
            {
                canvas.DrawText(text, font, brush, alignXOffset, alignYOffset, format);
            }
        }
Ejemplo n.º 6
0
        public DisplayCharacterRanges(SKCanvas canvas, SKPaint font, IDrawTextFormat format, string text)
        {
            if (String.IsNullOrEmpty(text))
            {
                _rectF = new CanvasRectangleF[0];
                return;
            }

            _rectF = new CanvasRectangleF[text.Length];

            var rect = new SKRect();

            font.MeasureText("_", ref rect);
            float spaceWidth = rect.Width;

            float xOffset = 0, height = 0;;

            for (int i = 0, to = text.Length; i < to; i++)
            {
                font.MeasureText($"{ text[i] }_", ref rect);

                _rectF[i].Left = rect.Left + xOffset;
                _rectF[i].Top  = rect.Top;
                if (text[i] == ' ')
                {
                    _rectF[i].Width = rect.Width;
                }
                else
                {
                    _rectF[i].Width = rect.Width - spaceWidth * 0.9f;
                }
                height = Math.Max(rect.Height, height);

                xOffset += rect.Width;
            }

            //var far = font.FontMetrics != null ? -font.FontMetrics.Bottom : 0f;
            //var near = font.FontMetrics != null ? -font.FontMetrics.Top : 0f;
            //var center = (far + near) * .5f;

            var empiricValue = 1f;

            switch (format.LineAlignment)
            {
            case StringAlignment.Near:
            case StringAlignment.Far:
                empiricValue = 1.5f;      // to generate more vartical line offset
                break;
            }

            for (int i = 0; i < _rectF.Length; i++)
            {
                //switch (format.LineAlignment)
                //{
                //    case StringAlignment.Near:
                //        _rectF[i].Top += near;
                //        break;
                //    case StringAlignment.Far:
                //        _rectF[i].Top += far;
                //        break;
                //    default:
                //        _rectF[i].Top += center;
                //        break;
                //}
                _rectF[i].Height = height * empiricValue;
            }
        }
Ejemplo n.º 7
0
        override protected void DrawAtPoint(IDisplay display, IPoint point, string text, float angle, IDrawTextFormat format, int level)
        {
            if (_font != null)
            {
                //point.X+=_xOffset;
                //point.Y+=_yOffset;

                try
                {
                    display.Canvas.TranslateTransform(new CanvasPointF((float)point.X, (float)point.Y));
                    if (angle != 0 || _angle != 0 || _rotation != 0)
                    {
                        display.Canvas.RotateTransform(angle + _angle + _rotation);
                    }

                    if (level < 0 || level == 0)
                    {
                        var size = display.Canvas.MeasureText(text, _font);
                        var rect = new CanvasRectangleF(0f, 0f, size.Width, size.Height);
                        switch (format.Alignment)
                        {
                        case StringAlignment.Center:
                            rect.Offset(-size.Width / 2, 0f);
                            break;

                        case StringAlignment.Far:
                            rect.Offset(-size.Width, 0f);
                            break;
                        }
                        switch (format.LineAlignment)
                        {
                        case StringAlignment.Center:
                            rect.Offset(0f, -size.Height / 2);
                            break;

                        case StringAlignment.Far:
                            rect.Offset(0f, -size.Height);
                            break;
                        }

                        display.Canvas.SmoothingMode = (SmoothingMode)this.Smoothingmode;
                        display.Canvas.FillRectangle(_outlinebrush, rect);
                        display.Canvas.SmoothingMode = SmoothingMode.None;
                    }

                    if (level < 0 || level == 1)
                    {
                        display.Canvas.TextRenderingHint = (this.Smoothingmode == SymbolSmoothing.None) ?
                                                           TextRenderingHint.SystemDefault :
                                                           TextRenderingHint.AntiAlias;

                        DrawString(display.Canvas, text, _font, _brush, _xOffset, _yOffset, format);

                        display.Canvas.TextRenderingHint = TextRenderingHint.SystemDefault;
                    }
                }
                finally
                {
                    display.Canvas.ResetTransform();
                }
            }
        }
Ejemplo n.º 8
0
        override protected void DrawAtPoint(IDisplay display, IPoint point, string text, float angle, IDrawTextFormat format, int level)
        {
            if (_font != null)
            {
                //point.X+=_xOffset;
                //point.Y+=_yOffset;

                try
                {
                    display.Canvas.TranslateTransform(new CanvasPointF((float)point.X, (float)point.Y));
                    if (angle != 0 || _angle != 0 || _rotation != 0)
                    {
                        display.Canvas.RotateTransform(angle + _angle + _rotation);
                    }

                    display.Canvas.TextRenderingHint = (this.GlowingSmoothingmode == SymbolSmoothing.None) ?
                                                       TextRenderingHint.SystemDefault :
                                                       TextRenderingHint.AntiAlias;

                    if (level < 0 || level == 0)
                    {
                        var outlineWidth = _outlineWidth;
                        if (outlineWidth == 0)
                        {
                            outlineWidth = (int)Math.Max(1f, Font.Size / 10f);
                        }

                        //if(display.GraphicsContext.TextRenderingHint== System.Drawing.Text.TextRenderingHint.AntiAlias)
                        //{
                        //    outlineWidth = Math.Max(2, outlineWidth);
                        //}

                        if (outlineWidth > 0)
                        {
                            for (int x = outlineWidth; x >= -outlineWidth; x--)
                            {
                                for (int y = outlineWidth; y >= -outlineWidth; y--)
                                {
                                    if (x == 0 && y == 0)
                                    {
                                        continue;
                                    }

                                    DrawString(display.Canvas, text, _font, _outlinebrush, (float)_xOffset + x, (float)_yOffset + y, format);
                                }
                            }
                        }
                    }

                    if (level < 0 || level == 1)
                    {
                        display.Canvas.TextRenderingHint = (this.Smoothingmode == SymbolSmoothing.None) ?
                                                           TextRenderingHint.SystemDefault :
                                                           TextRenderingHint.AntiAlias;

                        DrawString(display.Canvas, text, _font, _brush, (float)_xOffset, (float)_yOffset, format);
                    }
                }
                finally
                {
                    display.Canvas.ResetTransform();
                    display.Canvas.TextRenderingHint = TextRenderingHint.SystemDefault;
                }
            }
        }
Ejemplo n.º 9
0
 public IDisplayCharacterRanges DisplayCharacterRanges(IFont font, IDrawTextFormat format, string text)
 {
     return(new DisplayCharacterRanges(_canvas, GetSKPaint(font), format, text));
 }
Ejemplo n.º 10
0
        public void DrawText(string text, IFont font, IBrush brush, CanvasPointF pointF, IDrawTextFormat format)
        {
            var skPoint = pointF.ToSKPoint();
            var skPaint = GetSKPaint(font, (SKPaint)brush.EngineElement, format, ref text, ref skPoint);

            DrawMultilineText(text, skPoint, skPaint);
        }
Ejemplo n.º 11
0
        public IDisplayCharacterRanges DisplayCharacterRanges(IFont font, IDrawTextFormat format, string text)
        {
            CheckUsability();

            return(new DisplayCharacterRanges(_graphics, (Font)font.EngineElement, (StringFormat)format.EngineElement, text));
        }
Ejemplo n.º 12
0
        public void DrawText(string text, IFont font, IBrush brush, float x, float y, IDrawTextFormat format)
        {
            CheckUsability();

            _graphics.DrawString(text, (Font)font.EngineElement, (Brush)brush.EngineElement, x, y, (StringFormat)format?.EngineElement);
        }
Ejemplo n.º 13
0
        public void DrawText(string text, IFont font, IBrush brush, CanvasPointF pointF, IDrawTextFormat format)
        {
            CheckUsability();

            _graphics.DrawString(text, (Font)font.EngineElement, (Brush)brush.EngineElement, pointF.ToGdiPointF(), (StringFormat)format?.EngineElement);
        }