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

            canvas.Clear();

            SKShaderTileMode tileMode =
                (SKShaderTileMode)(tileModePicker.SelectedIndex == -1 ?
                                   0 : tileModePicker.SelectedItem);

            using (SKPaint paint = new SKPaint())
            {
                paint.Shader = SKShader.CreateRadialGradient(
                    new SKPoint(info.Rect.MidX, info.Rect.MidY),
                    100,
                    new SKColor[] { SKColors.Black, SKColors.White },
                    null,
                    tileMode);

                canvas.DrawRect(info.Rect, paint);
            }
        }
        protected void DrawPointAreas(SKCanvas canvas, SKPoint[] points, float origin)
        {
            if (points.Length > 0 && this.PointAreaAlpha > 0)
            {
                for (int i = 0; i < points.Length; i++)
                {
                    var entry = this.Entries.ElementAt(i);
                    var point = points[i];
                    var y     = Math.Min(origin, point.Y);

                    using (var shader = SKShader.CreateLinearGradient(new SKPoint(0, origin), new SKPoint(0, point.Y), new[] { entry.Color.WithAlpha(this.PointAreaAlpha), entry.Color.WithAlpha((byte)(this.PointAreaAlpha / 3)) }, null, SKShaderTileMode.Clamp))
                        using (var paint = new SKPaint
                        {
                            Style = SKPaintStyle.Fill,
                            Color = entry.Color.WithAlpha(this.PointAreaAlpha),
                        })
                        {
                            paint.Shader = shader;
                            var height = Math.Max(2, Math.Abs(origin - point.Y));
                            canvas.DrawRect(SKRect.Create(point.X - (this.PointSize / 2), y, this.PointSize, height), paint);
                        }
                }
            }
        }
        public IDisposable Apply(SKCanvas canvas, SKPaint paint, SKRect frame)
        {
            SKPoint end;

            var x     = this.Direction.X > 0 ? frame.Left : frame.Right;
            var y     = this.Direction.Y > 0 ? frame.Top : frame.Bottom;
            var start = new SKPoint(x, y);

            if (Math.Abs(this.Direction.X) > Math.Abs(this.Direction.Y))
            {
                var w = frame.Height * (this.Direction.X / this.Direction.Y);
                var h = frame.Height * Math.Sign(this.Direction.Y);
                end = new SKPoint(x + w, y + h);
            }
            else
            {
                var h = frame.Height * (this.Direction.Y / this.Direction.X);
                var w = frame.Width * Math.Sign(this.Direction.X);
                end = new SKPoint(x + w, y + h);
            }

            paint.Shader = SKShader.CreateLinearGradient(start, end, this.Colors, this.Points, SKShaderTileMode.Clamp);
            return(paint.Shader);
        }
        public void DrawBoard(SKCanvas thisCanvas, float Width, float Height) // i think when drawing the board, it needs to recalculate so it can draw the pads as well.
        {
            SKRect  bounds    = SKRect.Create(0, 0, Width, Height);
            SKPaint ThisPaint = new SKPaint();

            ThisPaint.IsAntialias   = true;
            ThisPaint.FilterQuality = SKFilterQuality.High;
            SKPoint FirstPoint;
            SKPoint SecondPoint;

            FirstPoint  = new SKPoint(0, 0);
            SecondPoint = new SKPoint(0, Height);
            SKColor[] Colors;
            Colors = new SKColor[2];
            SKColor FirstColor;
            SKColor SecondColor;

            FirstColor       = SKColors.LightBlue;
            SecondColor      = SKColors.DarkBlue;
            Colors[0]        = FirstColor;
            Colors[1]        = SecondColor;
            ThisPaint.Shader = SKShader.CreateLinearGradient(FirstPoint, SecondPoint, Colors, null, SKShaderTileMode.Clamp);
            thisCanvas.DrawRect(bounds, ThisPaint);
        }
Esempio n. 5
0
        protected void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
        {
            SKImageInfo info    = args.Info;
            SKSurface   surface = args.Surface;
            SKCanvas    canvas  = surface.Canvas;

            canvas.Clear();
            using (SKPaint paint = new SKPaint())
            {
                SKColor SpideyBlueBckGrnd;
                //SKColor.TryParse("#020f1f", out SpideyBlueBckGrnd);
                SKColor.TryParse("#ECE9E6", out SpideyBlueBckGrnd);
                SKColor SpideyLightBlueBckGrnd;
                SKColor.TryParse("#FFFFFF", out SpideyLightBlueBckGrnd);
                //SKColor.TryParse("#001c41", out SpideyLightBlueBckGrnd);
                paint.Shader = SKShader.CreateLinearGradient(
                    new SKPoint(info.Rect.Top, info.Rect.Top),
                    new SKPoint(info.Rect.Bottom, info.Rect.Bottom),
                    new SKColor[] { SpideyBlueBckGrnd, SpideyLightBlueBckGrnd },
                    new float[] { 0, 10.80f },
                    SKShaderTileMode.Mirror);
                canvas.DrawRect(info.Rect, paint);
            }
        }
Esempio n. 6
0
        protected override void OnPaintSurface(SKPaintSurfaceEventArgs e)
        {
            var info = e.Info;

            var canvas = e.Surface.Canvas;

            canvas.Clear();

            canvas.Save();

            _path.MoveTo(0, 0);

            _path.LineTo(info.Width, 0);

            _path.LineTo(info.Width, info.Height / 2.5f);

            _path.LineTo(0, info.Height);

            _path.Close();

            _paint.Style = SKPaintStyle.Fill;

            _paint.Shader = SKShader.CreateLinearGradient(new SKPoint(0, 0),
                                                          new SKPoint(info.Width, ((float)info.Height).Scale(0.5f)),
                                                          new SKColor[]
            {
                BackgroundColor.ToBaseGradientColors(IsEnabled)[0],
                BackgroundColor.ToBaseGradientColors(IsEnabled)[1],
            }, SKShaderTileMode.Clamp);

            _paint.ImageFilter = SKImageFilter.CreateDropShadow(0, 1f, 3f, 3f, SKColors.Black);

            canvas.DrawPath(_path, _paint);

            canvas.Restore();
        }
Esempio n. 7
0
        public static void UpdateBackgroundCanvas(SKCanvas canvas, int width, int height)
        {
            try
            {
#if !(GTK || CLI)
                var colors    = new SKColor[] { Theme.PrimaryColor.Color.ToSKColor(), Theme.SecondaryColor.Color.ToSKColor() };
                var positions = new float[] { 0.0f, 1.0f };

                using (var gradient = SKShader.CreateLinearGradient(new SKPoint(0, height / 2), new SKPoint(width, height / 2), colors, positions, SKShaderTileMode.Mirror))
                {
                    using (var paint = new SKPaint {
                        Shader = gradient, IsAntialias = true
                    })
                    {
                        canvas.DrawPaint(paint);
                    }
                }
#endif
            }
            catch (Exception ex)
            {
                Log.IgnoreException(ex);
            }
        }
Esempio n. 8
0
        public void BorderAndLayout()
        {
            const string file = "..\\..\\..\\AssertionImages\\border.png";
            var          bord = new Border
            {
                Foreground = new SKPaint {
                    Color = SKColors.White, IsAntialias = true
                },
                BorderBrush = new SKPaint {
                    Color = SKColors.Gray.WithAlpha(255), IsStroke = true, IsAntialias = true
                },
                Background = new SKPaint
                {
                    Color       = SKColors.White,
                    IsStroke    = false,
                    IsAntialias = true,
                    Shader      = SKShader.CreateLinearGradient(new SKPoint(0, 250), new SKPoint(0, 280),
                                                                new[] { new SKColor(70, 70, 70), SKColors.Black },
                                                                new[] { 0f, 1f }, SKShaderTileMode.Clamp)
                },
                CornerRadius = new CornerRadius(10),
                Thickness    = new Thickness(1, 5),
                HorizAlign   = HorizAlign.Left,
                VertAlign    = VertAlign.Top,
                Width        = 100,
                Height       = 50,
                Margin       = new Thickness(20),
                Content      = "Hello World"
            };
            var visualContext = new VisualContext(_app.MainWindow);

            visualContext.AddVisual(bord);
            visualContext.Render();
            visualContext.SaveToImage(file);
            Process.Start("mspaint.exe", Path.Combine(Environment.CurrentDirectory, file));
        }
Esempio n. 9
0
        void CreateTickMarks(SKCanvas canvas, SKImageInfo info)
        {
            var numTicks   = 15;
            var distance   = (info.Width - sidePadding * 2) / numTicks;
            var tickHeight = 60;


            for (int i = 1; i < numTicks; i++)
            {
                var start = new SKPoint(i * distance + sidePadding, info.Height - bottomPadding);
                var end   = new SKPoint(i * distance + sidePadding, info.Height - bottomPadding - (tickHeight));



                tickBrush.Shader = SKShader.CreateLinearGradient(
                    start,
                    end,
                    new SKColor[] { new SKColor(255, 255, 255, 200), new SKColor(255, 255, 255, 0) },
                    new float[] { 0, 1 },
                    SKShaderTileMode.Clamp);

                canvas.DrawLine(start, end, tickBrush);
            }
        }
Esempio n. 10
0
        public void DrawConnector(SKCanvas canvas, float _radX, float _radY)
        {
            float totalFlow     = 0;
            float totalSpO2     = 0;
            float totalSpO2To   = 0;
            float totalSpO2From = 0;
            float currentVolume = 0;
            float radius        = 0;

            scale  = _radX * scaleRelative;
            radius = _radX / 2.5f;

            if (_radX > _radY)
            {
                scale  = _radY * scaleRelative;
                radius = _radY / 2.5f;
            }


            float left   = (float)Math.Sin(270 * 0.0174532925) * RadiusXOffset * radius;
            float right  = (float)Math.Sin(90 * 0.0174532925) * RadiusXOffset * radius;
            float top    = (float)Math.Cos(180 * 0.0174532925) * RadiusYOffset * radius;
            float bottom = (float)Math.Cos(0 * 0.0174532925) * RadiusYOffset * radius;



            // calculate the total volume and average spO2 if lumping is the case
            foreach (ValveConnector c in connectors)
            {
                totalFlow += (float)c.CurrentFlow * Speed;
                if (totalFlow >= 0)
                {
                    totalSpO2 += (float)c.Comp1.TO2;
                    if (NoLoss)
                    {
                        totalSpO2From += (float)c.Comp1.TO2;
                        totalSpO2To   += (float)c.Comp1.TO2;
                    }
                    else
                    {
                        totalSpO2From += (float)c.Comp1.TO2;
                        totalSpO2To   += (float)c.Comp2.TO2;
                    }
                }
                else
                {
                    totalSpO2 += (float)c.Comp2.TO2;
                    if (NoLoss)
                    {
                        totalSpO2From += (float)c.Comp2.TO2;
                        totalSpO2To   += (float)c.Comp2.TO2;
                    }
                    else
                    {
                        totalSpO2From += (float)c.Comp2.TO2;
                        totalSpO2To   += (float)c.Comp1.TO2;
                    }
                }
                Title = "";
            }

            tempAverageFlow += totalFlow;

            if (averageCounter > 100)
            {
                AverageFlow     = Math.Abs(tempAverageFlow) / averageCounter;
                tempAverageFlow = 0;
                averageCounter  = 0;
            }
            averageCounter++;

            //paint.Color = CalculateColor(totalSpO2 / connectors.Count);
            colorTo   = AnimatedElementHelper.CalculateBloodColor(totalSpO2To / connectors.Count);
            colorFrom = AnimatedElementHelper.CalculateBloodColor(totalSpO2From / connectors.Count);

            currentAngle += totalFlow * Direction;
            if (Math.Abs(currentAngle) > Math.Abs(StartAngle - EndAngle))
            {
                currentAngle = 0;
            }

            if (sizeCompartment != null)
            {
                currentVolume         = (float)sizeCompartment.VolCurrent;
                circleOut.StrokeWidth = AnimatedElementHelper.RadiusCalculator(currentVolume, scale);
            }
            else
            {
                StrokeWidth = AverageFlow * Width;
                if (StrokeWidth > 30)
                {
                    StrokeWidth = 30;
                }
                if (StrokeWidth < 2)
                {
                    StrokeWidth = 2;
                }

                strokeStepsize      = (StrokeWidth - currentStrokeWidth) / 10;
                currentStrokeWidth += strokeStepsize;
                if (Math.Abs(currentStrokeWidth - StrokeWidth) < Math.Abs(strokeStepsize))
                {
                    strokeStepsize     = 0;
                    currentStrokeWidth = StrokeWidth;
                }

                circleOut.StrokeWidth = currentStrokeWidth;
            }

            // calculate position
            locationOrigen = AnimatedElementHelper.GetPosition(StartAngle, radius, RadiusXOffset, RadiusYOffset);
            locationTarget = AnimatedElementHelper.GetPosition(EndAngle, radius, RadiusXOffset, RadiusYOffset);

            SKRect mainRect = new SKRect(left, top, right, bottom);


            circleOut.Shader = SKShader.CreateSweepGradient(
                new SKPoint(0f, 0f),
                new SKColor[] { colorFrom, colorTo },
                new float[] { StartAngle / 360f, EndAngle / 360f }
                );



            using (SKPath path = new SKPath())
            {
                path.AddArc(mainRect, StartAngle, Math.Abs(StartAngle - EndAngle));
                canvas.DrawPath(path, circleOut);
            }

            location1 = AnimatedElementHelper.GetPosition(StartAngle + currentAngle, radius, RadiusXOffset, RadiusYOffset);
            canvas.DrawCircle(location1.X + XOffset, location1.Y + YOffset, 7, paint);
        }
Esempio n. 11
0
        protected override void OnPaintSurface(SKPaintSurfaceEventArgs e)
        {
            base.OnPaintSurface(e);
            var canvas = e.Surface.Canvas;

            canvas.Clear();

            int width  = e.Info.Width;
            int height = e.Info.Height;

            SKPaint backPaint = new SKPaint
            {
                Style = SKPaintStyle.Fill,
                Color = SKColors.WhiteSmoke,
            };

            canvas.DrawRect(new SKRect(0, 0, width, height), backPaint);

            canvas.Save();

            canvas.Translate(width / 2, height / 2);
            canvas.Scale(Math.Min(width / 210f, height / 520f));

            var rect = new SKRect(-100, -100, 100, 100);

            // Add a buffer for the rectangle
            rect.Inflate(-10, -10);

            var bgColorPaint = new SKPaint
            {
                Color       = BGColor.ToSKColor(),
                IsAntialias = true,
                Style       = SKPaintStyle.Fill,
                StrokeWidth = 0
            };


            var barColorPaint = new SKPaint
            {
                Color       = BarColor.ToSKColor(),
                IsAntialias = true,
                Style       = SKPaintStyle.Fill,
                StrokeWidth = 0
            };

            var frameColorPaint = new SKPaint
            {
                Color       = FrameColor.ToSKColor(),
                IsAntialias = true,
                Style       = SKPaintStyle.Stroke,
                StrokeWidth = 2
            };

            var skrect      = new SKRect(0, 0, PGWidth, PGHeight);
            var skRoundRect = new SKRoundRect(skrect, PGHeight / 2, PGHeight / 2);

            canvas.DrawRoundRect(0, 0, PGWidth, PGHeight, PGHeight / 2, PGHeight / 2, bgColorPaint);
            canvas.DrawRoundRect(skRoundRect, frameColorPaint);
            canvas.ClipRoundRect(skRoundRect, SKClipOperation.Intersect);

            if (StartColor != Color.Default && EndColor != Color.Default)
            {
                barColorPaint.Shader = SKShader.CreateLinearGradient(
                    new SKPoint(skrect.Left, skrect.Bottom),
                    new SKPoint(skrect.Right, skrect.Top),
                    new SKColor[] { StartColor.ToSKColor(), EndColor.ToSKColor() },
                    new float[] { 0, 1 },
                    SKShaderTileMode.Repeat);
            }
            canvas.DrawRoundRect(0, 0, PGWidth * Progress / 100, PGHeight, PGWidth / 2, 0, barColorPaint);

            canvas.Restore();
        }
Esempio n. 12
0
        private SKBitmap BuildThumbCollageBitmap(string[] paths, int width, int height)
        {
            var bitmap = new SKBitmap(width, height);

            using (var canvas = new SKCanvas(bitmap))
            {
                canvas.Clear(SKColors.Black);

                // determine sizes for each image that will composited into the final image
                var iSlice  = Convert.ToInt32(width * 0.23475);
                int iTrans  = Convert.ToInt32(height * .25);
                int iHeight = Convert.ToInt32(height * .70);
                var horizontalImagePadding = Convert.ToInt32(width * 0.0125);
                var verticalSpacing        = Convert.ToInt32(height * 0.01111111111111111111111111111111);
                int imageIndex             = 0;

                for (int i = 0; i < 4; i++)
                {
                    SKCodecOrigin origin;
                    using (var currentBitmap = SkiaEncoder.Decode(paths[imageIndex], false, out origin))
                    {
                        // resize to the same aspect as the original
                        int iWidth = (int)Math.Abs(iHeight * currentBitmap.Width / currentBitmap.Height);
                        using (var resizeBitmap = new SKBitmap(iWidth, iHeight, currentBitmap.ColorType, currentBitmap.AlphaType))
                        {
                            currentBitmap.Resize(resizeBitmap, SKBitmapResizeMethod.Lanczos3);
                            // determine how much to crop
                            int ix = (int)Math.Abs((iWidth - iSlice) / 2);
                            using (var image = SKImage.FromBitmap(resizeBitmap))
                            {
                                // crop image
                                using (var subset = image.Subset(SKRectI.Create(ix, 0, iSlice, iHeight)))
                                {
                                    // draw image onto canvas
                                    canvas.DrawImage(subset, (horizontalImagePadding * (i + 1)) + (iSlice * i), verticalSpacing);

                                    using (var croppedBitmap = SKBitmap.FromImage(subset))
                                    {
                                        // create reflection of image below the drawn image
                                        using (var reflectionBitmap = new SKBitmap(croppedBitmap.Width, croppedBitmap.Height / 2, croppedBitmap.ColorType, croppedBitmap.AlphaType))
                                        {
                                            // resize to half height
                                            croppedBitmap.Resize(reflectionBitmap, SKBitmapResizeMethod.Lanczos3);

                                            using (var flippedBitmap = new SKBitmap(reflectionBitmap.Width, reflectionBitmap.Height, reflectionBitmap.ColorType, reflectionBitmap.AlphaType))
                                            {
                                                using (var flippedCanvas = new SKCanvas(flippedBitmap))
                                                {
                                                    // flip image vertically
                                                    var matrix = SKMatrix.MakeScale(1, -1);
                                                    matrix.SetScaleTranslate(1, -1, 0, flippedBitmap.Height);
                                                    flippedCanvas.SetMatrix(matrix);
                                                    flippedCanvas.DrawBitmap(reflectionBitmap, 0, 0);
                                                    flippedCanvas.ResetMatrix();

                                                    // create gradient to make image appear as a reflection
                                                    var remainingHeight = height - (iHeight + (2 * verticalSpacing));
                                                    flippedCanvas.ClipRect(SKRect.Create(reflectionBitmap.Width, remainingHeight));
                                                    using (var gradient = new SKPaint())
                                                    {
                                                        gradient.IsAntialias = true;
                                                        gradient.BlendMode   = SKBlendMode.SrcOver;
                                                        gradient.Shader      = SKShader.CreateLinearGradient(new SKPoint(0, 0), new SKPoint(0, remainingHeight), new[] { new SKColor(0, 0, 0, 128), new SKColor(0, 0, 0, 208), new SKColor(0, 0, 0, 240), new SKColor(0, 0, 0, 255) }, null, SKShaderTileMode.Clamp);
                                                        flippedCanvas.DrawPaint(gradient);
                                                    }

                                                    // finally draw reflection onto canvas
                                                    canvas.DrawBitmap(flippedBitmap, (horizontalImagePadding * (i + 1)) + (iSlice * i), iHeight + (2 * verticalSpacing));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    imageIndex++;

                    if (imageIndex >= paths.Length)
                    {
                        imageIndex = 0;
                    }
                }
            }

            return(bitmap);
        }
Esempio n. 13
0
 public SKShader GetShader()
 {
     return(SKShader.CreatePicture(GetPicture(), SKShaderTileMode.Repeat, SKShaderTileMode.Repeat, SKMatrix, Box));
 }
Esempio n. 14
0
        protected override void OnDrawSample(SKCanvas canvas, int width, int height)
        {
            var modes = Enum.GetValues(typeof(SKXferMode)).Cast <SKXferMode>().ToArray();

            var cols = width < height ? 3 : 5;
            var rows = (modes.Length - 1) / cols + 1;

            var w         = (float)width / cols;
            var h         = (float)height / rows;
            var rect      = SKRect.Create(w, h);
            var srcPoints = new[] {
                new SKPoint(0.0f, 0.0f),
                new SKPoint(w, 0.0f)
            };
            var srcColors = new[] {
                SKColors.Magenta.WithAlpha(0),
                SKColors.Magenta
            };
            var dstPoints = new[] {
                new SKPoint(0.0f, 0.0f),
                new SKPoint(0.0f, h)
            };
            var dstColors = new[] {
                SKColors.Cyan.WithAlpha(0),
                SKColors.Cyan
            };

            using (var text = new SKPaint())
                using (var stroke = new SKPaint())
                    using (var src = new SKPaint())
                        using (var dst = new SKPaint())
                            using (var srcShader = SKShader.CreateLinearGradient(srcPoints[0], srcPoints[1], srcColors, null, SKShaderTileMode.Clamp))
                                using (var dstShader = SKShader.CreateLinearGradient(dstPoints[0], dstPoints[1], dstColors, null, SKShaderTileMode.Clamp))
                                {
                                    text.TextSize    = 12.0f;
                                    text.IsAntialias = true;
                                    text.TextAlign   = SKTextAlign.Center;
                                    stroke.IsStroke  = true;
                                    src.Shader       = srcShader;
                                    dst.Shader       = dstShader;

                                    canvas.Clear(SKColors.White);

                                    for (var i = 0; i < modes.Length; ++i)
                                    {
                                        using (new SKAutoCanvasRestore(canvas, true))
                                        {
                                            canvas.Translate(w * (i / rows), h * (i % rows));

                                            canvas.ClipRect(rect);
                                            canvas.DrawColor(SKColors.LightGray);

                                            canvas.SaveLayer(null);
                                            canvas.Clear(SKColors.Transparent);
                                            canvas.DrawPaint(dst);

                                            src.XferMode = modes[i];
                                            canvas.DrawPaint(src);
                                            canvas.DrawRect(rect, stroke);

                                            var desc = modes[i].ToString();
                                            canvas.DrawText(desc, w / 2f, h / 2f, text);
                                        }
                                    }
                                }
        }
Esempio n. 15
0
        protected override void OnPaintSurface(SKPaintSurfaceEventArgs eventArgs)
        {
            var givenCanvas = eventArgs.Surface.Canvas;

            givenCanvas.Clear();
            int canvasWidth  = eventArgs.Info.Width;
            int canvasHeight = eventArgs.Info.Height;

            float rectRadius      = ((canvasHeight - 20) / 4);
            float rectRadiusInner = ButtonRadius - 10;

            if (rectRadiusInner < 0)
            {
                rectRadiusInner = ButtonRadius;
            }

            this.roundRectButton = new SKRoundRect(new SKRect(0, 0, canvasWidth, canvasHeight - 20), ButtonRadius, ButtonRadius);
            this.paintButton     = new SKPaint()
            {
                Color       = this.ColorPrimary.ToSKColor(),
                IsAntialias = true
            };


            if (HasShadow)
            {
                paintButton.ImageFilter = SKImageFilter.CreateDropShadow(
                    0,
                    8,
                    0,
                    5,
                    Color.FromRgba(0, 0, 0, 0.4).ToSKColor(),
                    SKDropShadowImageFilterShadowMode.DrawShadowAndForeground
                    );
            }

            if (this.IsGradient)
            {
                this.paintButton.Shader = SKShader.CreateLinearGradient(
                    new SKPoint(this.roundRectButton.Rect.Left, this.roundRectButton.Rect.Top),
                    new SKPoint(this.roundRectButton.Rect.Right, this.roundRectButton.Rect.Bottom),
                    new SKColor[] {
                    this.ColorPrimary.ToSKColor(),
                    this.ColorSecondary.ToSKColor()
                },
                    new float[] {
                    this.buttonGradientOffset,
                    1
                },
                    SKShaderTileMode.Repeat
                    );
            }

            givenCanvas.DrawRoundRect(this.roundRectButton, this.paintButton);

            this.roundRectButtonInner = new SKRoundRect(new SKRect(10, 10, canvasWidth - 10, canvasHeight - 30), rectRadiusInner, rectRadiusInner);
            this.paintButtonInner     = new SKPaint()
            {
                IsAntialias = true,
                Color       = SKColors.Transparent,
                Style       = SKPaintStyle.Fill,
                BlendMode   = SKBlendMode.SrcOut
            };
            givenCanvas.DrawRoundRect(this.roundRectButtonInner, this.paintButtonInner);

            SKPaint paintButtonTitle = new SKPaint()
            {
                Color       = this.ColorText.ToSKColor(),
                TextSize    = FontSize * coreSettings.ScalingFactor,
                IsAntialias = true,
                TextAlign   = TextAlign,
                Typeface    = TextFont
            };

            if (this.IsGradient)
            {
                paintButtonTitle.Shader = SKShader.CreateLinearGradient(
                    new SKPoint(this.roundRectButton.Rect.Left, this.roundRectButton.Rect.Top),
                    new SKPoint(this.roundRectButton.Rect.Right, this.roundRectButton.Rect.Bottom),
                    new SKColor[] {
                    this.ColorPrimary.ToSKColor(),
                    this.ColorSecondary.ToSKColor()
                },
                    new float[] {
                    this.buttonGradientOffset,
                    1
                },
                    SKShaderTileMode.Repeat
                    );
            }

            givenCanvas.DrawText(this.ButtonTitle, canvasWidth / 2, ((canvasHeight - 30) / 2 + 25), paintButtonTitle);
        }
Esempio n. 16
0
        internal PaintWrapper CreatePaint(IBrush brush, Size targetSize)
        {
            SKPaint paint = new SKPaint();
            var     rv    = new PaintWrapper(paint);

            paint.IsStroke = false;


            double opacity = brush.Opacity * _currentOpacity;

            paint.IsAntialias = true;

            var solid = brush as ISolidColorBrush;

            if (solid != null)
            {
                paint.Color = new SKColor(solid.Color.R, solid.Color.G, solid.Color.B, (byte)(solid.Color.A * opacity));
                return(rv);
            }
            paint.Color = (new SKColor(255, 255, 255, (byte)(255 * opacity)));

            var gradient = brush as IGradientBrush;

            if (gradient != null)
            {
                var tileMode    = gradient.SpreadMethod.ToSKShaderTileMode();
                var stopColors  = gradient.GradientStops.Select(s => s.Color.ToSKColor()).ToArray();
                var stopOffsets = gradient.GradientStops.Select(s => (float)s.Offset).ToArray();

                var linearGradient = brush as ILinearGradientBrush;
                if (linearGradient != null)
                {
                    var start = linearGradient.StartPoint.ToPixels(targetSize).ToSKPoint();
                    var end   = linearGradient.EndPoint.ToPixels(targetSize).ToSKPoint();

                    // would be nice to cache these shaders possibly?
                    using (var shader = SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode))
                        paint.Shader = shader;
                }
                else
                {
                    var radialGradient = brush as IRadialGradientBrush;
                    if (radialGradient != null)
                    {
                        var center = radialGradient.Center.ToPixels(targetSize).ToSKPoint();
                        var radius = (float)radialGradient.Radius;

                        // TODO: There is no SetAlpha in SkiaSharp
                        //paint.setAlpha(128);

                        // would be nice to cache these shaders possibly?
                        using (var shader = SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode))
                            paint.Shader = shader;
                    }
                }

                return(rv);
            }

            var tileBrush      = brush as ITileBrush;
            var visualBrush    = brush as IVisualBrush;
            var tileBrushImage = default(BitmapImpl);

            if (visualBrush != null)
            {
                if (_visualBrushRenderer != null)
                {
                    var intermediateSize = _visualBrushRenderer.GetRenderTargetSize(visualBrush);

                    if (intermediateSize.Width >= 1 && intermediateSize.Height >= 1)
                    {
                        var intermediate = new BitmapImpl((int)intermediateSize.Width, (int)intermediateSize.Height);

                        using (var ctx = intermediate.CreateDrawingContext(_visualBrushRenderer))
                        {
                            ctx.Clear(Colors.Transparent);
                            _visualBrushRenderer.RenderVisualBrush(ctx, visualBrush);
                        }

                        rv.AddDisposable(tileBrushImage);
                        tileBrushImage = intermediate;
                    }
                }
                else
                {
                    throw new NotSupportedException("No IVisualBrushRenderer was supplied to DrawingContextImpl.");
                }
            }
            else
            {
                tileBrushImage = (BitmapImpl)((tileBrush as IImageBrush)?.Source?.PlatformImpl);
            }

            if (tileBrush != null && tileBrushImage != null)
            {
                var calc   = new TileBrushCalculator(tileBrush, new Size(tileBrushImage.PixelWidth, tileBrushImage.PixelHeight), targetSize);
                var bitmap = new BitmapImpl((int)calc.IntermediateSize.Width, (int)calc.IntermediateSize.Height);
                rv.AddDisposable(bitmap);
                using (var context = bitmap.CreateDrawingContext(null))
                {
                    var rect = new Rect(0, 0, tileBrushImage.PixelWidth, tileBrushImage.PixelHeight);

                    context.Clear(Colors.Transparent);
                    context.PushClip(calc.IntermediateClip);
                    context.Transform = calc.IntermediateTransform;
                    context.DrawImage(tileBrushImage, 1, rect, rect);
                    context.PopClip();
                }

                SKMatrix         translation = SKMatrix.MakeTranslation(-(float)calc.DestinationRect.X, -(float)calc.DestinationRect.Y);
                SKShaderTileMode tileX       =
                    tileBrush.TileMode == TileMode.None
                        ? SKShaderTileMode.Clamp
                        : tileBrush.TileMode == TileMode.FlipX || tileBrush.TileMode == TileMode.FlipXY
                            ? SKShaderTileMode.Mirror
                            : SKShaderTileMode.Repeat;

                SKShaderTileMode tileY =
                    tileBrush.TileMode == TileMode.None
                        ? SKShaderTileMode.Clamp
                        : tileBrush.TileMode == TileMode.FlipY || tileBrush.TileMode == TileMode.FlipXY
                            ? SKShaderTileMode.Mirror
                            : SKShaderTileMode.Repeat;
                using (var shader = SKShader.CreateBitmap(bitmap.Bitmap, tileX, tileY, translation))
                    paint.Shader = shader;
            }

            return(rv);
        }
Esempio n. 17
0
 public PaintState(SKPaint paint, SKColor color, SKShader shader)
 {
     _paint  = paint;
     _color  = color;
     _shader = shader;
 }
Esempio n. 18
0
        public override void Render(IStateOwner pOwner, SKCanvas pRenderTarget, ShowHighScoresState Source, GameStateSkiaDrawParameters Element)
        {
            if (Source.BG == null)
            {
                StandardImageBackgroundSkia sk = StandardImageBackgroundSkia.GetMenuBackgroundDrawer();
                sk.Data.Movement = new SKPoint(3, 3);
                Source.BG        = sk;
            }
            var Bounds = Element.Bounds;
            var g      = pRenderTarget;

            float StartY   = (Bounds.Height * 0.175f);
            var   CurrentY = StartY;
            float MiddleX  = Bounds.Width / 2;

            DrawBackground(Source, pOwner, g, Bounds);
            float   TextSize      = Bounds.Height / 30f;
            var     ScoreFont     = TetrisGame.RetroFontSK; //point size 24.
            SKPaint MainScoreFont = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(24 * pOwner.ScaleFactor), Color = SKColors.Black
            };
            SKPaint ShadowScoreFont = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(24 * pOwner.ScaleFactor), Color = SKColors.White
            };
            SKPaint ListingFont = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColors.Black
            };
            float   PercentThroughSecond = (float)DateTime.Now.Millisecond / 1000f;
            SKPaint ListingFontRainbow   = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColor.FromHsl(PercentThroughSecond * 240, 240, 120)
            };
            SKPaint ListingFontShadow = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColors.White
            };
            SKPaint ListingFontArrow = new SKPaint()
            {
                Typeface = TetrisGame.ArialFontSK, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColor.FromHsl(PercentThroughSecond * 240, 240, 120)
            };
            SKPaint ListingFontArrowShadow = new SKPaint()
            {
                Typeface = TetrisGame.ArialFontSK, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColors.White
            };
            SKRect resultitem = new SKRect();
            float  LineHeight = MainScoreFont.MeasureText("#", ref resultitem);
            var    useShader  = SKShader.CreateLinearGradient(new SKPoint(0, 0), new SKPoint(0, Bounds.Height), new SKColor[] { SKColors.Red, SKColors.Orange, SKColors.Yellow, SKColors.Green, SKColors.Blue, SKColors.Indigo, SKColors.Violet }, null, SKShaderTileMode.Mirror);

            SKPaint LinePaint = new SKPaint()
            {
                BlendMode = SKBlendMode.ColorBurn, StrokeWidth = 24, Shader = useShader
            };

            g.DrawRect(new SKRect(0, 0, Bounds.Width, Bounds.Height), LinePaint);
            //g.DrawRect(new SKRect((int)(Bounds.Width * (1 / 7)), CurrentY, (float)(Bounds.Width - (Bounds.Width * (1 / 7))), (float)(CurrentY + (LineHeight * 2.5) + (LineHeight * 3) * 12)),LinePaint);



            if (Source.IncrementedDrawState >= 0)
            {
                //draw "HIGH SCORES" header text.
                SKRect MeasuredRect = new SKRect();
                MainScoreFont.MeasureText(Source.HeaderText, ref MeasuredRect);
                SKPoint DrawPosition = new SKPoint(MiddleX - (MeasuredRect.Width / 2), StartY);
                g.DrawText(Source.HeaderText, new SKPoint(DrawPosition.X + 2, DrawPosition.Y + 2), ShadowScoreFont);
                g.DrawText(Source.HeaderText, DrawPosition, MainScoreFont);
                CurrentY = StartY + MeasuredRect.Height + 10;
            }

            if (Source.IncrementedDrawState >= 1)
            {
                //maybe a line under the header.
            }

            if (Source.IncrementedDrawState >= 2)
            {
                //draw the high score listing entries.
                //iterate from 2 to drawstate and draw the high score at position drawstate-2.
                for (int scoreiterate = 2; scoreiterate < Source.IncrementedDrawState; scoreiterate++)
                {
                    int             CurrentScoreIndex    = scoreiterate - 2;
                    int             CurrentScorePosition = CurrentScoreIndex + 1;
                    double          useYPosition         = StartY + (LineHeight * 2.5) + (LineHeight * 3) * CurrentScoreIndex;
                    double          useXPosition         = Bounds.Width * 0.19d;
                    String          sUseName             = "N/A";
                    int             sUseScore            = 0;
                    IHighScoreEntry currentScore         = Source.hs.Count > CurrentScoreIndex ? Source.hs[CurrentScoreIndex] : null;
                    if (currentScore != null)
                    {
                        sUseName  = currentScore.Name;
                        sUseScore = currentScore.Score;
                    }
                    SKRect MeasureName = new SKRect(), MeasureScore = new SKRect();
                    ListingFont.MeasureText(sUseName, ref MeasureName);
                    ListingFont.MeasureText(sUseScore.ToString(), ref MeasureScore);
                    float PosXPosition        = Bounds.Width * 0.1f;
                    float NameXPosition       = Bounds.Width * 0.20f;
                    float ScoreXPositionRight = Bounds.Width * (1 - 0.10f);
                    var   useForegroundPaint  = Source.HighlightedScorePositions.Contains(CurrentScorePosition) ? ListingFontRainbow : ListingFont;

                    //draw position
                    g.DrawText(CurrentScorePosition.ToString() + ".", new SKPoint(PosXPosition + 2, (float)useYPosition + 2), ListingFontShadow);
                    g.DrawText(CurrentScorePosition.ToString() + ".", new SKPoint(PosXPosition, (float)useYPosition), useForegroundPaint);
                    //draw high score name
                    g.DrawText(sUseName, new SKPoint(PosXPosition + 2 + Math.Abs(resultitem.Height) * 2.25f, (float)useYPosition + 2), ListingFontShadow);
                    g.DrawText(sUseName, new SKPoint(PosXPosition + Math.Abs(resultitem.Height) * 2.25f, (float)useYPosition), useForegroundPaint);

                    //draw the high score
                    float ScoreXPosition = ScoreXPositionRight - MeasureScore.Width;

                    g.DrawText(sUseScore.ToString(), new SKPoint(ScoreXPosition + 2, (float)useYPosition + 2), ListingFontShadow);
                    g.DrawText(sUseScore.ToString(), new SKPoint(ScoreXPosition, (float)useYPosition), useForegroundPaint);
                    useForegroundPaint.StrokeWidth = 6;

                    g.DrawLine(new SKPoint(NameXPosition + MeasureName.Width + 15, (float)useYPosition + LineHeight / 2), new SKPoint(ScoreXPosition - 15, (float)useYPosition + LineHeight / 2), useForegroundPaint);

                    if (Source.SelectedScorePosition == CurrentScoreIndex)
                    {
                        //draw selection indicator if needed
                        SKRect MeasureArrow = new SKRect();
                        useForegroundPaint.MeasureText(PointerText, ref MeasureArrow);
                        float ArrowX = PosXPosition - MeasureArrow.Width - 5;
                        float ArrowY = (float)useYPosition;
                        g.DrawText(PointerText, new SKPoint(ArrowX + 2, ArrowY + 2), ListingFontArrowShadow);
                        g.DrawText(PointerText, new SKPoint(ArrowX, ArrowY), ListingFontArrow);
                    }
                }
            }
        }
Esempio n. 19
0
        private void SKCanvasView_PaintSurface(object sender, SkiaSharp.Views.Forms.SKPaintSurfaceEventArgs e)
        {
            var skImageInfo = e.Info;
            var skSurface   = e.Surface;
            var skCanvas    = skSurface.Canvas;

            var skCanvasWidth  = skImageInfo.Width;
            var skCanvasHeight = skImageInfo.Height;

            skCanvas.Clear();

            skCanvas.Translate((float)skCanvasWidth / 2, (float)skCanvasHeight / 2);

            using (SKPaint paintCenter = new SKPaint())
            {
                paintCenter.Style    = SKPaintStyle.Fill;
                paintCenter.Color    = SKColors.Black;
                paintCenter.IsDither = true;
                skCanvas.DrawCircle(0, 0, skCanvasWidth / 17f, paintCenter); // 45
            }

            SKPaint paintOrbit = new SKPaint
            {
                Style       = SKPaintStyle.Stroke,
                IsAntialias = true,
                StrokeWidth = 5,
            };
            var colors = new[] { SKColors.Gray, SKColors.LightGray, SKColors.Silver.WithAlpha(128) };

            using (var shader = SKShader.CreateSweepGradient(
                       new SKPoint(0, 0), colors, null))
            {
                paintOrbit.Shader = shader;
            }

            Random rand             = new Random();
            float  orbitAngleDegree = 180 / (float)ElectronsCount;

            for (double degrees = 0; degrees < (180); degrees += orbitAngleDegree)
            {
                var arcRectWidth  = rand.Next(skCanvasWidth / 4, skCanvasWidth / 2); //350
                var arcRectHeight = skCanvasHeight / 11.3f;                          //100

                skCanvas.DrawOval(0, 0, arcRectWidth, arcRectHeight, paintOrbit);

                using (SKPaint paintElectron = new SKPaint())
                {
                    paintElectron.Style       = SKPaintStyle.Fill;
                    paintElectron.Color       = SKColors.Black;
                    paintElectron.IsAntialias = true;
                    skCanvas.DrawCircle(arcRectWidth, 0, 10, paintElectron);
                }

                if (degrees == 0 && ElectronsCount % 2 == 0)
                {
                    skCanvas.RotateDegrees((float)orbitAngleDegree);
                }
                else
                {
                    skCanvas.RotateDegrees((float)orbitAngleDegree + 180);
                }
            }
        }
Esempio n. 20
0
        protected override void OnPaintSurface(SKPaintSurfaceEventArgs eventArgs)
        {
            var givenCanvas = eventArgs.Surface.Canvas;

            givenCanvas.Clear();

            this.canvasWidth  = eventArgs.Info.Width;
            this.canvasHeight = eventArgs.Info.Height;

            SKBitmap backgroundImageBitmap = new SKBitmap();

            //// Background image
            //if (this.imageBackground != "")
            //{
            //    string resourceID = this.imageBackground;
            //    Assembly assembly = GetType().GetTypeInfo().Assembly;

            //    using (Stream stream = assembly.GetManifestResourceStream(resourceID))
            //    {
            //        backgroundImageBitmap = SKBitmap.Decode(stream);
            //    }
            //}

            // Background progress circle
            SKPaint progressPaint = new SKPaint()
            {
                Color       = this.ColorBackground.ToSKColor(),
                Style       = SKPaintStyle.Stroke,
                StrokeJoin  = SKStrokeJoin.Round,
                IsStroke    = true,
                StrokeWidth = 30,
                IsAntialias = true
            };
            SKRect progressRect = new SKRect();

            progressRect.Size     = new SKSize(this.canvasWidth - 35, this.canvasHeight - 35);
            progressRect.Location = new SKPoint(15, 15);
            SKPath progressPath = new SKPath();

            progressPath.AddArc(progressRect, -90, 360);

            // Current progress circle
            SKPaint progressCurrentPaint = new SKPaint()
            {
                Color       = this.ColorPrimary.ToSKColor(),
                Style       = SKPaintStyle.Stroke,
                StrokeJoin  = SKStrokeJoin.Round,
                IsStroke    = true,
                StrokeCap   = SKStrokeCap.Round,
                StrokeWidth = 30,
                IsAntialias = true
            };

            if (this.IsGradient)
            {
                progressCurrentPaint.Shader = SKShader.CreateLinearGradient(
                    new SKPoint(0, this.canvasWidth),
                    new SKPoint(this.canvasHeight, 0),
                    new SKColor[] {
                    this.ColorPrimary.ToSKColor(),
                    this.ColorSecondary.ToSKColor()
                },
                    new float[] {
                    0,
                    1
                },
                    SKShaderTileMode.Repeat
                    );
            }

            SKRect progressCurrentRect = new SKRect();

            progressCurrentRect.Size     = new SKSize(this.canvasWidth - 35, this.canvasHeight - 35);
            progressCurrentRect.Location = new SKPoint(15, 15);
            SKPath progressCurrentPath = new SKPath();

            progressCurrentPath.AddArc(progressCurrentRect, -90, this.progressCurrentSweepAngle);

            // Current progress text
            SKPaint progrssCurrentTextPaint = new SKPaint()
            {
                Color       = this.ColorPrimary.ToSKColor(),
                TextAlign   = SKTextAlign.Center,
                TextSize    = TextSize,
                IsAntialias = true
            };

            givenCanvas.ClipPath(progressPath, SKClipOperation.Intersect, true);

            //if(this.imageBackground != "")
            //{
            //    givenCanvas.DrawBitmap(
            //        backgroundImageBitmap,
            //        new SKRect(
            //            0,
            //            0,
            //            this.canvasWidth,
            //            this.canvasHeight
            //        )
            //    );
            //}

            givenCanvas.DrawPath(progressPath, progressPaint);
            givenCanvas.DrawPath(progressCurrentPath, progressCurrentPaint);
            var percentageIndicator = DisplayAsPercentage ? "%" : "";

            if (DisplayValue)
            {
                if (FormatProvider == null || CustomFormat == null)
                {
                    givenCanvas.DrawText(string.Format("{0}" + $"{percentageIndicator}", this.progressCurrentTextValue), (canvasWidth + 20) / 2, (canvasHeight + 20 + 35) / 2, progrssCurrentTextPaint);
                }

                if (FormatProvider != null && CustomFormat != null)
                {
                    givenCanvas.DrawText(string.Format(FormatProvider, CustomFormat, this.progressCurrentTextValue), (canvasWidth + 20) / 2, (canvasHeight + 20 + 35) / 2, progrssCurrentTextPaint);
                }
            }
        }
Esempio n. 21
0
        public void DrawConnector(SKCanvas canvas, float _radX, float _radY)
        {
            float totalFlow     = 0;
            float totalSpO2     = 0;
            float totalSpO2To   = 0;
            float totalSpO2From = 0;
            float currentVolume = 0;
            float radius        = 0;


            scale  = _radX * scaleRelative;
            radius = _radX / 2.5f;

            if (_radX > _radY)
            {
                scale  = _radY * scaleRelative;
                radius = _radY / 2.5f;
            }

            float left   = (float)Math.Sin(270 * 0.0174532925) * RadiusXOffset * radius + XOffset;
            float right  = (float)Math.Sin(90 * 0.0174532925) * RadiusXOffset * radius + XOffset;
            float top    = (float)Math.Cos(180 * 0.0174532925) * RadiusYOffset * radius + YOffset;
            float bottom = (float)Math.Cos(0 * 0.0174532925) * RadiusYOffset * radius + YOffset;

            // calculate the total volume and average spO2 if lumping is the case
            foreach (BloodCompartmentConnector c in connectors)
            {
                totalFlow += (float)c.RealFlow * Speed;
                if (totalFlow >= 0)
                {
                    totalSpO2 += (float)c.Comp1.TO2;
                    if (NoLoss)
                    {
                        totalSpO2From += (float)c.Comp1.TO2;
                        totalSpO2To   += (float)c.Comp1.TO2;
                    }
                    else
                    {
                        totalSpO2From += (float)c.Comp1.TO2;
                        totalSpO2To   += (float)c.Comp2.TO2;
                    }
                }
                else
                {
                    totalSpO2 += (float)c.Comp2.TO2;
                    if (NoLoss)
                    {
                        totalSpO2From += (float)c.Comp2.TO2;
                        totalSpO2To   += (float)c.Comp2.TO2;
                    }
                    else
                    {
                        totalSpO2From += (float)c.Comp2.TO2;
                        totalSpO2To   += (float)c.Comp1.TO2;
                    }
                }
                Title = "";
            }



            //paint.Color = CalculateColor(totalSpO2 / connectors.Count);
            colorTo   = CalculateColor(totalSpO2To / connectors.Count);
            colorFrom = CalculateColor(totalSpO2From / connectors.Count);

            currentAngle += totalFlow * Direction;

            // calculate position
            locationOrigen = GetPosition(StartAngle, radius);
            locationTarget = GetPosition(EndAngle, radius);


            float dx = (locationOrigen.X - locationTarget.X) / Math.Abs(StartAngle - EndAngle);
            float dy = (locationOrigen.Y - locationTarget.Y) / Math.Abs(StartAngle - EndAngle);

            if (Math.Abs(currentAngle) > Math.Abs(StartAngle - EndAngle))
            {
                currentAngle = 0;
            }

            if (currentAngle < 0)
            {
                currentAngle = 0;
            }

            if (sizeCompartment != null)
            {
                currentVolume         = (float)sizeCompartment.VolCurrent;
                circleOut.StrokeWidth = RadiusCalculator(currentVolume);
            }
            else
            {
                circleOut.StrokeWidth = 15;
            }

            SKRect mainRect = new SKRect(left, top, right, bottom);


            circleOut.Shader = SKShader.CreateLinearGradient(
                locationOrigen,
                locationTarget,
                new SKColor[] { colorFrom, colorTo },
                null,
                SKShaderTileMode.Mirror

                );

            offset.X = Math.Abs(locationOrigen.X - locationTarget.X) / 4f;

            using (SKPath path = new SKPath())
            {
                path.MoveTo(locationTarget);
                path.LineTo(locationOrigen);
                canvas.DrawPath(path, circleOut);
                canvas.DrawTextOnPath(Name, path, offset, textPaint2);
            }

            location1.X = locationOrigen.X - currentAngle * dx;
            location1.Y = locationOrigen.Y - currentAngle * dy;

            canvas.DrawCircle(location1.X + XOffset, location1.Y + YOffset, 10, paint);
        }
Esempio n. 22
0
        public bool Draw(SKCanvas canvas, IReadOnlyViewport viewport, ILayer layer, IFeature feature, IStyle istyle,
                         ISymbolCache symbolCache)
        {
            var style = ((TiledBitmapStyle)istyle);

            if (style.image == null)
            {
                return(false);
            }

            var position = feature.Geometry.BoundingBox.Centroid;
            var dest     = viewport.WorldToScreen(position);


            var zoom = 1 / (float)viewport.Resolution;

            canvas.Translate((float)dest.X, (float)dest.Y);
            canvas.Scale(zoom, zoom);

            canvas.RotateDegrees((float)viewport.Rotation, 0.0f, 0.0f);
            if (style.rotation != 0)
            {
                canvas.RotateDegrees(style.rotation, 0.0f, 0.0f);
            }

            //#TODO store paint with shader in the style
            using (SKPaint paint = new SKPaint())
            {
                if (style.rotation == 0) //Weird artifacting on 0 rotation, no idea why. Seems Skia bug.
                {
                    style.rotation = 180;
                }

                SKMatrix shaderTransform =
                    SKMatrix.CreateScale((float)viewport.Resolution, (float)viewport.Resolution);
                if (style.rotation != 0)
                {
                    shaderTransform = SKMatrix.Concat(shaderTransform, SKMatrix.CreateRotationDegrees(-style.rotation));
                }



                paint.Shader      = SKShader.CreateImage(style.image, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat, shaderTransform);
                paint.ColorFilter = style.colorFilter;

                //style.image.Encode().SaveTo(File.Create($"P:/{style.image.UniqueId}.png"));

                if (style.ellipse)
                {
                    canvas.DrawOval(0, 0, style.rect.Right, style.rect.Bottom, paint);
                }
                else
                {
                    canvas.DrawRect(style.rect, paint);
                }

                if (style.border)
                {
                    var borderPaint = new SKPaint
                    {
                        Style = SKPaintStyle.Stroke,
                        Color = style.color
                    };


                    if (style.ellipse)
                    {
                        canvas.DrawOval(0, 0, style.rect.Right, style.rect.Bottom, borderPaint);
                    }
                    else
                    {
                        canvas.DrawRect(style.rect, borderPaint);
                    }
                }
            }



            return(true);
        }
Esempio n. 23
0
 public void SetFixShader(SKShader shader)
 {
     variableShader = false;
     paint.Shader   = shader;
 }
Esempio n. 24
0
        private void DrawLineArea(SKCanvas canvas, ChartSerie serie, SKPoint[] points, SKSize itemSize, float origin)
        {
            if (LineAreaAlpha > 0 && points.Length > 1)
            {
                using (var paint = new SKPaint
                {
                    Style = SKPaintStyle.Fill,
                    Color = SKColors.White,
                    IsAntialias = true,
                })
                {
                    using (var shaderX = CreateXGradient(points, serie.Entries, serie.Color, (byte)(LineAreaAlpha * AnimationProgress)))
                        using (var shaderY = CreateYGradient(points, (byte)(LineAreaAlpha * AnimationProgress)))
                        {
                            paint.Shader = EnableYFadeOutGradient ? SKShader.CreateCompose(shaderY, shaderX, SKBlendMode.SrcOut) : shaderX;

                            var path = new SKPath();

                            var     isFirst   = true;
                            var     entries   = serie.Entries;
                            var     lineMode  = LineMode;
                            var     last      = (lineMode == LineMode.Spline) ? points.Length - 1 : points.Length;
                            SKPoint lastPoint = points.First();
                            for (int i = 0; i < last; i++)
                            {
                                if (!entries.ElementAt(i).Value.HasValue)
                                {
                                    continue;
                                }

                                if (isFirst)
                                {
                                    path.MoveTo(points[i].X, origin);
                                    path.LineTo(points[i]);
                                    isFirst = false;
                                }

                                if (lineMode == LineMode.Spline)
                                {
                                    int next = i + 1;
                                    while (next < last && !entries.ElementAt(next).Value.HasValue)
                                    {
                                        next++;
                                    }

                                    if (next == last && !entries.ElementAt(next).Value.HasValue)
                                    {
                                        lastPoint = points[i];
                                        break;
                                    }

                                    var cubicInfo = CalculateCubicInfo(points, i, next, itemSize);
                                    path.CubicTo(cubicInfo.control, cubicInfo.nextControl, cubicInfo.nextPoint);
                                    lastPoint = cubicInfo.nextPoint;
                                }
                                else if (lineMode == LineMode.Straight)
                                {
                                    path.LineTo(points[i]);
                                    lastPoint = points[i];
                                }
                            }

                            path.LineTo(lastPoint.X, origin);
                            path.Close();
                            canvas.DrawPath(path, paint);
                        }
                }
            }
        }
Esempio n. 25
0
        public static Tuple <SKPaint, IEnumerable <IDisposable> > CreatePaint(this XInkStroke stroke, SKPaintStyle paintStyle = SKPaintStyle.Stroke, SKBlendMode blendMode = SKBlendMode.SrcATop)
        {
            if (stroke == null)
            {
                throw new ArgumentNullException(nameof(stroke));
            }

            var disposables = new List <IDisposable>();

            SKShader shader = null;

            if (stroke.DrawingAttributes.Kind == XInkDrawingAttributesKind.Pencil)
            {
                var perlin = SKShader.CreatePerlinNoiseFractalNoise(0.01f, 0.01f, 1, 1.0f);
                var color  = SKShader.CreateColor(stroke.DrawingAttributes.Color.ToSKColor().WithAlpha(0x7F));

                disposables.Add(perlin);
                disposables.Add(color);

                shader = SKShader.CreateCompose(
                    perlin,
                    color,
                    blendMode);
            }

            Tuple <SKPaint, IEnumerable <IDisposable> > tuple = null;
            SKPaint paint = null;

            if (!stroke.DrawingAttributes.IgnorePressure)
            {
                paintStyle = SKPaintStyle.Fill;
            }

            try
            {
                paint = new SKPaint
                {
                    Color       = stroke.DrawingAttributes.Kind == XInkDrawingAttributesKind.Default ? stroke.DrawingAttributes.Color.ToSKColor() : new SKColor(),
                    StrokeWidth = stroke.DrawingAttributes.IgnorePressure? stroke.DrawingAttributes.Size : 0.0f,
                    Style       = paintStyle,
                    IsAntialias = true,
                    StrokeCap   = stroke.DrawingAttributes.PenTip == Inking.XPenTipShape.Circle ? SKStrokeCap.Round : SKStrokeCap.Butt,
                    PathEffect  = SKPathEffect.CreateCorner(100)
                };

                if (shader != null)
                {
                    paint.Shader = shader;
                }

                tuple = Tuple.Create(paint, disposables as IEnumerable <IDisposable>);

                paint = null;
            }
            finally
            {
                paint?.Dispose();
            }

            return(tuple);
        }
Esempio n. 26
0
        internal PaintWrapper CreatePaint(IBrush brush, Size targetSize)
        {
            SKPaint paint = new SKPaint();
            var     rv    = new PaintWrapper(paint);

            paint.IsStroke = false;

            // TODO: SkiaSharp does not contain alpha yet!
            double opacity = brush.Opacity * _currentOpacity;

            //paint.SetAlpha(paint.GetAlpha() * opacity);
            paint.IsAntialias = true;

            SKColor color = new SKColor(255, 255, 255, 255);

            var solid = brush as ISolidColorBrush;

            if (solid != null)
            {
                color = solid.Color.ToSKColor();
            }

            paint.Color = (new SKColor(color.Red, color.Green, color.Blue, (byte)(color.Alpha * opacity)));

            if (solid != null)
            {
                return(rv);
            }

            var gradient = brush as GradientBrush;

            if (gradient != null)
            {
                var tileMode    = gradient.SpreadMethod.ToSKShaderTileMode();
                var stopColors  = gradient.GradientStops.Select(s => s.Color.ToSKColor()).ToArray();
                var stopOffsets = gradient.GradientStops.Select(s => (float)s.Offset).ToArray();

                var linearGradient = brush as LinearGradientBrush;
                if (linearGradient != null)
                {
                    var start = linearGradient.StartPoint.ToPixels(targetSize).ToSKPoint();
                    var end   = linearGradient.EndPoint.ToPixels(targetSize).ToSKPoint();

                    // would be nice to cache these shaders possibly?
                    using (var shader = SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode))
                        paint.Shader = shader;
                }
                else
                {
                    var radialGradient = brush as RadialGradientBrush;
                    if (radialGradient != null)
                    {
                        var center = radialGradient.Center.ToPixels(targetSize).ToSKPoint();
                        var radius = (float)radialGradient.Radius;

                        // TODO: There is no SetAlpha in SkiaSharp
                        //paint.setAlpha(128);

                        // would be nice to cache these shaders possibly?
                        using (var shader = SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode))
                            paint.Shader = shader;
                    }
                }

                return(rv);
            }

            var tileBrush = brush as TileBrush;

            if (tileBrush != null)
            {
                var helper = new TileBrushImplHelper(tileBrush, targetSize);
                var bitmap = new BitmapImpl((int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height);
                rv.AddDisposable(bitmap);
                using (var ctx = bitmap.CreateDrawingContext())
                    helper.DrawIntermediate(ctx);
                SKMatrix         translation = SKMatrix.MakeTranslation(-(float)helper.DestinationRect.X, -(float)helper.DestinationRect.Y);
                SKShaderTileMode tileX       =
                    tileBrush.TileMode == TileMode.None
                        ? SKShaderTileMode.Clamp
                        : tileBrush.TileMode == TileMode.FlipX || tileBrush.TileMode == TileMode.FlipXY
                            ? SKShaderTileMode.Mirror
                            : SKShaderTileMode.Repeat;

                SKShaderTileMode tileY =
                    tileBrush.TileMode == TileMode.None
                        ? SKShaderTileMode.Clamp
                        : tileBrush.TileMode == TileMode.FlipY || tileBrush.TileMode == TileMode.FlipXY
                            ? SKShaderTileMode.Mirror
                            : SKShaderTileMode.Repeat;
                using (var shader = SKShader.CreateBitmap(bitmap.Bitmap, tileX, tileY, translation))
                    paint.Shader = shader;
            }

            return(rv);
        }
Esempio n. 27
0
        private static void DrawBackground(SKCanvas canvas, SKRect rect, SKPath path, LinearGradient linear)
        {
            using (var paint = new SKPaint())
            {
                var rad = Math.PI / 180 * linear.Angle;
                var cx  = rect.MidX;
                var cy  = rect.MidY;
                var tan = (float)Math.Tan(rad);
                var cos = (float)Math.Cos(rad);

                float x1 = 0, y1 = 0, x2 = 0, y2 = 0, px = 0, py = 0;
                if (tan == 0)
                {
                    x1 = rect.Left;
                    y1 = cy;
                    x2 = rect.Right;
                    y2 = cy;
                }
                else if (cos == 0)
                {
                    x1 = cx;
                    y1 = rect.Top;
                    x2 = cx;
                    y2 = rect.Bottom;
                }
                else
                {
                    if (tan > 0 && cos > 0)
                    {
                        px = rect.Right;
                        py = rect.Bottom;
                    }
                    else if (tan > 0 && cos < 0)
                    {
                        px = rect.Left;
                        py = rect.Top;
                    }
                    else if (tan < 0 && cos > 0)
                    {
                        px = rect.Right;
                        py = rect.Top;
                    }
                    else if (tan < 0 && cos < 0)
                    {
                        px = rect.Left;
                        py = rect.Bottom;
                    }
                    var p = (-tan * px + py + tan * cx - cy) / (tan * tan + 1);
                    x1 = p * tan + px;
                    y1 = py - p;
                    x2 = 2 * cx - x1;
                    y2 = 2 * cy - y1;
                }

                paint.Style  = SKPaintStyle.Fill;
                paint.Shader = SKShader.CreateLinearGradient(
                    new SKPoint(x1, y1),
                    new SKPoint(x2, y2),
                    linear.Colors.Select(color => color.ToSK()).ToArray(),
                    linear.ColorPosition.ToArray(), SKShaderTileMode.Repeat);
                canvas.DrawPath(path, paint);
            }
        }
Esempio n. 28
0
        /// <summary>
        /// Configure paint wrapper for using gradient brush.
        /// </summary>
        /// <param name="paintWrapper">Paint wrapper.</param>
        /// <param name="targetSize">Target size.</param>
        /// <param name="gradientBrush">Gradient brush.</param>
        private void ConfigureGradientBrush(ref PaintWrapper paintWrapper, Size targetSize, IGradientBrush gradientBrush)
        {
            var tileMode    = gradientBrush.SpreadMethod.ToSKShaderTileMode();
            var stopColors  = gradientBrush.GradientStops.Select(s => s.Color.ToSKColor()).ToArray();
            var stopOffsets = gradientBrush.GradientStops.Select(s => (float)s.Offset).ToArray();

            switch (gradientBrush)
            {
            case ILinearGradientBrush linearGradient:
            {
                var start = linearGradient.StartPoint.ToPixels(targetSize).ToSKPoint();
                var end   = linearGradient.EndPoint.ToPixels(targetSize).ToSKPoint();

                // would be nice to cache these shaders possibly?
                using (var shader =
                           SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode))
                {
                    paintWrapper.Paint.Shader = shader;
                }

                break;
            }

            case IRadialGradientBrush radialGradient:
            {
                var center = radialGradient.Center.ToPixels(targetSize).ToSKPoint();
                var radius = (float)(radialGradient.Radius * targetSize.Width);

                var origin = radialGradient.GradientOrigin.ToPixels(targetSize).ToSKPoint();

                if (origin.Equals(center))
                {
                    // when the origin is the same as the center the Skia RadialGradient acts the same as D2D
                    using (var shader =
                               SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode))
                    {
                        paintWrapper.Paint.Shader = shader;
                    }
                }
                else
                {
                    // when the origin is different to the center use a two point ConicalGradient to match the behaviour of D2D

                    // reverse the order of the stops to match D2D
                    var reversedColors = new SKColor[stopColors.Length];
                    Array.Copy(stopColors, reversedColors, stopColors.Length);
                    Array.Reverse(reversedColors);

                    // and then reverse the reference point of the stops
                    var reversedStops = new float[stopOffsets.Length];
                    for (var i = 0; i < stopOffsets.Length; i++)
                    {
                        reversedStops[i] = stopOffsets[i];
                        if (reversedStops[i] > 0 && reversedStops[i] < 1)
                        {
                            reversedStops[i] = Math.Abs(1 - stopOffsets[i]);
                        }
                    }

                    // compose with a background colour of the final stop to match D2D's behaviour of filling with the final color
                    using (var shader = SKShader.CreateCompose(
                               SKShader.CreateColor(reversedColors[0]),
                               SKShader.CreateTwoPointConicalGradient(center, radius, origin, 0, reversedColors, reversedStops, tileMode)
                               ))
                    {
                        paintWrapper.Paint.Shader = shader;
                    }
                }

                break;
            }

            case IConicGradientBrush conicGradient:
            {
                var center = conicGradient.Center.ToPixels(targetSize).ToSKPoint();

                // Skia's default is that angle 0 is from the right hand side of the center point
                // but we are matching CSS where the vertical point above the center is 0.
                var angle    = (float)(conicGradient.Angle - 90);
                var rotation = SKMatrix.CreateRotationDegrees(angle, center.X, center.Y);

                using (var shader =
                           SKShader.CreateSweepGradient(center, stopColors, stopOffsets, rotation))
                {
                    paintWrapper.Paint.Shader = shader;
                }

                break;
            }
            }
        }
Esempio n. 29
0
        public void DrawConnector(SKCanvas canvas, float _radX, float _radY)
        {
            float totalFlow     = 0;
            float totalSpO2     = 0;
            float totalSpO2To   = 0;
            float totalSpO2From = 0;
            float currentVolume = 0;
            float radius        = 0;

            scale  = _radX * scaleRelative;
            radius = _radX / 2.5f;

            if (_radX > _radY)
            {
                scale  = _radY * scaleRelative;
                radius = _radY / 2.5f;
            }

            // calculate the total volume and average spO2 if lumping is the case
            foreach (BloodCompartmentConnector c in connectors)
            {
                totalFlow += (float)c.CurrentFlow * Speed;
                if (totalFlow >= 0)
                {
                    totalSpO2 += (float)c.Comp1.TO2;
                    if (NoLoss)
                    {
                        totalSpO2From += (float)c.Comp1.TO2;
                        totalSpO2To   += (float)c.Comp1.TO2;
                    }
                    else
                    {
                        totalSpO2From += (float)c.Comp1.TO2;
                        totalSpO2To   += (float)c.Comp2.TO2;
                    }
                }
                else
                {
                    totalSpO2 += (float)c.Comp2.TO2;
                    if (NoLoss)
                    {
                        totalSpO2From += (float)c.Comp2.TO2;
                        totalSpO2To   += (float)c.Comp2.TO2;
                    }
                    else
                    {
                        totalSpO2From += (float)c.Comp2.TO2;
                        totalSpO2To   += (float)c.Comp1.TO2;
                    }
                }
            }

            colorTo   = AnimatedElementHelper.CalculateBloodColor(totalSpO2To / connectors.Count);
            colorFrom = AnimatedElementHelper.CalculateBloodColor(totalSpO2From / connectors.Count);

            currentAngle += totalFlow * Direction;
            if (Math.Abs(currentAngle) > Math.Abs(StartAngle - EndAngle))
            {
                currentAngle = 0;
            }

            if (sizeCompartment != null)
            {
                currentVolume         = (float)sizeCompartment.VolCurrent;
                circleOut.StrokeWidth = AnimatedElementHelper.RadiusCalculator(currentVolume, scale);
            }
            else
            {
                circleOut.StrokeWidth = 22;
            }


            // calculate position
            locationOrigen = AnimatedElementHelper.GetPosition(StartAngle, radius, RadiusXOffset, RadiusYOffset);
            locationTarget = AnimatedElementHelper.GetPosition(EndAngle, radius, RadiusXOffset, RadiusYOffset);

            float left   = (float)Math.Sin(270 * 0.0174532925) * RadiusXOffset * radius + XOffset;
            float right  = (float)Math.Sin(90 * 0.0174532925) * RadiusXOffset * radius + XOffset;
            float top    = (float)Math.Cos(180 * 0.0174532925) * RadiusYOffset * radius + YOffset;
            float bottom = (float)Math.Cos(0 * 0.0174532925) * RadiusYOffset * radius + YOffset;

            mainRect.Left   = left;
            mainRect.Right  = right;
            mainRect.Top    = top;
            mainRect.Bottom = bottom;


            circleOut.Shader = SKShader.CreateSweepGradient(
                new SKPoint(0f, 0f),
                new SKColor[] { colorFrom, colorTo },
                new float[] { StartAngle / 360f, EndAngle / 360f }
                );

            using (SKPath path = new SKPath())
            {
                path.AddArc(mainRect, StartAngle, Math.Abs(StartAngle - EndAngle));
                canvas.DrawPath(path, circleOut);
            }

            location1 = AnimatedElementHelper.GetPosition(StartAngle + currentAngle, radius, RadiusXOffset, RadiusYOffset);
            canvas.DrawCircle(location1.X + XOffset, location1.Y + YOffset, 10, paint);
        }
Esempio n. 30
0
        public override void Render(IStateOwner pOwner, SKCanvas pRenderTarget, ViewScoreDetailsState Source, GameStateSkiaDrawParameters Element)
        {
            //TODO: finish this!
            var g      = pRenderTarget;
            var Bounds = Element.Bounds;

            //Draw the background first.
            RenderingProvider.Static.DrawElement(pOwner, pRenderTarget, Source.BG, new SkiaBackgroundDrawData(Bounds));

            DrawTextInformationSkia skdraw = new DrawTextInformationSkia()
            {
                ForegroundPaint = new SKPaint()
            };

            float StartY   = (Bounds.Height * 0.175f);
            var   CurrentY = StartY;
            float MiddleX  = Bounds.Width / 2;

            float   TextSize      = Bounds.Height / 30f;
            var     ScoreFont     = TetrisGame.RetroFontSK; //point size 24.
            SKPaint MainScoreFont = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(24 * pOwner.ScaleFactor), Color = SKColors.Black
            };
            SKPaint ShadowScoreFont = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(24 * pOwner.ScaleFactor), Color = SKColors.White
            };
            SKPaint ListingFont = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColors.Black
            };
            float   PercentThroughSecond = (float)DateTime.Now.Millisecond / 1000f;
            SKPaint ListingFontRainbow   = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColor.FromHsl(PercentThroughSecond * 240, 240, 120)
            };
            SKPaint ListingFontShadow = new SKPaint()
            {
                Typeface = ScoreFont, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColors.White
            };
            SKPaint ListingFontArrow = new SKPaint()
            {
                Typeface = TetrisGame.ArialFontSK, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColor.FromHsl(PercentThroughSecond * 240, 240, 120)
            };
            SKPaint ListingFontArrowShadow = new SKPaint()
            {
                Typeface = TetrisGame.ArialFontSK, TextSize = (float)(18 * pOwner.ScaleFactor), Color = SKColors.White
            };
            SKRect resultitem = new SKRect();
            float  LineHeight = MainScoreFont.MeasureText("#", ref resultitem);
            var    useShader  = SKShader.CreateLinearGradient(new SKPoint(0, 0), new SKPoint(0, Bounds.Height), new SKColor[] { SKColors.Red, SKColors.Orange, SKColors.Yellow, SKColors.Green, SKColors.Blue, SKColors.Indigo, SKColors.Violet }, null, SKShaderTileMode.Mirror);

            SKPaint LinePaint = new SKPaint()
            {
                BlendMode = SKBlendMode.ColorBurn, StrokeWidth = 24, Shader = useShader
            };

            g.DrawRect(new SKRect(0, 0, Bounds.Width, Bounds.Height), LinePaint);
            //g.DrawRect(new SKRect((int)(Bounds.Width * (1 / 7)), CurrentY, (float)(Bounds.Width - (Bounds.Width * (1 / 7))), (float)(CurrentY + (LineHeight * 2.5) + (LineHeight * 3) * 12)),LinePaint);



            if (Source.IncrementedDrawState >= 0)
            {
                //draw "SCORE DETAILS"
                String sHeaderText  = "SCORE DETAILS";
                SKRect MeasuredRect = new SKRect();
                MainScoreFont.MeasureText(sHeaderText, ref MeasuredRect);
                SKPoint DrawPosition = new SKPoint(MiddleX - (MeasuredRect.Width / 2), StartY);
                g.DrawText(sHeaderText, new SKPoint(DrawPosition.X + 2, DrawPosition.Y + 2), ShadowScoreFont);
                g.DrawText(sHeaderText, DrawPosition, MainScoreFont);
                CurrentY = StartY + MeasuredRect.Height + 10;
            }

            if (Source.IncrementedDrawState >= 1)
            {
                //maybe a line under the header.
            }

            if (Source.IncrementedDrawState >= 2)
            {
                switch (Source.CurrentView)
                {
                case ViewScoreDetailsState.ViewScoreDetailsType.Details_Tetrominoes:
                    DrawTetronimoDetails(Source, g, Bounds, CurrentY);
                    break;

                case ViewScoreDetailsState.ViewScoreDetailsType.Details_LevelTimes:
                    DrawLevelTimesDetails(Source, g, Bounds, CurrentY);
                    break;
                }
                //draw the high score listing entries.
                //iterate from 2 to drawstate and draw the high score at position drawstate-2.

                /*for (int scoreiterate = 2; scoreiterate < Source.IncrementedDrawState; scoreiterate++)
                 * {
                 *  int CurrentScoreIndex = scoreiterate - 2;
                 *  int CurrentScorePosition = CurrentScoreIndex + 1;
                 *  double useYPosition = StartY + (LineHeight * 2.5) + (LineHeight * 3) * CurrentScoreIndex;
                 *  double useXPosition = Bounds.Width * 0.19d;
                 *  String sUseName = "N/A";
                 *  int sUseScore = 0;
                 *  IHighScoreEntry currentScore = Source.hs.Count > CurrentScoreIndex ? Source.hs[CurrentScoreIndex] : null;
                 *  if (currentScore != null)
                 *  {
                 *      sUseName = currentScore.Name;
                 *      sUseScore = currentScore.Score;
                 *  }
                 *  SKRect MeasureName = new SKRect(), MeasureScore = new SKRect();
                 *  ListingFont.MeasureText(sUseName, ref MeasureName);
                 *  ListingFont.MeasureText(sUseScore.ToString(), ref MeasureScore);
                 *  float PosXPosition = Bounds.Width * 0.1f;
                 *  float NameXPosition = Bounds.Width * 0.20f;
                 *  float ScoreXPositionRight = Bounds.Width * (1 - 0.10f);
                 *  var useForegroundPaint = Source.HighlightedScorePositions.Contains(CurrentScorePosition) ? ListingFontRainbow : ListingFont;
                 *
                 *  //draw position
                 *  g.DrawText(CurrentScorePosition.ToString() + ".", new SKPoint(PosXPosition + 2, (float)useYPosition + 2), ListingFontShadow);
                 *  g.DrawText(CurrentScorePosition.ToString() + ".", new SKPoint(PosXPosition, (float)useYPosition), useForegroundPaint);
                 *  //draw high score name
                 *  g.DrawText(sUseName, new SKPoint(PosXPosition + 2 + Math.Abs(resultitem.Height) * 2.25f, (float)useYPosition + 2), ListingFontShadow);
                 *  g.DrawText(sUseName, new SKPoint(PosXPosition + Math.Abs(resultitem.Height) * 2.25f, (float)useYPosition), useForegroundPaint);
                 *
                 *  //draw the high score
                 *  float ScoreXPosition = ScoreXPositionRight - MeasureScore.Width;
                 *
                 *  g.DrawText(sUseScore.ToString(), new SKPoint(ScoreXPosition + 2, (float)useYPosition + 2), ListingFontShadow);
                 *  g.DrawText(sUseScore.ToString(), new SKPoint(ScoreXPosition, (float)useYPosition), useForegroundPaint);
                 *  useForegroundPaint.StrokeWidth = 6;
                 *
                 *  g.DrawLine(new SKPoint(NameXPosition + MeasureName.Width + 15, (float)useYPosition + LineHeight / 2), new SKPoint(ScoreXPosition - 15, (float)useYPosition + LineHeight / 2), useForegroundPaint);
                 *
                 *  if (Source.SelectedScorePosition == CurrentScoreIndex)
                 *  {
                 *      //draw selection indicator if needed
                 *      SKRect MeasureArrow = new SKRect();
                 *      useForegroundPaint.MeasureText(PointerText, ref MeasureArrow);
                 *      float ArrowX = PosXPosition - MeasureArrow.Width - 5;
                 *      float ArrowY = (float)useYPosition;
                 *      g.DrawText(PointerText, new SKPoint(ArrowX + 2, ArrowY + 2), ListingFontArrowShadow);
                 *      g.DrawText(PointerText, new SKPoint(ArrowX, ArrowY), ListingFontArrow);
                 *  }
                 * }*/
            }

            /*
             *
             * Font HeaderFont = TetrisGame.GetRetroFont(24, pOwner.ScaleFactor);
             * Font PlacementFont = TetrisGame.GetRetroFont(10, pOwner.ScaleFactor);
             * Font DetailFont = TetrisGame.GetRetroFont(8, pOwner.ScaleFactor);
             *
             *
             * //One thing we draw in every case is the "--SCORE DETAILS--" header text. this is positioned at 5% from the top, centered in the middle of our bounds.
             * float Millipercent = (float)DateTime.Now.Ticks / 5000f; //(float)DateTime.Now.Millisecond / 1000;
             *
             * var MeasuredHeader = g.MeasureString(Source._DetailHeader, HeaderFont);
             * int RotateAmount = (int)(Millipercent * 240);
             * Color UseColor1 = HSLColor.RotateHue(Color.Red, RotateAmount);
             * Color UseColor2 = HSLColor.RotateHue(Color.LightPink, RotateAmount);
             * PointF ScorePosition = new PointF((Bounds.Width / 2) - (MeasuredHeader.Width / 2), Bounds.Height * 0.05f);
             * using (LinearGradientBrush lgb = new LinearGradientBrush(new Rectangle(0, 0, (int)MeasuredHeader.Width, (int)MeasuredHeader.Height), UseColor1, UseColor2, LinearGradientMode.Vertical))
             * {
             *  using (GraphicsPath gp = new GraphicsPath())
             *  {
             *      gp.AddString(Source._DetailHeader, HeaderFont, new Point((int)ScorePosition.X, (int)ScorePosition.Y), StringFormat.GenericDefault);
             *      g.FillPath(lgb, gp);
             *      g.DrawPath(Pens.White, gp);
             *  }
             * }
             *
             * //we also show Xth Place - <NAME> centered below the header using the placementfont.
             * String sPlacement = TetrisGame.FancyNumber(Source._Position) + " - " + Source.ShowEntry.Name + " - " + Source.ShowEntry.Score.ToString();
             *
             * var measureit = g.MeasureString(sPlacement, PlacementFont);
             *
             * PointF DrawPlacement = new PointF(Bounds.Width / 2 - measureit.Width / 2, (float)(ScorePosition.Y + MeasuredHeader.Height * 1.1f));
             *
             * g.DrawString(sPlacement, PlacementFont, Brushes.Black, DrawPlacement.X + 3, DrawPlacement.Y + 3);
             * g.DrawString(sPlacement, PlacementFont, Brushes.White, DrawPlacement.X, DrawPlacement.Y);
             *
             * g.DrawLine(Separator, (float)(Bounds.Width * 0.05f), (float)(DrawPlacement.Y + measureit.Height + 5), (float)(Bounds.Width * 0.95), (float)(DrawPlacement.Y + measureit.Height + 5));
             *
             *
             * switch (Source.CurrentView)
             * {
             *  case ViewScoreDetailsState.ViewScoreDetailsType.Details_Tetrominoes:
             *      DrawTetronimoDetails(Source, g, Bounds);
             *      break;
             *  case ViewScoreDetailsState.ViewScoreDetailsType.Details_LevelTimes:
             *      DrawLevelTimesDetails(Source, g, Bounds);
             *      break;
             * }
             */
        }