void PaintHeaderBar(object sender, SKPaintSurfaceEventArgs args)
        {
            SKImageInfo info    = args.Info;
            SKSurface   surface = args.Surface;
            SKCanvas    canvas  = surface.Canvas;

            canvas.Clear();

            SKPath path = new SKPath
            {
                FillType = SKPathFillType.EvenOdd
            };

            path.AddRect(new SKRect(0, 0, info.Width, 8));

            SKPaint paint = new SKPaint()
            {
                Style = SKPaintStyle.Fill,
                Color = new SKColor(0xFFE69A28)
            };

            canvas.DrawPath(path, paint);

            paint.Style       = SKPaintStyle.Stroke;
            paint.StrokeWidth = 2;
            paint.Color       = SKColors.Black;

            canvas.DrawPath(path, paint);
            paint.Dispose();
            path.Dispose();
        }
예제 #2
0
    public async Task RunAsync(string pathToRead)
    {
        _client.Timeout = TimeSpan.FromMilliseconds(TIMEOUT_MILLIS);
        _skPaint.Color  = new SKColor(118, 118, 118, 255);

        await GetShapesAsync(pathToRead);

        if (_pendingToDownload.Count == 0)
        {
            Console.WriteLine("No shapes found");
            return;
        }

        _totalCount = _pendingToDownload.Count;

        Console.WriteLine($"about to process {_pendingToDownload.Count} shapes");

        var watch = System.Diagnostics.Stopwatch.StartNew();

        await Task.WhenAll(new Task[] { DownloadAsync(), ProcessAsync() });

        watch.Stop();

        Console.WriteLine($"===completed with {_failureList.Count} errors and elapsed time: {watch.ElapsedMilliseconds / 1000f} seconds===");

        _client.Dispose();
        _skPaint.Dispose();

        HandleFailure();
        HandleSuccess();
    }
        void PaintRedBar(object sender, SKPaintSurfaceEventArgs args)
        {
            SKImageInfo info    = args.Info;
            SKSurface   surface = args.Surface;
            SKCanvas    canvas  = surface.Canvas;

            canvas.Clear();

            SKPath path = new SKPath
            {
                FillType = SKPathFillType.EvenOdd
            };

            path.AddPoly(new SKPoint[] { new SKPoint(0, 0), new SKPoint(info.Width, 8), new SKPoint(0, 8) });

            SKPaint paint = new SKPaint()
            {
                Style = SKPaintStyle.Fill,
                Color = new SKColor(0xFF922610)
            };

            canvas.DrawPath(path, paint);
            paint.Dispose();
            path.Dispose();

            //paint.Style = SKPaintStyle.Stroke;
            //paint.StrokeWidth = 2;
            //paint.Color = SKColors.Black;

            //canvas.DrawPath(path, paint);
        }
예제 #4
0
 /// <summary>
 /// Closes this instance and frees resources.
 /// <para>
 /// After a call to this method, the canvas can no longer be used for drawing.
 /// </para>
 /// </summary>
 protected void Close()
 {
     if (_canvas != null)
     {
         _canvas.Dispose();
         _canvas = null;
     }
     if (_bitmap != null)
     {
         _bitmap.Dispose();
         _bitmap = null;
     }
     if (_path != null)
     {
         _path.Dispose();
         _path = null;
     }
     if (_strokePaint != null)
     {
         _strokePaint.Dispose();
         _strokePaint = null;
         _fillPaint.Dispose();
         _fillPaint = null;
         _textPaint.Dispose();
         _textPaint = null;
         _regularTypeface.Dispose();
         _regularTypeface = null;
         _boldTypeface.Dispose();
         _boldTypeface = null;
     }
 }
예제 #5
0
        /// <summary>
        /// Create shape
        /// </summary>
        /// <param name="points"></param>
        /// <param name="shapeModel"></param>
        public override void CreateShape(IList <Point> points, IShapeModel shapeModel)
        {
            CreateCanvas();

            var shape  = new SKPath();
            var origin = points.ElementAtOrDefault(0);

            if (origin == default)
            {
                return;
            }

            shape.MoveTo((float)origin.X, (float)origin.Y);

            for (var i = 1; i < points.Count; i++)
            {
                shape.LineTo((float)points[i].X, (float)points[i].Y);
            }

            shape.Close();

            var pen = new SKPaint
            {
                Style = SKPaintStyle.Fill,
                Color = shapeModel.Color.ToSKColor()
            };

            _canvas.DrawPath(shape, pen);

            pen.Dispose();
            shape.Dispose();
        }
예제 #6
0
 public override void Dispose()
 {
     if (_dispose)
     {
         _brush.Dispose();
     }
 }
예제 #7
0
        private IRender RenderBlob()
        {
            using (var canvas = _render.CreateCanvas())
            {
                canvas.Clear();

                float x = _xCenterPos;
                float y = Height / 2f;

                var paint = new SKPaint
                {
                    IsAntialias = true,
                    Style       = SKPaintStyle.Fill,
                    Shader      = SKShader.CreateRadialGradient(
                        new SKPoint(x, y),
                        _size, new[] { _color, SKColors.Black },
                        null, SKShaderTileMode.Clamp),
                };

                canvas.DrawOval(x, y, _size, _size, paint);
                paint.Dispose();
            }

            return(_render);
        }
예제 #8
0
        /// <summary>
        /// Create label
        /// </summary>
        /// <param name="point"></param>
        /// <param name="content"></param>
        /// <param name="shapeModel"></param>
        public override void CreateLabel(Point point, string content, IShapeModel shapeModel)
        {
            CreateCanvas();

            var position = SKTextAlign.Center;

            switch (shapeModel.Position)
            {
            case TextAlignment.Left: position = SKTextAlign.Left; break;

            case TextAlignment.Right: position = SKTextAlign.Right; break;
            }

            var pen = new SKPaint
            {
                TextAlign = position,
                TextSize  = (float)shapeModel.Size,
                Color     = shapeModel.Color.ToSKColor()
            };

            _canvas.DrawText(
                content,
                (float)point.X,
                (float)point.Y,
                pen);

            pen.Dispose();
        }
예제 #9
0
        private IRender RenderBars()
        {
            using (var canvas = _render.CreateCanvas())
            {
                canvas.Clear();

                lock (_barsLock)
                {
                    foreach (var bar in _bars)
                    {
                        float scale = bar.Life / bar.MaxLife;
                        float size  = (1 - scale) * bar.MaxSize;
                        float x     = bar.Position - size / 2f;

                        var paint = new SKPaint
                        {
                            IsAntialias = true,
                            Color       = bar.Color.WithScale(scale),
                            Style       = SKPaintStyle.Fill
                        };

                        canvas.DrawRect(x, 0, size, Height, paint);
                        paint.Dispose();
                    }
                }
            }

            return(_render);
        }
예제 #10
0
 public virtual void Dispose()
 {
     _paintScaleBar?.Dispose();
     _paintScaleBarStroke?.Dispose();
     _paintScaleText?.Dispose();
     _paintScaleTextStroke?.Dispose();
 }
예제 #11
0
        protected override void OnDraw(SKImageInfo info, SKCanvas canvas)
        {
            if (CanvasSizeChanged)
            {
                //新坐标系下的。
                _destRect = SKRect.Create(
                    _widthRatio * info.Width / -2,
                    _heightRatio * info.Height / -2,
                    _widthRatio * info.Width,
                    _heightRatio * info.Height);
            }

            if (_bitmap != null)
            {
                SKRect mappedDestRect = Matrix.Invert().MapRect(_destRect);

                SKPaint paint = new SKPaint {
                    IsStroke = true, StrokeWidth = 10, Color = SKColors.Red
                };

                canvas.DrawRect(mappedDestRect, paint);

                _drawBitmapResult = canvas.DrawBitmap(_bitmap, _destRect, StretchMode, HorizontalAlignment, VerticalAlignment);

                paint.Dispose();
            }
        }
예제 #12
0
        /// <summary>
        /// Draws the graph on a canvas.
        /// </summary>
        /// <param name="Canvas">Canvas to draw on.</param>
        /// <param name="Points">Points to draw.</param>
        /// <param name="Parameters">Graph-specific parameters.</param>
        /// <param name="PrevPoints">Points of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevParameters">Parameters of previous graph of same type (if available), null (if not available).</param>
        /// <param name="DrawingArea">Current drawing area.</param>
        public void DrawGraph(SKCanvas Canvas, SKPoint[] Points, object[] Parameters, SKPoint[] PrevPoints, object[] PrevParameters,
                              DrawingArea DrawingArea)
        {
            SKPaint Pen   = null;
            SKPath  Path  = null;
            bool    First = true;

            try
            {
                Pen  = Graph.ToPen(Parameters[0], Parameters[1]);
                Path = new SKPath();

                foreach (SKPoint Point in Points)
                {
                    if (First)
                    {
                        First = false;
                        Path.MoveTo(Point);
                    }
                    else
                    {
                        Path.LineTo(Point);
                    }
                }

                Canvas.DrawPath(Path, Pen);
            }
            finally
            {
                Pen?.Dispose();
                Path?.Dispose();
            }
        }
예제 #13
0
        private void DrawGraph(SKCanvas Canvas, SKPoint[] Points, object[] Parameters, SKPoint[] PrevPoints, object[] PrevParameters,
                               DrawingArea DrawingArea)
        {
            SKPaint Pen  = null;
            SKPath  Path = null;

            try
            {
                Pen  = Graph.ToPen(Parameters[0], Parameters[1]);
                Path = CreateSpline(Points);

                Canvas.DrawPath(Path, Pen);
            }
            finally
            {
                if (Pen != null)
                {
                    Pen.Dispose();
                }

                if (Path != null)
                {
                    Path.Dispose();
                }
            }
        }
예제 #14
0
        public override IRender Render(float dt)
        {
            var chromas = _featureCache.GetChromas();

            using (var canvas = _render.CreateCanvas())
            {
                canvas.Clear();

                for (int i = 0; i < NumBars; i++)
                {
                    if (chromas[i] >= _threshold)
                    {
                        var paint = new SKPaint
                        {
                            IsAntialias = true,
                            Color       = _color.WithScale(chromas[i]),
                            Style       = SKPaintStyle.Fill
                        };

                        int x0 = i * _barSize;
                        canvas.DrawRect(x0, 0, _barSize, Height, paint);
                        paint.Dispose();
                    }
                }
            }

            return(_render);
        }
예제 #15
0
 /// <inheritdoc />
 public void Dispose()
 {
     Paint?.Dispose();
     _disposable1?.Dispose();
     _disposable2?.Dispose();
     _disposable3?.Dispose();
 }
예제 #16
0
        public override IRender Render(float dt)
        {
            lock (_barsLock)
            {
                UpdateBars(dt);

                using (var canvas = _render.CreateCanvas())
                {
                    canvas.Clear();

                    for (int i = 0; i < _numBars; i++)
                    {
                        int   x0        = i * _barSize;
                        float intensity = 0;

                        if (_bars[i].MaxLife > 0)
                        {
                            intensity = _bars[i].Value / _bars[i].MaxLife;
                        }

                        var paint = new SKPaint
                        {
                            IsAntialias = true,
                            Color       = _bars[i].Color.WithScale(intensity),
                            Style       = SKPaintStyle.Fill
                        };

                        canvas.DrawRect(x0, 0, _barSize, Height, paint);
                        paint.Dispose();
                    }
                }
            }

            return(_render);
        }
예제 #17
0
 public void Dispose()
 {
     if (_disposePaint)
     {
         _paint?.Dispose();
     }
 }
예제 #18
0
 public void Dispose()
 {
     _paint?.Shader?.Dispose();
     _paint?.Dispose();
     _trailPaint?.Shader?.Dispose();
     _trailPaint?.Dispose();
 }
예제 #19
0
        private IRender RenderBlobs()
        {
            float y = Height / 2f;

            using (var canvas = _render.CreateCanvas())
            {
                canvas.Clear();

                lock (_blobsLock)
                {
                    foreach (var blob in _blobs)
                    {
                        float scale = blob.Life / blob.MaxLife;
                        float size  = (1 - scale) * blob.MaxSize;
                        float x     = blob.Position;

                        var paint = new SKPaint
                        {
                            IsAntialias = true,
                            Style       = SKPaintStyle.Fill,
                            Shader      = SKShader.CreateRadialGradient(
                                new SKPoint(x, y),
                                size,
                                new[] { blob.Color.WithScale(scale), SKColors.Black },
                                null, SKShaderTileMode.Clamp),
                        };

                        canvas.DrawOval(x, y, size, size, paint);
                        paint.Dispose();
                    }
                }
            }

            return(_render);
        }
예제 #20
0
        private void DrawGraph(SKCanvas Canvas, SKPoint[] Points, object[] Parameters, SKPoint[] PrevPoints, object[] PrevParameters,
                               DrawingArea DrawingArea)
        {
            SKColor Color = Graph.ToColor(Parameters[0]);
            SKPaint Brush = new SKPaint
            {
                FilterQuality = SKFilterQuality.High,
                IsAntialias   = true,
                Style         = SKPaintStyle.Fill,
                Color         = Color
            };

            SKPath Path  = new SKPath();
            bool   First = true;

            foreach (SKPoint P in Points)
            {
                if (First)
                {
                    First = false;
                    Path.MoveTo(P);
                }
                else
                {
                    Path.LineTo(P);
                }
            }

            Path.Close();

            Canvas.DrawPath(Path, Brush);

            Brush.Dispose();
            Path.Dispose();
        }
예제 #21
0
        public override IRender Render(float dt)
        {
            float barValue = 0;

            if (_featureCache.IsBeat())
            {
                _beatPeriod        = _featureCache.GetBeatPeriod();
                _remainingBeatTime = _beatPeriod;
            }
            else if (_remainingBeatTime > 0)
            {
                _remainingBeatTime = Math.Max(_remainingBeatTime - dt, 0);
                barValue           = (1f - _remainingBeatTime / _beatPeriod);
            }

            int barSize = (int)(Width / 2 * barValue);

            using (var canvas = _render.CreateCanvas())
            {
                canvas.Clear();

                var paint = new SKPaint
                {
                    IsAntialias = true,
                    Color       = _color,
                    Style       = SKPaintStyle.Fill
                };

                canvas.DrawRect(Width / 2, 0, barSize, Height, paint);
                canvas.DrawRect(Width / 2 - barSize, 0, barSize, Height, paint);
                paint.Dispose();
            }

            return(_render);
        }
예제 #22
0
    protected override bool ReleaseManaged()
    {
        _forePaint.Dispose();
        _alternPaint.Dispose();
        _noisePaint.Dispose();

        return(true);
    }
예제 #23
0
 internal static void DisposeSelfAndProperties(this SKPaint paint)
 {
     paint.ImageFilter?.Dispose();
     paint.ColorFilter?.Dispose();
     paint.MaskFilter?.Dispose();
     paint.Shader?.Dispose();
     paint.Dispose();
 }
예제 #24
0
 public void Dispose()
 {
     if (_paint != null)
     {
         _paint.Dispose();
         _paint = null;
     }
 }
예제 #25
0
        public SKImage CreateBackgroundImage()
        {
            SKPaint paint = null;
            SKPath  path  = null;

            try
            {
                var height = (int)Bounds.Height;
                var width  = (int)Bounds.Width;

                using (var surface = SKSurface.Create(width, height, SKColorType.N_32, SKAlphaType.Premul))
                {
                    var canvas = surface.Canvas;

                    //canvas.Clear (SKColors.Beige);

                    paint = new SKPaint
                    {
                        Color       = SKColors.DarkBlue,
                        IsStroke    = true,
                        StrokeWidth = 1,
                        StrokeCap   = SKStrokeCap.Round,
                        IsAntialias = true
                    };

                    //path = new SKPath ();
                    //path.MoveTo (0f, 0f);
                    //path.LineTo (width, height);
                    //path.Close ();

                    //canvas.DrawPath (path, paint);


                    //DrawArc (canvas, paint, 0, 90);

                    var start = -90;
                    var end   = 0;

                    //DrawCircle (canvas, paint, width / 2, height / 2, width / 2 - 4);
                    DrawArcFromTo(canvas, paint, width / 2, height / 2, width / 2 - 4, start, end);
                    DrawArcFromTo(canvas, paint, width / 2, height / 2, (int)((width / 2 - 4) * 0.8), start, end);

                    return(surface.Snapshot());
                }
            }
            finally
            {
                if (paint != null)
                {
                    paint.Dispose();
                }

                if (path != null)
                {
                    path.Dispose();
                }
            }
        }
예제 #26
0
        private void SKCanvasView_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs args)
        {
            var vm         = BindingContext as DiceRollerViewModel;
            var diceRoller = new DiceRollerViewModel();
            var diceRolls  = diceRoller.DicesValues(vm.Type, vm.Quantity);

            foreach (var diceRoll in diceRolls)
            {
                Debug.WriteLine($"{diceRoll.Key} => {diceRoll.Value / vm.Quantity}");
            }


            SKImageInfo info    = args.Info;
            SKSurface   surface = args.Surface;
            SKCanvas    canvas  = surface.Canvas;

            float minx  = diceRolls.Min(kv => kv.Value);
            float miny  = diceRolls.Min(kv => kv.Key);
            float maxx  = diceRolls.Max(kv => kv.Value);
            float maxy  = diceRolls.Max(kv => kv.Key);
            float sumx  = diceRolls.Sum(kv => kv.Value);
            float sizey = info.Height / (maxy - miny + 1);

            SKTypeface typeface = null;
            var        inFont   = AideDeJeu.Tools.Helpers.GetResourceStream("AideDeJeu.Pdf.LinLibertine_R.ttf");

            typeface = SKTypeface.FromStream(inFont);

            SKPaint strokePaint = new SKPaint()
            {
                Color       = new SKColor(0x9B, 0x1C, 0x47),
                Style       = SKPaintStyle.Stroke,
                StrokeWidth = 1,
            };
            SKPaint strokeFont = new SKPaint()
            {
                Color       = new SKColor(0x9B, 0x1C, 0x47),
                Style       = SKPaintStyle.Stroke,
                StrokeWidth = 1,
                TextSize    = sizey * 0.6f,
                Typeface    = typeface
            };

            canvas.Clear();
            foreach (var diceRoll in diceRolls)
            {
                float x = diceRoll.Value;
                float y = diceRoll.Key;
                canvas.DrawRect(new SKRect(0, ((y - miny) * sizey), x * info.Width / maxx, ((y - miny) * sizey) + sizey - 5), strokePaint);

                canvas.DrawText($"{y} => {x / sumx * 100:0.00}%", 10, ((y - miny) * sizey) + sizey * 0.6f, strokeFont);
            }

            typeface.Dispose();
            strokeFont.Dispose();
            strokePaint.Dispose();
        }
예제 #27
0
        /// <summary>
        /// Draws the graph on a canvas.
        /// </summary>
        /// <param name="Canvas">Canvas to draw on.</param>
        /// <param name="Points">Points to draw.</param>
        /// <param name="Parameters">Graph-specific parameters.</param>
        /// <param name="PrevPoints">Points of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevParameters">Parameters of previous graph of same type (if available), null (if not available).</param>
        /// <param name="DrawingArea">Current drawing area.</param>
        public void DrawGraph(SKCanvas Canvas, SKPoint[] Points, object[] Parameters, SKPoint[] PrevPoints, object[] PrevParameters,
                              DrawingArea DrawingArea)
        {
            SKPaint Brush = null;
            SKPath  Path  = null;

            try
            {
                Brush = new SKPaint()
                {
                    Style = SKPaintStyle.Fill,
                    Color = Graph.ToColor(Parameters[0])
                };
                Path = new SKPath();

                Path = Plot2DCurvePainter.CreateSpline(Points);

                if (PrevPoints is null)
                {
                    IElement Zero;
                    ISet     Set = DrawingArea.MinY.AssociatedSet;

                    if (Set is IGroup Group)
                    {
                        Zero = Group.AdditiveIdentity;
                    }
                    else
                    {
                        Zero = new DoubleNumber(0);
                    }

                    IVector XAxis = VectorDefinition.Encapsulate(new IElement[] { DrawingArea.MinX, DrawingArea.MaxX }, false, null) as IVector;
                    IVector YAxis = VectorDefinition.Encapsulate(new IElement[] { Zero, Zero }, false, null) as IVector;

                    PrevPoints = DrawingArea.Scale(XAxis, YAxis);

                    if (DrawingArea.MinX is StringValue && DrawingArea.MaxX is StringValue)
                    {
                        PrevPoints[0].X = Points[0].X;
                        PrevPoints[1].X = Points[Points.Length - 1].X;
                    }
                }

                PrevPoints = (SKPoint[])PrevPoints.Clone();
                Array.Reverse(PrevPoints);
                Plot2DCurvePainter.CreateSpline(Path, PrevPoints);

                Path.LineTo(Points[0]);

                Canvas.DrawPath(Path, Brush);
            }
            finally
            {
                Brush?.Dispose();
                Path?.Dispose();
            }
        }
예제 #28
0
        internal static SKBitmap WatermarkText(SKBitmap original, ResizeParams resizeParams, WatermarkTextModel watermarkText)
        {
            var toBitmap = new SKBitmap(original.Width, original.Height);
            var canvas   = new SKCanvas(toBitmap);
            // Draw a bitmap rescaled


            var paint = new SKPaint();

            //paint.Typeface = SKTypeface.FromFamilyName("Arial");
            paint.TextSize  = watermarkText.TextSize;
            paint.TextAlign = watermarkText.TextAlign.GetSKTextAlign();
            if (watermarkText.IsVerticalText)
            {
                paint.IsVerticalText = true;
            }
            else
            {
                paint.IsLinearText = true;
            }

            if (watermarkText.Type == 2)
            {
                paint.IsStroke    = true;
                paint.StrokeWidth = watermarkText.StrokeWidth;
                paint.StrokeCap   = SKStrokeCap.Round;
            }
            paint.Style         = watermarkText.Type.GetSKPaintStyle();
            paint.FilterQuality = watermarkText.Quality.GetSKFilterQuality();
            paint.TextSkewX     = watermarkText.TextSkewX;
            paint.IsAntialias   = true;

            //https://www.color-hex.com/
            if (SKColor.TryParse(watermarkText.Color, out SKColor color))
            {
                paint.Color = color;
            }
            else
            {
                paint.Color = SKColors.Black;
            }

            canvas.DrawBitmap(original, 0, 0);

            var x = watermarkText.PositionMeasureType == 1 ? watermarkText.X : watermarkText.X.ToPixel(original.Width);
            var y = watermarkText.PositionMeasureType == 1 ? watermarkText.Y : watermarkText.Y.ToPixel(original.Height);

            canvas.DrawText(watermarkText.Value, x, y, paint);

            canvas.Flush();

            canvas.Dispose();
            paint.Dispose();
            original.Dispose();

            return(toBitmap);
        }
예제 #29
0
        /// <summary>
        /// Draws the graph on a canvas.
        /// </summary>
        /// <param name="Canvas">Canvas to draw on.</param>
        /// <param name="Points">Points to draw.</param>
        /// <param name="Parameters">Graph-specific parameters.</param>
        /// <param name="PrevPoints">Points of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevParameters">Parameters of previous graph of same type (if available), null (if not available).</param>
        /// <param name="DrawingArea">Current drawing area.</param>
        public void DrawGraph(SKCanvas Canvas, SKPoint[] Points, object[] Parameters, SKPoint[] PrevPoints, object[] PrevParameters,
                              DrawingArea DrawingArea)
        {
            SKPaint Brush = null;
            SKPath  Path  = null;

            try
            {
                Brush = new SKPaint()
                {
                    Color = Graph.ToColor(Parameters[0]),
                    Style = SKPaintStyle.Fill
                };
                Path = new SKPath();

                float HalfBarWidth = (DrawingArea.Width - Points.Length) * 0.45f / Points.Length;
                float x0, y0, x1, y1;
                int   i, c;

                if (!(PrevPoints is null))
                {
                    if ((c = PrevPoints.Length) != Points.Length)
                    {
                        PrevPoints = null;
                    }
                    else
                    {
                        for (i = 0; i < c; i++)
                        {
                            if (PrevPoints[i].X != Points[i].X)
                            {
                                PrevPoints = null;
                                break;
                            }
                        }
                    }
                }

                i = 0;
                foreach (SKPoint Point in Points)
                {
                    x0 = Point.X - HalfBarWidth + 1;
                    y0 = Point.Y;
                    x1 = Point.X + HalfBarWidth - 1;
                    y1 = PrevPoints != null ? PrevPoints[i++].Y : DrawingArea.OrigoY;

                    Canvas.DrawRect(new SKRect(x0, y0, x1, y1), Brush);
                }

                Canvas.DrawPath(Path, Brush);
            }
            finally
            {
                Brush?.Dispose();
                Path?.Dispose();
            }
        }
예제 #30
0
        public override void Draw(Diagram diagram)
        {
            // Select text alignment.
            int aVal = (int)Alignment;

            SKTextAlign alignment = SKTextAlign.Left;

            if (aVal % 3 == 2)
            {
                alignment = SKTextAlign.Right;
            }
            if (aVal % 3 == 1)
            {
                alignment = SKTextAlign.Center;
            }

            // Paint and style.
            SKFontStyle style = new SKFontStyle(
                Bold ? SKFontStyleWeight.Bold : SKFontStyleWeight.Normal,
                SKFontStyleWidth.Normal,
                Italic ? SKFontStyleSlant.Italic : SKFontStyleSlant.Upright
                );

            SKPaint paint = new SKPaint
            {
                Color       = Colour,
                IsAntialias = true,
                Typeface    = SKTypeface.FromFamilyName(FontFamily, style),
                TextAlign   = alignment,
                TextSize    = FontSize
            };

            TextWidth *= (paint.FontMetrics.MaxCharacterWidth / FontSize);  // Compensation of font width.

            // Vertical alignment compensation.
            string[] lines = Content.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

            float comp = FontSize / 2;

            if (aVal < 3)
            {
                comp = FontSize;
            }
            else if (aVal > 5)
            {
                comp = 0;
            }

            for (int i = 0; i < lines.Length; i++)
            {
                diagram.DiagramSurface.Canvas.DrawText(lines[i], X, Y + comp + (i * FontSize), paint);
            }
            paint.Dispose();
        }